Skip to content

Instantly share code, notes, and snippets.

@skoe
Created November 20, 2020 23:01
Show Gist options
  • Save skoe/6d1dd6262051943a55525d86e028503f to your computer and use it in GitHub Desktop.
Save skoe/6d1dd6262051943a55525d86e028503f to your computer and use it in GitHub Desktop.
Pure Rust Start-Up Code w/o Pointer Provenance issues?
#[no_mangle]
pub unsafe extern "C" fn ResetHandler() -> ! {
run();
loop {}
}
pub unsafe fn run() {
extern "C" {
static mut _sbss: u32;
static mut _ebss: u32;
static mut _sdata: u32;
static mut _edata: u32;
static _sidata: u32;
}
let sbss = &_sbss as *const _ as usize;
let ebss = &_ebss as *const _ as usize;
let bss_size = (ebss - sbss) / mem::size_of::<u32>();
let bss = slice::from_raw_parts_mut(&mut _sbss as *mut u32, bss_size);
for i in bss {
*i = 0;
}
let sdata = &_sdata as *const _ as usize;
let edata = &_edata as *const _ as usize;
let data_size = (edata - sdata) / mem::size_of::<u32>();
let data = slice::from_raw_parts_mut(&mut _sdata as *mut u32, data_size);
let idata = slice::from_raw_parts(&_sidata as *const u32, data_size);
data.copy_from_slice(idata);
main()
}
pub fn main() {
loop {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment