aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-21 19:11:02 +0200
committerHimbeer <himbeer@disroot.org>2024-07-21 19:11:02 +0200
commitc5987318456269e0f224e32a3090b6ed90fcfb0a (patch)
tree81e51f6bb04d9df40866ecb72db5fa9279eeb1e9 /src/lib
parent3888bd9fa3ff3a5f724b4c0329d24bdc57ae6663 (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.zig7
-rw-r--r--src/lib/process.zig4
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)) {