diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2022-12-12 20:38:24 -0700 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2022-12-12 20:38:54 -0700 |
commit | ef3a1919ce5c87179e8f1d7a3b1b835151fdf50f (patch) | |
tree | 600a70a334df03ebbaa2c7928ff0863e3ca614a0 /src | |
download | stm32l4-rust-ef3a1919ce5c87179e8f1d7a3b1b835151fdf50f.tar.gz stm32l4-rust-ef3a1919ce5c87179e8f1d7a3b1b835151fdf50f.tar.bz2 stm32l4-rust-ef3a1919ce5c87179e8f1d7a3b1b835151fdf50f.zip |
Start writing bare-metal stm32 kernel in rust
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..a3e8071 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,61 @@ +#![no_main] +#![no_std] + +use core::panic::PanicInfo; + +#[link_section = ".on_reset"] +#[no_mangle] +pub static __RESET_VECTOR: fn() -> ! = on_reset; + +#[no_mangle] +pub static mut DEADBEEF: u32 = 0xdeadbeef; +pub static mut OTHER: u32 = 0; + +/** Load into the data segments */ +pub fn load_data_segments() -> () { + extern "C" { + static mut __data_load: u32; + static mut __data_store_start: u32; + static mut __data_store_end: u32; + static mut __bss_start: u32; + static mut __bss_end: u32; + } + + unsafe { + let mut data_load_addr: *mut u32 = &mut __data_load; + let mut store_cursor: *mut u32 = &mut __data_store_start; + let data_store_end_addr: *mut u32 = &mut __data_store_end; + + while store_cursor < data_store_end_addr { + store_cursor.write_volatile(*data_load_addr); + data_load_addr = data_load_addr.offset(1); + store_cursor = store_cursor.offset(1); + } + + let bss_end: *mut u32 = &mut __bss_end; + let mut bss_cursor: *mut u32 = &mut __bss_start; + + while bss_cursor < bss_end { + bss_cursor.write_volatile(0); + bss_cursor = bss_cursor.offset(1); + } + } + + return; +} + +pub fn on_reset() -> ! { + load_data_segments(); + + unsafe { + DEADBEEF += 100; + OTHER = DEADBEEF; + } + + loop {} +} + +#[panic_handler] +fn panic(_info: &PanicInfo) -> ! { + loop {} +} |