bern_arch/cortex_m/
startup.rs1use 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}