From 80af2e88528d9d0ca8dc7a9bae48639307cefedd Mon Sep 17 00:00:00 2001 From: Matthew Leach Date: Thu, 30 Apr 2026 20:43:51 +0100 Subject: [PATCH] libkernel: pg_offset: decouple from `VirtualMemory` trait Since the only requirement for a `PageOffsetTranslator` is a constant offset, pass that in as a generic parameter, allowing it to be decoupled from the `VirtualMemory` trait. --- libkernel/src/memory/proc_vm/address_space.rs | 3 --- libkernel/src/memory/proc_vm/pg_offset.rs | 18 +++++++----------- src/arch/arm64/mod.rs | 4 ++-- src/arch/mod.rs | 3 +++ src/drivers/virtio_hal.rs | 3 +-- src/memory/mod.rs | 4 ++-- 6 files changed, 15 insertions(+), 20 deletions(-) diff --git a/libkernel/src/memory/proc_vm/address_space.rs b/libkernel/src/memory/proc_vm/address_space.rs index 68d80d9..813d2d2 100644 --- a/libkernel/src/memory/proc_vm/address_space.rs +++ b/libkernel/src/memory/proc_vm/address_space.rs @@ -208,9 +208,6 @@ pub trait VirtualMemory: CpuOps + Sized { /// The address space type used for the kernel. type KernelAddressSpace: KernAddressSpace; - /// The starting address for the logical mapping of all physical ram. - const PAGE_OFFSET: usize; - /// Obtain a reference to the kernel's address space. fn kern_address_space() -> &'static SpinLockIrq; } diff --git a/libkernel/src/memory/proc_vm/pg_offset.rs b/libkernel/src/memory/proc_vm/pg_offset.rs index e7fce19..ba876ee 100644 --- a/libkernel/src/memory/proc_vm/pg_offset.rs +++ b/libkernel/src/memory/proc_vm/pg_offset.rs @@ -1,22 +1,18 @@ //! Page-offset arithmetic helpers. -use super::address_space::VirtualMemory; -use crate::memory::address::{AddressTranslator, TPA, TVA}; -use core::marker::PhantomData; +pub(crate) use crate::memory::address::{AddressTranslator, TPA, TVA}; /// Translates between physical and virtual addresses using a fixed page-offset mapping. -pub struct PageOffsetTranslator { - _phantom: PhantomData, -} +pub struct PageOffsetTranslator; -unsafe impl Send for PageOffsetTranslator {} -unsafe impl Sync for PageOffsetTranslator {} +unsafe impl Send for PageOffsetTranslator {} +unsafe impl Sync for PageOffsetTranslator {} -impl AddressTranslator for PageOffsetTranslator { +impl AddressTranslator for PageOffsetTranslator { fn virt_to_phys(va: TVA) -> TPA { let mut v = va.value(); - v -= VM::PAGE_OFFSET; + v -= OFFSET; TPA::from_value(v) } @@ -24,7 +20,7 @@ impl AddressTranslator for PageOffsetTranslator { fn phys_to_virt(pa: TPA) -> TVA { let mut v = pa.value(); - v += VM::PAGE_OFFSET; + v += OFFSET; TVA::from_value(v) } diff --git a/src/arch/arm64/mod.rs b/src/arch/arm64/mod.rs index e01c8a2..6711c66 100644 --- a/src/arch/arm64/mod.rs +++ b/src/arch/arm64/mod.rs @@ -78,8 +78,6 @@ impl VirtualMemory for Aarch64 { type ProcessAddressSpace = Arm64ProcessAddressSpace; type KernelAddressSpace = Arm64KernelAddressSpace; - const PAGE_OFFSET: usize = PAGE_OFFSET; - fn kern_address_space() -> &'static SpinLock { KERN_ADDR_SPC.get().unwrap() } @@ -89,6 +87,8 @@ impl Arch for Aarch64 { type UserContext = ExceptionState; type PTraceGpRegs = Arm64PtraceGPRegs; + const PAGE_OFFSET: usize = PAGE_OFFSET; + fn new_user_context(entry_point: VA, stack_top: VA) -> Self::UserContext { ExceptionState { x: [0; 31], diff --git a/src/arch/mod.rs b/src/arch/mod.rs index b026af1..750e3df 100644 --- a/src/arch/mod.rs +++ b/src/arch/mod.rs @@ -37,6 +37,9 @@ pub trait Arch: CpuOps + VirtualMemory { /// The type for GP regs copied via `PTRACE_GETREGSET`. type PTraceGpRegs: UserCopyable + for<'a> From<&'a Self::UserContext>; + /// The starting address for the logical mapping of all physical ram. + const PAGE_OFFSET: usize; + fn name() -> &'static str; fn cpu_count() -> usize; diff --git a/src/drivers/virtio_hal.rs b/src/drivers/virtio_hal.rs index 55c0b92..cbb59ae 100644 --- a/src/drivers/virtio_hal.rs +++ b/src/drivers/virtio_hal.rs @@ -1,9 +1,8 @@ -use crate::arch::ArchImpl; +use crate::arch::{Arch, ArchImpl}; use crate::memory::PageOffsetTranslator; use core::ptr::NonNull; use libkernel::memory::PAGE_SIZE; use libkernel::memory::address::{PA, TPA}; -use libkernel::memory::proc_vm::address_space::VirtualMemory; use libkernel::memory::region::PhysMemoryRegion; use log::trace; use virtio_drivers::{BufferDirection, Hal, PhysAddr}; diff --git a/src/memory/mod.rs b/src/memory/mod.rs index 7fbd663..4d5fb02 100644 --- a/src/memory/mod.rs +++ b/src/memory/mod.rs @@ -1,5 +1,5 @@ use crate::{ - arch::ArchImpl, + arch::{Arch, ArchImpl}, sync::{OnceLock, SpinLock}, }; use libkernel::memory::{ @@ -19,7 +19,7 @@ pub mod process_vm; pub mod uaccess; pub type PageOffsetTranslator = - libkernel::memory::proc_vm::pg_offset::PageOffsetTranslator; + libkernel::memory::proc_vm::pg_offset::PageOffsetTranslator<{ ArchImpl::PAGE_OFFSET }>; // Initial memory allocator. Used for initial memory setup. const STATIC_REGION_COUNT: usize = 128;