aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-30 12:24:01 +0200
committerHimbeer <himbeer@disroot.org>2024-07-30 12:24:01 +0200
commit270c8f02867bf959fa86a44fcb76bb0680571695 (patch)
treed60a5eb5ab50533176cb67d2fb57c2934c4cf6d6
parent864b96499db9e9233465b79cbbc3a32399fcf946 (diff)
syscall: Provide userinit access (permissions controlled via paging in the future)
Fixes #69.
-rw-r--r--linker.ld7
-rw-r--r--src/lib/paging.zig3
-rw-r--r--src/lib/process.zig4
-rw-r--r--src/lib/syscall.zig9
-rw-r--r--src/lib/userinit.zig2
5 files changed, 24 insertions, 1 deletions
diff --git a/linker.ld b/linker.ld
index 30c410a..1d16384 100644
--- a/linker.ld
+++ b/linker.ld
@@ -38,6 +38,13 @@ SECTIONS {
PROVIDE(_rodata_end = .);
} > ram AT > ram : lo_r
+ .userinit : ALIGN(4K) {
+ PROVIDE(_userinit_start = .);
+
+ *(.userinit .userinit.*)
+
+ PROVIDE(_userinit_end = .);
+ } > ram AT > ram : lo_r
.data : ALIGN(4K) {
PROVIDE(_data_start = .);
diff --git a/src/lib/paging.zig b/src/lib/paging.zig
index dd1feeb..d69a17c 100644
--- a/src/lib/paging.zig
+++ b/src/lib/paging.zig
@@ -14,6 +14,8 @@ pub const text_start = @extern(*anyopaque, .{ .name = "_text_start" });
pub const text_end = @extern(*anyopaque, .{ .name = "_text_end" });
pub const rodata_start = @extern(*anyopaque, .{ .name = "_rodata_start" });
pub const rodata_end = @extern(*anyopaque, .{ .name = "_rodata_end" });
+pub const userinit_start = @extern(*anyopaque, .{ .name = "_userinit_start" });
+pub const userinit_end = @extern(*anyopaque, .{ .name = "_userinit_end" });
pub const data_start = @extern(*anyopaque, .{ .name = "_data_start" });
pub const data_end = @extern(*anyopaque, .{ .name = "_data_end" });
pub const bss_start = @extern(*anyopaque, .{ .name = "_bss_start" });
@@ -458,6 +460,7 @@ pub const Table = struct {
pub fn mapKernel(root: *Table) !void {
try root.identityMapRange(@intFromPtr(text_start), @intFromPtr(text_end), EntryFlags.readExec);
try root.identityMapRange(@intFromPtr(rodata_start), @intFromPtr(rodata_end), EntryFlags.readOnly);
+ try root.identityMapRange(@intFromPtr(userinit_start), @intFromPtr(userinit_end), EntryFlags.readOnly);
try root.identityMapRange(@intFromPtr(data_start), @intFromPtr(data_end), EntryFlags.readWrite);
try root.identityMapRange(@intFromPtr(bss_start), @intFromPtr(bss_end), EntryFlags.readWrite);
try root.identityMapRange(@intFromPtr(stack_start), @intFromPtr(stack_end), EntryFlags.readWrite);
diff --git a/src/lib/process.zig b/src/lib/process.zig
index c8e6d5e..99a89bd 100644
--- a/src/lib/process.zig
+++ b/src/lib/process.zig
@@ -235,6 +235,10 @@ pub fn create(allocator: Allocator, elf_buf: []align(@alignOf(elf.Elf64_Ehdr)) c
try procmem.mapKernel();
+ const userinit_start = @intFromPtr(paging.userinit_start);
+ const userinit_end = @intFromPtr(paging.userinit_end);
+ try procmem.identityMapRange(userinit_start, userinit_end, paging.EntryFlags.userReadOnly);
+
const parse_source = std.io.fixedBufferStream(elf_buf);
var it = hdr.program_header_iterator(parse_source);
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig
index 03abade..8d42e7a 100644
--- a/src/lib/syscall.zig
+++ b/src/lib/syscall.zig
@@ -9,6 +9,7 @@ const mem = @import("mem.zig");
const paging = @import("paging.zig");
const process = @import("process.zig");
const riscv = @import("riscv.zig");
+const userinit = @import("userinit.zig");
pub const Error = error{
ZeroAddressSupplied,
@@ -27,6 +28,7 @@ pub fn handler(proc: *process.Info, trap_frame: *TrapFrame) !void {
100004 => trap_frame.setReturnValue(terminate(proc, trap_frame)),
100005 => trap_frame.setReturnValue(processId(proc)),
100006 => trap_frame.setReturnValue(threadId(proc)),
+ 100007 => trap_frame.setReturnValue(rawUserinit(trap_frame)),
else => return HandleError.UnknownSyscall,
}
}
@@ -138,3 +140,10 @@ fn processId(proc: *const process.Info) usize {
fn threadId(proc: *const process.Info) usize {
return proc.thread_id;
}
+
+// rawUserinit(ptr: *[*]const u8) usize
+fn rawUserinit(trap_frame: *const TrapFrame) usize {
+ const ptr: *[*]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
+ ptr.* = userinit.tarball;
+ return userinit.tarball.len;
+}
diff --git a/src/lib/userinit.zig b/src/lib/userinit.zig
index 8c77cdd..7eb0eea 100644
--- a/src/lib/userinit.zig
+++ b/src/lib/userinit.zig
@@ -2,4 +2,4 @@
//
// SPDX-License-Identifier: AGPL-3.0-or-later
-pub const tarball = @embedFile("cfg/userinit.tar");
+pub export var tarball linksection(".userinit") = @embedFile("cfg/userinit.tar");