blob: 3724c4180511b85e91d19059abbd6aee93b52c10 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
// exported symbols from asm/linker.
// They are always unsafe.
extern "C" {
fn ___KERNEL_START__();
fn ___KERNEL_END__();
fn ___BSS_START__();
fn ___BSS_END__();
}
pub fn pmap_kernel_start() -> u64 {
return ___KERNEL_START__ as u64;
}
pub fn pmap_kernel_end() -> u64 {
return ___KERNEL_END__ as u64;
}
pub fn pmap_bss_start() -> u64 {
return ___BSS_START__ as u64;
}
pub fn pmap_bss_end() -> u64 {
return ___BSS_END__ as u64;
}
pub struct Mem;
pub struct VAddr(u64);
#[derive(Debug)]
pub struct Range {
pub addr: u64,
pub len: u64,
}
pub fn roundup_4k(addr: u64) -> u64 {
return (addr + 0x1000) & 0xffff_ffff_ffff_0000;
}
pub fn rounddown_4k(addr: u64) -> u64 {
return addr & 0xffff_ffff_ffff_0000;
}
impl Range {
pub fn contains(&self, addr: u64) -> bool {
return self.addr <= addr && addr < self.addr + self.len;
}
}
impl Mem {
// units
pub const K: u64 = 1024;
pub const M: u64 = 1024 * Mem::K;
pub const G: u64 = 1024 * Mem::M;
// physical memory layout: qemu defaults to 128 MiB phy Memory
pub const PHY_TOP: u64 = 128 * Mem::M;
// 4 lv 4K paging
pub const PAGE_SIZE: u64 = 0x1000;
pub const PAGE_SHIFT: u64 = 12;
pub const PAGE_MASK: u64 = 0xfff;
pub const L0_SHIFT: u8 = 39;
pub const L0_MASK: u64 = 0x1ff << Mem::L0_SHIFT;
pub const L1_SHIFT: u8 = 30;
pub const L1_MASK: u64 = 0x1ff << Mem::L1_SHIFT;
pub const L2_SHIFT: u8 = 21;
pub const L2_MASK: u64 = 0x1ff << Mem::L2_SHIFT;
pub const L3_SHIFT: u8 = 12;
pub const L3_MASK: u64 = 0x1ff << Mem::L3_SHIFT;
pub const PHY_PAGES: u64 = Mem::PHY_TOP >> Mem::PAGE_SHIFT;
// size of frame allocator bitmap: number of physical frames / 8 for 128M
// memory (37268) 4k pages, 37268 bits are needed, hence
// 4096 bytes, exactly one page!
pub const PHY_BM_SIZE: u64 = Mem::PHY_PAGES >> 3;
}
impl VAddr {
pub fn roundup_4k(&self) {
todo!()
}
pub fn rounddown_4k(&self) {
todo!()
}
pub fn page_number(&self) -> u64 {
self.0 >> Mem::PAGE_SHIFT
}
}
// PHY_TOP 128M
// ~ free frames
// PMA::bitmap + PHY_BM_SIZE
// ~ ___KERNEL_END__
// KERNEL IMAGE
// KERNEL START 1 M
|