feat(adapter): higher-half kernel (linked at PHYS_OFFSET, boot trampoline, no low mappings), fix SBI ecall clobbers
This commit is contained in:
@@ -53,7 +53,7 @@ impl Platform for RiscVPlatform {
|
||||
.page_tables
|
||||
.get_mut(process.raw() as usize)
|
||||
.ok_or(MapError::NoAddressSpace)?;
|
||||
// SAFETY: the kernel page table is identity mapped and lives forever.
|
||||
// SAFETY: the kernel page table lives in the boot heap forever.
|
||||
let kernel_root = unsafe { &*(self.kernel_pt as *const mmu::PageTable) };
|
||||
*slot = mmu::create_user_root(kernel_root, frames)?;
|
||||
Ok(())
|
||||
@@ -66,7 +66,7 @@ impl Platform for RiscVPlatform {
|
||||
// The caller may be tearing down the space we are running on; get
|
||||
// off it before the kernel frees its frames.
|
||||
if mmu::active_root() == root {
|
||||
// SAFETY: the kernel page table is identity mapped and lives forever.
|
||||
// SAFETY: the kernel page table lives in the boot heap forever.
|
||||
mmu::activate(unsafe { &*(self.kernel_pt as *const mmu::PageTable) });
|
||||
}
|
||||
self.page_tables[process.raw() as usize] = 0;
|
||||
@@ -99,9 +99,11 @@ impl Platform for RiscVPlatform {
|
||||
}
|
||||
|
||||
fn zero_frame(&mut self, pa: PhysicalAddress) {
|
||||
// SAFETY: pool frames are identity mapped kernel RAM and the kernel
|
||||
// only zeroes frames it has just allocated.
|
||||
unsafe { core::ptr::write_bytes(pa.raw() as *mut u8, 0, mmu::PAGE_SIZE) };
|
||||
// SAFETY: pool frames are RAM, mapped at `phys_to_virt`, and the
|
||||
// kernel only zeroes frames it has just allocated.
|
||||
unsafe {
|
||||
core::ptr::write_bytes(mmu::phys_to_virt(pa.raw()) as *mut u8, 0, mmu::PAGE_SIZE)
|
||||
};
|
||||
}
|
||||
|
||||
fn enable_user_mode(&mut self, entry: EntryPoint, stack: StackPointer) -> ! {
|
||||
@@ -160,8 +162,8 @@ impl Platform for RiscVPlatform {
|
||||
unsafe {
|
||||
core::arch::asm!(
|
||||
"ecall",
|
||||
in("a0") 0usize,
|
||||
in("a1") 0usize,
|
||||
inlateout("a0") 0usize => _,
|
||||
inlateout("a1") 0usize => _,
|
||||
in("a7") 0x53525354usize,
|
||||
in("a6") 0usize,
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user