aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTianhao Wang <shrik3@mailbox.org>2024-06-04 19:32:32 +0200
committerTianhao Wang <shrik3@mailbox.org>2024-06-11 15:17:12 +0200
commit23ec0f61a7a115753148e3688e81567867f65c70 (patch)
treeb73e69bde0f887df1ea0885363c51a63d3ea8424
parent6ddb7ff5e4edd749051fe624f018c33cf776c749 (diff)
chore: add v2p and p2v conversion wrt. id mapping
Also renamed a few symbols to avoid confusion.
-rw-r--r--boot/startup-x86_64.s8
-rw-r--r--defs/x86_64-hm-linker.ld4
-rw-r--r--defs/x86_64-linker.ld4
-rw-r--r--src/arch/x86_64/interrupt/mod.rs2
-rw-r--r--src/defs.rs64
-rw-r--r--src/lib.rs15
-rw-r--r--src/mm/mod.rs4
7 files changed, 69 insertions, 32 deletions
diff --git a/boot/startup-x86_64.s b/boot/startup-x86_64.s
index b6b3b2e..5bba95f 100644
--- a/boot/startup-x86_64.s
+++ b/boot/startup-x86_64.s
@@ -31,8 +31,8 @@ MAX_MEM: equ 512
[GLOBAL mb_info_addr]
; functions from other parts of rustubs
; NOTE: this are all from 64bit code, so do not use them in 32bit assembly
-[EXTERN ___BSS_PM_START__]
-[EXTERN ___BSS_PM_END__]
+[EXTERN ___BSS_START__]
+[EXTERN ___BSS_END__]
[EXTERN KERNEL_OFFSET]
[EXTERN _entry]
; =============================================================================
@@ -170,8 +170,8 @@ fill_kvma2:
jne fill_kvma2
; done :-)
; clear BSS section for the rust code.
- mov rdi, ___BSS_PM_START__
- mov rax, ___BSS_PM_END__
+ mov rdi, ___BSS_START__
+ mov rax, ___BSS_END__
clear_bss:
; clear the BSS section before going to rust code
; TODO speed this up by clearing 8 bytes at once. Alignment should be taken
diff --git a/defs/x86_64-hm-linker.ld b/defs/x86_64-hm-linker.ld
index 0c97b55..563940e 100644
--- a/defs/x86_64-hm-linker.ld
+++ b/defs/x86_64-hm-linker.ld
@@ -93,10 +93,10 @@ SECTIONS
.bss : AT(ADDR(.bss) - KERNEL_OFFSET)
{
- PROVIDE (___BSS_PM_START__ = .);
+ PROVIDE (___BSS_START__ = .);
*(".bss")
*(".bss.*")
- PROVIDE (___BSS_PM_END__ = .);
+ PROVIDE (___BSS_END__ = .);
}
.rodata : AT(ADDR(.rodata) - KERNEL_OFFSET)
diff --git a/defs/x86_64-linker.ld b/defs/x86_64-linker.ld
index 6be14cb..f22f5ad 100644
--- a/defs/x86_64-linker.ld
+++ b/defs/x86_64-linker.ld
@@ -71,10 +71,10 @@ SECTIONS
.bss :
{
- PROVIDE (___BSS_PM_START__ = .);
+ PROVIDE (___BSS_START__ = .);
*(".bss")
*(".bss.*")
- PROVIDE (___BSS_PM_END__ = .);
+ PROVIDE (___BSS_END__ = .);
}
/* global page table for 64-bit long mode */
diff --git a/src/arch/x86_64/interrupt/mod.rs b/src/arch/x86_64/interrupt/mod.rs
index ae2847a..6591bde 100644
--- a/src/arch/x86_64/interrupt/mod.rs
+++ b/src/arch/x86_64/interrupt/mod.rs
@@ -3,7 +3,7 @@ pub mod pit;
use crate::io::*;
use core::arch::asm;
use core::slice;
-
+// TODO use P2V for extern symbol addresses
// number of entries in IDT
pub const IDT_CAPACITY: usize = 256;
// size of interrupt handler wrapper routine (vector)
diff --git a/src/defs.rs b/src/defs.rs
index a89a6c7..af05da5 100644
--- a/src/defs.rs
+++ b/src/defs.rs
@@ -3,29 +3,46 @@
extern "C" {
fn ___KERNEL_PM_START__();
fn ___KERNEL_PM_END__();
- fn ___BSS_PM_START__();
- fn ___BSS_PM_END__();
+ fn ___BSS_START__();
+ fn ___BSS_END__();
}
+#[inline]
pub fn pmap_kernel_start() -> u64 {
- return ___KERNEL_PM_START__ as u64;
+ ___KERNEL_PM_START__ as u64
}
+#[inline]
pub fn pmap_kernel_end() -> u64 {
- return ___KERNEL_PM_END__ as u64;
+ ___KERNEL_PM_END__ as u64
}
-pub fn pmap_bss_start() -> u64 {
- return ___BSS_PM_START__ as u64;
+
+#[inline]
+pub fn vmap_kernel_start() -> u64 {
+ pmap_kernel_start() + Mem::KERNEL_OFFSET
+}
+
+#[inline]
+pub fn vmap_kernel_end() -> u64 {
+ pmap_kernel_end() + Mem::KERNEL_OFFSET
+}
+
+#[inline]
+pub fn bss_start() -> u64 {
+ return ___BSS_START__ as u64;
}
-pub fn pmap_bss_end() -> u64 {
- return ___BSS_PM_END__ as u64;
+#[inline]
+pub fn bss_end() -> u64 {
+ return ___BSS_END__ as u64;
}
+#[inline]
pub fn roundup_4k(addr: u64) -> u64 {
return (addr + 0xfff) & !0xfff;
}
+#[inline]
pub fn rounddown_4k(addr: u64) -> u64 {
return addr & !0xfff;
}
@@ -55,11 +72,30 @@ impl Mem {
// memory (37268) 4k pages, 37268 bits are needed, hence
// 4096 bytes, exactly one page!
pub const PHY_BM_SIZE: u64 = Mem::PHY_PAGES >> 3;
+ pub const ID_MAP_START: u64 = 0xffff_8000_0000_0000;
+ pub const ID_MAP_END: u64 = 0xffff_8010_0000_0000;
+ pub const KERNEL_OFFSET: u64 = 0xffff_8020_0000_0000;
+ // 64 GiB available memory
+ pub const MAX_PHY_MEM: u64 = 0x1000000000;
+}
+
+// convert VA <-> PA wrt. the kernel id mapping
+// from 0xffff_8000_0000_0000 ~ 0xffff_800f_ffff_ffff virtual
+// to 0x0 ~ 0xf_ffff_ffff physical (64G)
+#[allow(non_snake_case)]
+#[inline]
+pub fn V2P(va: u64) -> Option<u64> {
+ if va >= Mem::ID_MAP_END || va < Mem::ID_MAP_START {
+ return None;
+ }
+ return Some(va - Mem::ID_MAP_START);
}
-// PHY_TOP 128M
-// ~ free frames
-// PMA::bitmap + PHY_BM_SIZE
-// ~ ___KERNEL_END__
-// KERNEL IMAGE
-// KERNEL START 1 M
+#[allow(non_snake_case)]
+#[inline]
+pub fn P2V(pa: u64) -> Option<u64> {
+ if pa >= Mem::MAX_PHY_MEM {
+ return None;
+ }
+ return Some(pa + Mem::ID_MAP_START);
+}
diff --git a/src/lib.rs b/src/lib.rs
index 8b561ce..0d2fb02 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -14,6 +14,7 @@ use arch::x86_64::interrupt;
use arch::x86_64::interrupt::pic_8259;
use arch::x86_64::interrupt::pic_8259::PicDeviceInt;
use core::panic::PanicInfo;
+use defs::*;
use machine::cgascr::CGAScreen;
use machine::multiboot;
@@ -33,7 +34,7 @@ pub extern "C" fn _entry() -> ! {
let mbi = multiboot::get_mb_info().expect("bad multiboot info flags");
let mem = unsafe { mbi.get_mem() }.unwrap();
println!(
- "available memory: lower {:#X} KiB, upper:{:#X} KiB",
+ "[init] available memory: lower {:#X} KiB, upper:{:#X} KiB",
mem.lower(),
mem.upper()
);
@@ -43,14 +44,14 @@ pub extern "C" fn _entry() -> ! {
interrupt::interrupt_enable();
println!(
- "kernel: {:#X} - {:#X}",
- defs::pmap_kernel_start(),
- defs::pmap_kernel_end()
+ "[init] kernel mapped @ {:#X} - {:#X}",
+ vmap_kernel_start(),
+ vmap_kernel_end(),
);
println!(
- " BSS: {:#X} - {:#X}",
- defs::pmap_bss_start(),
- defs::pmap_bss_end()
+ "[init] BSS mapped @ {:#X} - {:#X}",
+ bss_start(),
+ bss_end()
);
// io::print_welcome();
diff --git a/src/mm/mod.rs b/src/mm/mod.rs
index 8d07cc5..3ed6b19 100644
--- a/src/mm/mod.rs
+++ b/src/mm/mod.rs
@@ -41,12 +41,12 @@ pub fn init() {
}
println!(
- "pma init: kernel mapped at {:#X} - {:#X}",
+ "[init] pma: kernel loaded at phy: {:#X} - {:#X}",
pmap_kernel_start(),
pmap_kernel_end()
);
println!(
- "pma init: {:#X}KiB free memory, {:#X} pages",
+ "[init] pma: {:#X} KiB free memory, {:#X} frames inserted",
inserted * 0x4,
inserted,
);