Skip to content

Commit 23ec0f6

Browse files
committed
chore: add v2p and p2v conversion wrt. id mapping
Also renamed a few symbols to avoid confusion.
1 parent 6ddb7ff commit 23ec0f6

File tree

7 files changed

+69
-32
lines changed

7 files changed

+69
-32
lines changed

boot/startup-x86_64.s

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ MAX_MEM: equ 512
3131
[GLOBAL mb_info_addr]
3232
; functions from other parts of rustubs
3333
; NOTE: this are all from 64bit code, so do not use them in 32bit assembly
34-
[EXTERN ___BSS_PM_START__]
35-
[EXTERN ___BSS_PM_END__]
34+
[EXTERN ___BSS_START__]
35+
[EXTERN ___BSS_END__]
3636
[EXTERN KERNEL_OFFSET]
3737
[EXTERN _entry]
3838
; =============================================================================
@@ -170,8 +170,8 @@ fill_kvma2:
170170
jne fill_kvma2
171171
; done :-)
172172
; clear BSS section for the rust code.
173-
mov rdi, ___BSS_PM_START__
174-
mov rax, ___BSS_PM_END__
173+
mov rdi, ___BSS_START__
174+
mov rax, ___BSS_END__
175175
clear_bss:
176176
; clear the BSS section before going to rust code
177177
; TODO speed this up by clearing 8 bytes at once. Alignment should be taken

defs/x86_64-hm-linker.ld

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ SECTIONS
9393

9494
.bss : AT(ADDR(.bss) - KERNEL_OFFSET)
9595
{
96-
PROVIDE (___BSS_PM_START__ = .);
96+
PROVIDE (___BSS_START__ = .);
9797
*(".bss")
9898
*(".bss.*")
99-
PROVIDE (___BSS_PM_END__ = .);
99+
PROVIDE (___BSS_END__ = .);
100100
}
101101

102102
.rodata : AT(ADDR(.rodata) - KERNEL_OFFSET)

defs/x86_64-linker.ld

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ SECTIONS
7171

7272
.bss :
7373
{
74-
PROVIDE (___BSS_PM_START__ = .);
74+
PROVIDE (___BSS_START__ = .);
7575
*(".bss")
7676
*(".bss.*")
77-
PROVIDE (___BSS_PM_END__ = .);
77+
PROVIDE (___BSS_END__ = .);
7878
}
7979

8080
/* global page table for 64-bit long mode */

src/arch/x86_64/interrupt/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ pub mod pit;
33
use crate::io::*;
44
use core::arch::asm;
55
use core::slice;
6-
6+
// TODO use P2V for extern symbol addresses
77
// number of entries in IDT
88
pub const IDT_CAPACITY: usize = 256;
99
// size of interrupt handler wrapper routine (vector)

src/defs.rs

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,46 @@
33
extern "C" {
44
fn ___KERNEL_PM_START__();
55
fn ___KERNEL_PM_END__();
6-
fn ___BSS_PM_START__();
7-
fn ___BSS_PM_END__();
6+
fn ___BSS_START__();
7+
fn ___BSS_END__();
88
}
99

10+
#[inline]
1011
pub fn pmap_kernel_start() -> u64 {
11-
return ___KERNEL_PM_START__ as u64;
12+
___KERNEL_PM_START__ as u64
1213
}
1314

15+
#[inline]
1416
pub fn pmap_kernel_end() -> u64 {
15-
return ___KERNEL_PM_END__ as u64;
17+
___KERNEL_PM_END__ as u64
1618
}
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;
1933
}
2034

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;
2338
}
2439

40+
#[inline]
2541
pub fn roundup_4k(addr: u64) -> u64 {
2642
return (addr + 0xfff) & !0xfff;
2743
}
2844

45+
#[inline]
2946
pub fn rounddown_4k(addr: u64) -> u64 {
3047
return addr & !0xfff;
3148
}
@@ -55,11 +72,30 @@ impl Mem {
5572
// memory (37268) 4k pages, 37268 bits are needed, hence
5673
// 4096 bytes, exactly one page!
5774
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);
5892
}
5993

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+
}

src/lib.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use arch::x86_64::interrupt;
1414
use arch::x86_64::interrupt::pic_8259;
1515
use arch::x86_64::interrupt::pic_8259::PicDeviceInt;
1616
use core::panic::PanicInfo;
17+
use defs::*;
1718
use machine::cgascr::CGAScreen;
1819
use machine::multiboot;
1920

@@ -33,7 +34,7 @@ pub extern "C" fn _entry() -> ! {
3334
let mbi = multiboot::get_mb_info().expect("bad multiboot info flags");
3435
let mem = unsafe { mbi.get_mem() }.unwrap();
3536
println!(
36-
"available memory: lower {:#X} KiB, upper:{:#X} KiB",
37+
"[init] available memory: lower {:#X} KiB, upper:{:#X} KiB",
3738
mem.lower(),
3839
mem.upper()
3940
);
@@ -43,14 +44,14 @@ pub extern "C" fn _entry() -> ! {
4344
interrupt::interrupt_enable();
4445

4546
println!(
46-
"kernel: {:#X} - {:#X}",
47-
defs::pmap_kernel_start(),
48-
defs::pmap_kernel_end()
47+
"[init] kernel mapped @ {:#X} - {:#X}",
48+
vmap_kernel_start(),
49+
vmap_kernel_end(),
4950
);
5051
println!(
51-
" BSS: {:#X} - {:#X}",
52-
defs::pmap_bss_start(),
53-
defs::pmap_bss_end()
52+
"[init] BSS mapped @ {:#X} - {:#X}",
53+
bss_start(),
54+
bss_end()
5455
);
5556

5657
// io::print_welcome();

src/mm/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ pub fn init() {
4141
}
4242

4343
println!(
44-
"pma init: kernel mapped at {:#X} - {:#X}",
44+
"[init] pma: kernel loaded at phy: {:#X} - {:#X}",
4545
pmap_kernel_start(),
4646
pmap_kernel_end()
4747
);
4848
println!(
49-
"pma init: {:#X}KiB free memory, {:#X} pages",
49+
"[init] pma: {:#X} KiB free memory, {:#X} frames inserted",
5050
inserted * 0x4,
5151
inserted,
5252
);

0 commit comments

Comments
 (0)