WIP: Remove SYS_CLONE (to be done in userspace).
This commit is contained in:
@@ -160,23 +160,3 @@ interrupt_stack!(syscall, |stack| {
|
||||
syscall::syscall(scratch.rax, stack.preserved.rbx, scratch.rcx, scratch.rdx, scratch.rsi, scratch.rdi, rbp, stack)
|
||||
})
|
||||
});
|
||||
|
||||
#[naked]
|
||||
pub unsafe extern "C" fn clone_ret() {
|
||||
core::arch::asm!(concat!(
|
||||
// The address of this instruction is injected by `clone` in process.rs, on
|
||||
// top of the stack syscall->inner in this file, which is done using the rbp
|
||||
// register we save there.
|
||||
//
|
||||
// The top of our stack here is the address pointed to by rbp, which is:
|
||||
//
|
||||
// - the previous rbp
|
||||
// - the return location
|
||||
//
|
||||
// Our goal is to return from the parent function, inner, so we restore
|
||||
// rbp...
|
||||
"pop rbp\n",
|
||||
// ...and we return to the address at the top of the stack
|
||||
"ret\n",
|
||||
), options(noreturn));
|
||||
}
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
use super::{linear_phys_to_virt, Page, PAGE_SIZE, PageFlags, PhysicalAddress, VirtualAddress};
|
||||
|
||||
use crate::ipi::{ipi, IpiKind, IpiTarget};
|
||||
use crate::memory::{allocate_frames, deallocate_frames, Enomem, Frame};
|
||||
|
||||
use super::RmmA;
|
||||
use super::table::{Table, Level4};
|
||||
|
||||
pub use rmm::{PageFlush, PageFlushAll};
|
||||
pub use rmm::{Flusher, PageFlush, PageFlushAll};
|
||||
|
||||
pub struct Mapper<'table> {
|
||||
p4: &'table mut Table<Level4>,
|
||||
pub(in super) p4: &'table mut Table<Level4>,
|
||||
}
|
||||
|
||||
impl core::fmt::Debug for Mapper<'_> {
|
||||
@@ -192,3 +194,21 @@ impl<'table> Mapper<'table> {
|
||||
.map(|frame| PhysicalAddress::new(frame.start_address().data() + offset))
|
||||
}
|
||||
}
|
||||
|
||||
pub struct InactiveFlusher { _inner: () }
|
||||
impl InactiveFlusher {
|
||||
// TODO: cpu id
|
||||
pub fn new() -> Self { Self { _inner: () } }
|
||||
}
|
||||
|
||||
impl Flusher<RmmA> for InactiveFlusher {
|
||||
fn consume(&mut self, flush: PageFlush<RmmA>) {
|
||||
// TODO: Push to TLB "mailbox" or tell it to reload CR3 if there are too many entries.
|
||||
unsafe { flush.ignore(); }
|
||||
}
|
||||
}
|
||||
impl Drop for InactiveFlusher {
|
||||
fn drop(&mut self) {
|
||||
ipi(IpiKind::Tlb, IpiTarget::Other);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ use self::table::{Level4, Table};
|
||||
|
||||
pub use rmm::{
|
||||
Arch as RmmArch,
|
||||
Flusher,
|
||||
PageFlags,
|
||||
PhysicalAddress,
|
||||
TableKind,
|
||||
@@ -112,7 +113,7 @@ unsafe fn map_percpu(cpu_id: usize, mapper: &mut Mapper) -> PageFlushAll<RmmA> {
|
||||
let start = crate::KERNEL_PERCPU_OFFSET + crate::KERNEL_PERCPU_SIZE * cpu_id;
|
||||
let end = start + size;
|
||||
|
||||
let flush_all = PageFlushAll::new();
|
||||
let mut flush_all = PageFlushAll::new();
|
||||
let start_page = Page::containing_address(VirtualAddress::new(start));
|
||||
let end_page = Page::containing_address(VirtualAddress::new(end - 1));
|
||||
for page in Page::range_inclusive(start_page, end_page) {
|
||||
@@ -288,6 +289,11 @@ impl ActivePageTable {
|
||||
pub unsafe fn address(&self) -> usize {
|
||||
RmmA::table().data()
|
||||
}
|
||||
pub fn mapper<'a>(&'a mut self) -> Mapper<'a> {
|
||||
Mapper {
|
||||
p4: self.p4,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for ActivePageTable {
|
||||
|
||||
Reference in New Issue
Block a user