|
3 | 3 | extern "C" {
|
4 | 4 | fn ___KERNEL_PM_START__();
|
5 | 5 | fn ___KERNEL_PM_END__();
|
6 |
| - fn ___BSS_PM_START__(); |
7 |
| - fn ___BSS_PM_END__(); |
| 6 | + fn ___BSS_START__(); |
| 7 | + fn ___BSS_END__(); |
8 | 8 | }
|
9 | 9 |
|
| 10 | +#[inline] |
10 | 11 | pub fn pmap_kernel_start() -> u64 {
|
11 |
| - return ___KERNEL_PM_START__ as u64; |
| 12 | + ___KERNEL_PM_START__ as u64 |
12 | 13 | }
|
13 | 14 |
|
| 15 | +#[inline] |
14 | 16 | pub fn pmap_kernel_end() -> u64 {
|
15 |
| - return ___KERNEL_PM_END__ as u64; |
| 17 | + ___KERNEL_PM_END__ as u64 |
16 | 18 | }
|
17 |
| -pub fn pmap_bss_start() -> u64 { |
18 |
| - return ___BSS_PM_START__ as u64; |
| 19 | + |
| 20 | +#[inline] |
| 21 | +pub fn vmap_kernel_start() -> u64 { |
| 22 | + pmap_kernel_start() + Mem::KERNEL_OFFSET |
| 23 | +} |
| 24 | + |
| 25 | +#[inline] |
| 26 | +pub fn vmap_kernel_end() -> u64 { |
| 27 | + pmap_kernel_end() + Mem::KERNEL_OFFSET |
| 28 | +} |
| 29 | + |
| 30 | +#[inline] |
| 31 | +pub fn bss_start() -> u64 { |
| 32 | + return ___BSS_START__ as u64; |
19 | 33 | }
|
20 | 34 |
|
21 |
| -pub fn pmap_bss_end() -> u64 { |
22 |
| - return ___BSS_PM_END__ as u64; |
| 35 | +#[inline] |
| 36 | +pub fn bss_end() -> u64 { |
| 37 | + return ___BSS_END__ as u64; |
23 | 38 | }
|
24 | 39 |
|
| 40 | +#[inline] |
25 | 41 | pub fn roundup_4k(addr: u64) -> u64 {
|
26 | 42 | return (addr + 0xfff) & !0xfff;
|
27 | 43 | }
|
28 | 44 |
|
| 45 | +#[inline] |
29 | 46 | pub fn rounddown_4k(addr: u64) -> u64 {
|
30 | 47 | return addr & !0xfff;
|
31 | 48 | }
|
@@ -55,11 +72,30 @@ impl Mem {
|
55 | 72 | // memory (37268) 4k pages, 37268 bits are needed, hence
|
56 | 73 | // 4096 bytes, exactly one page!
|
57 | 74 | pub const PHY_BM_SIZE: u64 = Mem::PHY_PAGES >> 3;
|
| 75 | + pub const ID_MAP_START: u64 = 0xffff_8000_0000_0000; |
| 76 | + pub const ID_MAP_END: u64 = 0xffff_8010_0000_0000; |
| 77 | + pub const KERNEL_OFFSET: u64 = 0xffff_8020_0000_0000; |
| 78 | + // 64 GiB available memory |
| 79 | + pub const MAX_PHY_MEM: u64 = 0x1000000000; |
| 80 | +} |
| 81 | + |
| 82 | +// convert VA <-> PA wrt. the kernel id mapping |
| 83 | +// from 0xffff_8000_0000_0000 ~ 0xffff_800f_ffff_ffff virtual |
| 84 | +// to 0x0 ~ 0xf_ffff_ffff physical (64G) |
| 85 | +#[allow(non_snake_case)] |
| 86 | +#[inline] |
| 87 | +pub fn V2P(va: u64) -> Option<u64> { |
| 88 | + if va >= Mem::ID_MAP_END || va < Mem::ID_MAP_START { |
| 89 | + return None; |
| 90 | + } |
| 91 | + return Some(va - Mem::ID_MAP_START); |
58 | 92 | }
|
59 | 93 |
|
60 |
| -// PHY_TOP 128M |
61 |
| -// ~ free frames |
62 |
| -// PMA::bitmap + PHY_BM_SIZE |
63 |
| -// ~ ___KERNEL_END__ |
64 |
| -// KERNEL IMAGE |
65 |
| -// KERNEL START 1 M |
| 94 | +#[allow(non_snake_case)] |
| 95 | +#[inline] |
| 96 | +pub fn P2V(pa: u64) -> Option<u64> { |
| 97 | + if pa >= Mem::MAX_PHY_MEM { |
| 98 | + return None; |
| 99 | + } |
| 100 | + return Some(pa + Mem::ID_MAP_START); |
| 101 | +} |
0 commit comments