aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-08-01 12:12:17 +0200
committerHimbeer <himbeer@disroot.org>2024-08-01 12:12:17 +0200
commit671a17abd90757bbadf02a5d7468c6f6910809ba (patch)
tree2b2339f5ddb8f43b6c49507ae72f9cfa4ced3668
parent22f46cb26cedf3837cd876d738236f9522ceb355 (diff)
process: Ensure that ELF doesn't map important kernel memory
-rw-r--r--src/lib/paging.zig21
-rw-r--r--src/lib/process.zig4
2 files changed, 12 insertions, 13 deletions
diff --git a/src/lib/paging.zig b/src/lib/paging.zig
index 7915b9b..dfe44cc 100644
--- a/src/lib/paging.zig
+++ b/src/lib/paging.zig
@@ -30,10 +30,11 @@ inline fn heapSize() usize {
}
pub const page_size: usize = 0x1000; // 4096 bytes
-pub const log2_page_size: u8 = @intCast(std.math.log2(page_size));
-pub var next_mmio_vaddr: usize = 0xff000000;
+var num_pages: usize = undefined;
+var next_mmio_vaddr: usize = 0xff000000;
+pub var alloc_start: usize = undefined;
pub var kmem: *Table = undefined;
pub const Error = error{
@@ -480,13 +481,17 @@ pub const Table = struct {
};
pub fn init() !void {
- const num_pages = heapSize() / page_size;
+ num_pages = heapSize() / page_size;
const pages: [*]Page = @ptrCast(heap_start);
for (0..num_pages) |i| {
pages[i].flags = Page.Flags.clear;
}
+ // Start allocating beyond page descriptors.
+ const descriptors_end = @intFromPtr(heap_start) + num_pages * @sizeOf(Page);
+ alloc_start = std.mem.alignForward(usize, descriptors_end, page_size);
+
kmem = @ptrCast(try zeroedAlloc(1));
try kmem.mapKernel();
}
@@ -495,11 +500,6 @@ pub fn init() !void {
pub fn alloc(n: usize) ![]align(page_size) u8 {
if (n <= 0) return Error.ZeroSize;
- const num_pages = heapSize() / page_size;
- // Start allocating beyond page descriptors.
- const pages = @intFromPtr(heap_start) + num_pages * @sizeOf(Page);
- const alloc_start = std.mem.alignForwardLog2(pages, log2_page_size);
-
const descriptors: [*]Page = @ptrCast(heap_start);
// Iterate over potential starting points.
@@ -545,11 +545,6 @@ pub fn free(memory: anytype) void {
const bytes_len = bytes.len + if (Slice.sentinel != null) @sizeOf(Slice.child) else 0;
if (bytes_len == 0) return;
- const num_pages = heapSize() / page_size;
- // Start allocating beyond page descriptors.
- const pages = @intFromPtr(heap_start) + num_pages * @sizeOf(Page);
- const alloc_start = std.mem.alignForwardLog2(pages, log2_page_size);
-
// Restore the address to the page descriptor flags from the address of its contents
// by restoring the descriptor number and indexing the descriptor table
// at the start of the heap using it.
diff --git a/src/lib/process.zig b/src/lib/process.zig
index 265d9b3..b59d255 100644
--- a/src/lib/process.zig
+++ b/src/lib/process.zig
@@ -31,6 +31,7 @@ pub const ExeError = error{
BadBitLen,
NotStaticExe,
LengthOutOfBounds,
+ ReservedMemMapping,
BranchPerms,
WritableCode,
};
@@ -275,6 +276,9 @@ pub fn create(allocator: Allocator, elf_buf: []align(@alignOf(elf.Elf64_Ehdr)) c
.dirty = @bitCast(phdr.p_flags & elf.PF_W != 0),
};
+ if (vaddr >= @intFromPtr(paging.text_start) and vaddr < paging.alloc_start) {
+ return ExeError.ReservedMemMapping;
+ }
if (!@bitCast(flags.read) and !@bitCast(flags.write) and !@bitCast(flags.exec)) {
return ExeError.BranchPerms;
}