Created
November 20, 2020 23:01
-
-
Save skoe/6d1dd6262051943a55525d86e028503f to your computer and use it in GitHub Desktop.
Pure Rust Start-Up Code w/o Pointer Provenance issues?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#[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