diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-21 19:11:02 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-21 19:11:02 +0200 |
commit | c5987318456269e0f224e32a3090b6ed90fcfb0a (patch) | |
tree | 81e51f6bb04d9df40866ecb72db5fa9279eeb1e9 /src/lib | |
parent | 3888bd9fa3ff3a5f724b4c0329d24bdc57ae6663 (diff) |
process: Switch to kernel page table before (potentially) unmapping current page table on termination
Fixes hanging with high CPU usage on process termination.
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/paging.zig | 7 | ||||
-rw-r--r-- | src/lib/process.zig | 4 |
2 files changed, 10 insertions, 1 deletions
diff --git a/src/lib/paging.zig b/src/lib/paging.zig index 7dc25dd..a5beb13 100644 --- a/src/lib/paging.zig +++ b/src/lib/paging.zig @@ -37,6 +37,8 @@ pub const log2_page_size: u8 = @intCast(std.math.log2(page_size)); pub var next_mmio_vaddr: usize = 0xff000000; +pub var kmem: *Table = undefined; + pub const AllocError = error{ ZeroSize, OutOfMemory, @@ -471,13 +473,16 @@ pub const Table = struct { } }; -pub fn init() void { +pub fn init() !void { const num_pages = heapSize() / page_size; const pages: [*]Page = @ptrCast(heap_start); for (0..num_pages) |i| { pages[i].flags = Page.Flags.clear; } + + kmem = @ptrCast(try zeroedAlloc(1)); + try kmem.mapKernel(); } // Allocate memory pages. Passing n <= 0 results in an error. diff --git a/src/lib/process.zig b/src/lib/process.zig index 3c902df..89ce369 100644 --- a/src/lib/process.zig +++ b/src/lib/process.zig @@ -164,6 +164,10 @@ pub const Info = struct { pub fn terminate( self: *Info, ) void { + instructions.satp.write(paging.kmem.satp(0)); + // Probably not always needed. Let's not take the risk for now. + asm volatile ("sfence.vma"); + var node = list.first; while (node) |proc_node| : (node = proc_node.next) { if (self.shouldRemove(&proc_node.data)) { |