bern_arch/cortex_m/
startup.rs

1//! ARM Cortex-M implementation of [`IStartup`].
2
3use crate::arch::Arch;
4use crate::startup::Region;
5use crate::IStartup;
6use core::arch::asm;
7
8extern "C" {
9    static mut __smkernel: usize;
10    static mut __emkernel: usize;
11    static __sikernel: usize;
12
13    static mut __shkernel: usize;
14    static mut __ehkernel: usize;
15}
16
17impl IStartup for Arch {
18    fn init_static_region(mut region: Region) {
19        unsafe {
20            let mut start = region.start as *mut u32;
21            let end = region.end as *mut u32;
22            let mut data = match region.data {
23                None => return,
24                Some(d) => d,
25            } as *const u32;
26
27            asm!(
28                "0:
29                  cmp r1, r0
30                  beq 1f
31                  ldm r2!, {{r3}}
32                  stm r0!, {{r3}}
33                  b   0b
34                1:",
35                in("r0") start,
36                in("r1") end,
37                in("r2") data
38            )
39        }
40    }
41
42    fn kernel_data() -> Region {
43        unsafe {
44            Region {
45                start: &__smkernel as *const _,
46                end: &__emkernel as *const _,
47                data: Some(&__sikernel as *const _),
48            }
49        }
50    }
51
52    fn kernel_heap() -> Region {
53        unsafe {
54            Region {
55                start: &__shkernel as *const _,
56                end: &__ehkernel as *const _,
57                data: None,
58            }
59        }
60    }
61}