Skip to content

Commit 67ab772

Browse files
phys_addr: add as_hhdm_virt to minimize the phys to hhdm virt
translation code repetetion Signed-off-by: Andy-Python-Programmer <[email protected]>
1 parent 3e2ee76 commit 67ab772

File tree

19 files changed

+63
-70
lines changed

19 files changed

+63
-70
lines changed

src/aero_kernel/src/acpi/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ impl aml::Handler for AmlHandler {
9898
log::trace!("AML: Reading byte from {:#x}", address);
9999

100100
unsafe {
101-
(crate::PHYSICAL_MEMORY_OFFSET + address)
101+
PhysAddr::new(address as u64)
102+
.as_hhdm_virt()
102103
.as_ptr::<u8>()
103104
.read_volatile()
104105
}
@@ -221,7 +222,7 @@ impl aml::Handler for AmlHandler {
221222

222223
/// Initialize the ACPI tables.
223224
pub fn init(rsdp_address: PhysAddr) -> Result<(), aml::AmlError> {
224-
let rsdp_address = unsafe { crate::PHYSICAL_MEMORY_OFFSET + rsdp_address.as_u64() };
225+
let rsdp_address = rsdp_address.as_hhdm_virt();
225226
let acpi_table = AcpiTable::new(rsdp_address);
226227

227228
macro init_table($sig:path => $ty:ty) {
@@ -262,7 +263,7 @@ pub fn init(rsdp_address: PhysAddr) -> Result<(), aml::AmlError> {
262263
// The DSDT table is put inside the FADT table, instead of listing it in another ACPI table. So
263264
// we need to extract the DSDT table from the FADT table.
264265
let _dsdt_stream = unsafe {
265-
let addr = crate::PHYSICAL_MEMORY_OFFSET + fadt.dsdt as u64;
266+
let addr = PhysAddr::new(fadt.dsdt as u64).as_hhdm_virt();
266267
let sdt = Sdt::from_address(addr);
267268

268269
core::slice::from_raw_parts(sdt.data_address() as *mut u8, sdt.data_len())

src/aero_kernel/src/acpi/rsdp.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
use core::marker::PhantomData;
2121

2222
use super::sdt::Sdt;
23-
use crate::mem::paging::VirtAddr;
23+
use crate::mem::paging::{PhysAddr, VirtAddr};
2424

2525
pub(super) fn validate_rsdt_checksum<T: RsdtHeader>(header: &'static T) -> bool {
2626
if header.signature() == b"RSD PTR " {
@@ -124,9 +124,10 @@ impl Rsdt<u32> {
124124
let header_data_address = self.header.data_address() as *const u32;
125125

126126
for i in 0..self.entries_count() {
127-
let item_addr_phys = unsafe { *(header_data_address.add(i)) } as u64;
128-
let item_addr_virt = unsafe { crate::PHYSICAL_MEMORY_OFFSET + item_addr_phys };
129-
127+
let item_addr_virt = unsafe {
128+
let ptr = header_data_address.add(i);
129+
PhysAddr::new(*ptr as u64).as_hhdm_virt()
130+
};
130131
let item = unsafe { Sdt::from_address(item_addr_virt) };
131132

132133
if item.signature == signature.as_bytes() {
@@ -159,8 +160,10 @@ impl Rsdt<u64> {
159160
let header_data_address = self.header.data_address() as *const u64;
160161

161162
for i in 0..self.entries_count() {
162-
let item_addr_phys = unsafe { *(header_data_address.add(i)) };
163-
let item_addr_virt = unsafe { crate::PHYSICAL_MEMORY_OFFSET + item_addr_phys };
163+
let item_addr_virt = unsafe {
164+
let ptr = header_data_address.add(i);
165+
PhysAddr::new(*ptr).as_hhdm_virt()
166+
};
164167

165168
let item = unsafe { Sdt::from_address(item_addr_virt) };
166169

@@ -187,15 +190,15 @@ pub(super) fn find_rsdt_address(rsdp_address: VirtAddr) -> RsdtAddress {
187190
let valid = validate_rsdt_checksum(v20);
188191
assert!(valid, "rsdp: failed to validate RSDP v20 checksum");
189192

190-
let xsdt_address = unsafe { crate::PHYSICAL_MEMORY_OFFSET + v20.xsdt_address };
193+
let xsdt_address = PhysAddr::new(v20.xsdt_address).as_hhdm_virt();
191194
return RsdtAddress::Xsdt(xsdt_address);
192195
} else {
193196
let v10 = unsafe { &*(rsdp_address.as_ptr() as *const Rsdp10) };
194197
let valid = validate_rsdt_checksum(v10);
195198

196199
assert!(valid, "rsdp: failed to validate RSDP v10 checksum");
197200

198-
let rsdt_address = unsafe { crate::PHYSICAL_MEMORY_OFFSET + v10.rsdt_address as u64 };
201+
let rsdt_address = PhysAddr::new(v10.rsdt_address as u64).as_hhdm_virt();
199202
return RsdtAddress::Rsdt(rsdt_address);
200203
}
201204
}

src/aero_kernel/src/apic.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ pub fn mark_bsp_ready(value: bool) {
438438
/// Read from the `io_apic_id` I/O APIC as described by the MADT.
439439
pub unsafe fn io_apic_read(io_apic_id: usize, register: u32) -> u32 {
440440
let io_apic = madt::IO_APICS.read()[io_apic_id];
441-
let addr = crate::PHYSICAL_MEMORY_OFFSET + io_apic.io_apic_address as usize;
441+
let addr = PhysAddr::new(io_apic.io_apic_address as u64).as_hhdm_virt();
442442
let ptr: *mut u32 = addr.as_mut_ptr();
443443

444444
ptr::write_volatile(ptr, register);
@@ -448,7 +448,7 @@ pub unsafe fn io_apic_read(io_apic_id: usize, register: u32) -> u32 {
448448
/// Write from the `io_apic_id` I/O APIC as described by the MADT.
449449
pub unsafe fn io_apic_write(io_apic_id: usize, register: u32, data: u32) {
450450
let io_apic = madt::IO_APICS.read()[io_apic_id];
451-
let addr = crate::PHYSICAL_MEMORY_OFFSET + io_apic.io_apic_address as usize;
451+
let addr = PhysAddr::new(io_apic.io_apic_address as u64).as_hhdm_virt();
452452
let ptr: *mut u32 = addr.as_mut_ptr();
453453

454454
ptr::write_volatile(ptr, register);

src/aero_kernel/src/arch/x86_64/mod.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,15 @@ extern "C" fn x86_64_aero_main(boot_info: &'static StivaleStruct) -> ! {
128128
}
129129

130130
crate::UNWIND_INFO.call_once(move || unsafe {
131-
let addr = (kernel_info as *const StivaleKernelFileV2Tag) as u64;
132-
let new_addr = crate::PHYSICAL_MEMORY_OFFSET + addr;
133-
134-
&*new_addr.as_mut_ptr::<StivaleKernelFileV2Tag>()
131+
&*(PhysAddr::new((kernel_info as *const StivaleKernelFileV2Tag) as u64)
132+
.as_hhdm_virt()
133+
.as_mut_ptr::<StivaleKernelFileV2Tag>())
135134
});
136135

137136
crate::time::EPOCH_TAG.call_once(move || unsafe {
138-
let addr = (epoch as *const StivaleEpochTag) as u64;
139-
let new_addr = crate::PHYSICAL_MEMORY_OFFSET + addr;
140-
141-
&*new_addr.as_mut_ptr::<StivaleEpochTag>()
137+
&*(PhysAddr::new((epoch as *const StivaleEpochTag) as u64)
138+
.as_hhdm_virt()
139+
.as_mut_ptr::<StivaleEpochTag>())
142140
});
143141

144142
crate::INITRD_MODULE.call_once(move || {
@@ -160,7 +158,7 @@ extern "C" fn x86_64_aero_main(boot_info: &'static StivaleStruct) -> ! {
160158

161159
// Parse the kernel command line.
162160
let command_line: &'static _ = boot_info.command_line().map_or("", |cmd| unsafe {
163-
let cmdline = crate::PHYSICAL_MEMORY_OFFSET + cmd.command_line;
161+
let cmdline = PhysAddr::new(cmd.command_line).as_hhdm_virt();
164162

165163
// SAFETY: The bootloader has provided a pointer that points to a valid C
166164
// string with a NULL terminator of size less than `usize::MAX`, whose content

src/aero_kernel/src/arch/x86_64/task.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,12 @@ impl ArchTask {
195195

196196
let switch_stack = unsafe {
197197
let frame: PhysFrame = FRAME_ALLOCATOR.allocate_frame().unwrap();
198-
let phys = frame.start_address();
199-
let virt = crate::PHYSICAL_MEMORY_OFFSET + phys.as_u64();
200198

201-
virt.as_mut_ptr::<u8>().add(Size4KiB::SIZE as usize)
199+
frame
200+
.start_address()
201+
.as_hhdm_virt()
202+
.as_mut_ptr::<u8>()
203+
.add(Size4KiB::SIZE as usize)
202204
};
203205

204206
let mut old_stack_ptr = self.context_switch_rsp.as_u64();

src/aero_kernel/src/drivers/block/ahci.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,7 @@ impl DmaRequest {
261261
for buffer in self.buffer.iter() {
262262
let count = core::cmp::min(remaning, 0x2000);
263263

264-
let buffer_address = unsafe { crate::PHYSICAL_MEMORY_OFFSET + buffer.start.as_u64() };
265-
let buffer_pointer = buffer_address.as_ptr();
264+
let buffer_pointer = buffer.start.as_hhdm_virt().as_ptr();
266265
let buffer = unsafe { core::slice::from_raw_parts::<u8>(buffer_pointer, count) };
267266

268267
// Copy the data from the buffer into the given buffer with the
@@ -552,7 +551,7 @@ impl HbaPort {
552551
fn cmd_header_at(&mut self, index: usize) -> &mut HbaCmdHeader {
553552
// Since the CLB holds the physical address, we make the address mapped
554553
// before reading it.
555-
let clb_mapped = unsafe { crate::PHYSICAL_MEMORY_OFFSET + self.clb.get().as_u64() };
554+
let clb_mapped = self.clb.get().as_hhdm_virt();
556555
// Get the address of the command header at `index`.
557556
let clb_addr = clb_mapped + core::mem::size_of::<HbaCmdHeader>() * index;
558557

src/aero_kernel/src/drivers/block/ide/channel.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ struct PrdTable<'a> {
3434

3535
impl<'a> PrdTable<'a> {
3636
pub fn new(addr: PhysAddr, entries: usize) -> PrdTable<'a> {
37-
let mapped_addr = unsafe { crate::PHYSICAL_MEMORY_OFFSET + addr.as_u64() };
38-
let ptr = mapped_addr.as_mut_ptr::<PrdEntry>();
37+
let ptr = addr.as_hhdm_virt().as_mut_ptr::<PrdEntry>();
3938
let entries = unsafe { core::slice::from_raw_parts_mut(ptr, entries) };
4039

4140
PrdTable::<'a> { data: entries }

src/aero_kernel/src/fs/initramfs.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use alloc::sync::Arc;
2121

2222
use crate::fs::{FileSystemError, Path};
23+
use crate::mem::paging::PhysAddr;
2324

2425
use super::cache::DirCacheItem;
2526
use super::ramfs::RamFs;
@@ -49,7 +50,7 @@ pub(super) fn init() -> Result<()> {
4950

5051
let initrd_module = crate::INITRD_MODULE.get().unwrap();
5152
let initrd = unsafe {
52-
let base = crate::PHYSICAL_MEMORY_OFFSET + initrd_module.start;
53+
let base = PhysAddr::new(initrd_module.start).as_hhdm_virt();
5354
let length = initrd_module.end - initrd_module.start;
5455

5556
core::slice::from_raw_parts(base.as_ptr(), length as usize)

src/aero_kernel/src/mem/alloc.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,7 @@ impl Slab {
5959
.allocate_frame()
6060
.expect("slab_init: failed to allocate frame");
6161

62-
self.first_free = frame.start_address().as_u64() as usize;
63-
self.first_free += crate::PHYSICAL_MEMORY_OFFSET.as_u64() as usize;
62+
self.first_free = frame.start_address().as_hhdm_virt().as_u64() as usize;
6463
}
6564

6665
let hdr_size = core::mem::size_of::<SlabHeader>() as u64;

src/aero_kernel/src/mem/mod.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ use ::alloc::boxed::Box;
2828
use crate::mem::paging::*;
2929

3030
use self::paging::{active_level_4_table, FRAME_ALLOCATOR};
31-
use crate::PHYSICAL_MEMORY_OFFSET;
3231

3332
/// Structure representing a *virtual* address space. The address space
3433
/// contains a reference of the page table allocated for this address space.
@@ -45,9 +44,9 @@ impl AddressSpace {
4544
.ok_or(MapToError::FrameAllocationFailed)?;
4645

4746
let phys_addr = frame.start_address();
48-
phys_addr.as_vm_frame().unwrap().inc_ref_count();
47+
let virt_addr = phys_addr.as_hhdm_virt();
4948

50-
let virt_addr = PHYSICAL_MEMORY_OFFSET + phys_addr.as_u64();
49+
phys_addr.as_vm_frame().unwrap().inc_ref_count();
5150

5251
let page_table: *mut PageTable = virt_addr.as_mut_ptr();
5352
let page_table = &mut *page_table;
@@ -107,19 +106,13 @@ impl AddressSpace {
107106
/// Returns a mutable reference to the page table allocated for this
108107
/// address space.
109108
pub fn page_table(&mut self) -> &'static mut PageTable {
110-
unsafe {
111-
let phys_addr = self.cr3.start_address();
112-
let virt_addr = PHYSICAL_MEMORY_OFFSET + phys_addr.as_u64();
113-
let page_table_ptr: *mut PageTable = virt_addr.as_mut_ptr();
114-
115-
&mut *page_table_ptr
116-
}
109+
unsafe { &mut *(self.cr3.start_address().as_hhdm_virt().as_mut_ptr()) }
117110
}
118111

119112
/// Returns a mutable refernce to the mapper pointing to the page table
120113
/// allocated for this address space.
121114
pub fn offset_page_table(&mut self) -> OffsetPageTable {
122-
unsafe { OffsetPageTable::new(self.page_table(), PHYSICAL_MEMORY_OFFSET) }
115+
unsafe { OffsetPageTable::new(self.page_table(), crate::PHYSICAL_MEMORY_OFFSET) }
123116
}
124117
}
125118

0 commit comments

Comments
 (0)