forked from M-Labs/artiq
firmware: eliminate most transmutes and document the rest. NFC.
This commit is contained in:
parent
7ad54e1dcf
commit
73c76ebb9a
|
@ -409,7 +409,7 @@ static mut INFLIGHT: ExceptionInfo = ExceptionInfo {
|
||||||
#[export_name="__artiq_raise"]
|
#[export_name="__artiq_raise"]
|
||||||
#[unwind]
|
#[unwind]
|
||||||
pub unsafe extern fn raise(exception: *const Exception) -> ! {
|
pub unsafe extern fn raise(exception: *const Exception) -> ! {
|
||||||
// Zing! The Exception<'a> as Exception<'static> cast is not really sound in case
|
// Zing! The Exception<'a> to Exception<'static> transmute is not really sound in case
|
||||||
// the exception is ever captured. Fortunately, they currently aren't, and we save
|
// the exception is ever captured. Fortunately, they currently aren't, and we save
|
||||||
// on the hassle of having to allocate exceptions somewhere except on stack.
|
// on the hassle of having to allocate exceptions somewhere except on stack.
|
||||||
INFLIGHT.exception = Some(mem::transmute::<Exception, Exception<'static>>(*exception));
|
INFLIGHT.exception = Some(mem::transmute::<Exception, Exception<'static>>(*exception));
|
||||||
|
|
|
@ -34,7 +34,7 @@ fn send(request: &Message) {
|
||||||
|
|
||||||
fn recv<R, F: FnOnce(&Message) -> R>(f: F) -> R {
|
fn recv<R, F: FnOnce(&Message) -> R>(f: F) -> R {
|
||||||
while mailbox::receive() == 0 {}
|
while mailbox::receive() == 0 {}
|
||||||
let result = f(unsafe { mem::transmute::<usize, &Message>(mailbox::receive()) });
|
let result = f(unsafe { &*(mailbox::receive() as *const Message) });
|
||||||
mailbox::acknowledge();
|
mailbox::acknowledge();
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@ extern crate log;
|
||||||
extern crate log_buffer;
|
extern crate log_buffer;
|
||||||
extern crate board;
|
extern crate board;
|
||||||
|
|
||||||
use core::{mem, ptr};
|
|
||||||
use core::cell::{Cell, RefCell};
|
use core::cell::{Cell, RefCell};
|
||||||
use core::fmt::Write;
|
use core::fmt::Write;
|
||||||
use log::{Log, LogMetadata, LogRecord, LogLevelFilter, MaxLogLevelFilter};
|
use log::{Log, LogMetadata, LogRecord, LogLevelFilter, MaxLogLevelFilter};
|
||||||
|
@ -43,12 +42,12 @@ impl BufferLogger {
|
||||||
f();
|
f();
|
||||||
log::shutdown_logger_raw().unwrap();
|
log::shutdown_logger_raw().unwrap();
|
||||||
unsafe {
|
unsafe {
|
||||||
LOGGER = ptr::null();
|
LOGGER = 0 as *const _;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with<R, F: FnOnce(&BufferLogger) -> R>(f: F) -> R {
|
pub fn with<R, F: FnOnce(&BufferLogger) -> R>(f: F) -> R {
|
||||||
f(unsafe { mem::transmute::<*const BufferLogger, &BufferLogger>(LOGGER) })
|
f(unsafe { &*LOGGER })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clear(&self) {
|
pub fn clear(&self) {
|
||||||
|
|
|
@ -150,7 +150,7 @@ fn kern_recv_notrace<R, F>(io: &Io, f: F) -> io::Result<R>
|
||||||
return Err(io::Error::new(io::ErrorKind::InvalidData, message))
|
return Err(io::Error::new(io::ErrorKind::InvalidData, message))
|
||||||
}
|
}
|
||||||
|
|
||||||
f(unsafe { mem::transmute::<usize, &kern::Message>(mailbox::receive()) })
|
f(unsafe { &*(mailbox::receive() as *const kern::Message) })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn kern_recv_dotrace(reply: &kern::Message) {
|
fn kern_recv_dotrace(reply: &kern::Message) {
|
||||||
|
@ -445,6 +445,8 @@ fn process_kern_message(io: &Io, mut stream: Option<&mut TcpStream>,
|
||||||
&kern::CacheGetRequest { key } => {
|
&kern::CacheGetRequest { key } => {
|
||||||
let value = session.congress.cache.get(key);
|
let value = session.congress.cache.get(key);
|
||||||
kern_send(io, &kern::CacheGetReply {
|
kern_send(io, &kern::CacheGetReply {
|
||||||
|
// Zing! This transmute is only safe because we dynamically track
|
||||||
|
// whether the kernel has borrowed any values from the cache.
|
||||||
value: unsafe { mem::transmute::<*const [i32], &'static [i32]>(value) }
|
value: unsafe { mem::transmute::<*const [i32], &'static [i32]>(value) }
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue