aboutsummaryrefslogtreecommitdiff
path: root/src/lib/syscall.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r--src/lib/syscall.zig27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig
index 37cfb00..ee47a6b 100644
--- a/src/lib/syscall.zig
+++ b/src/lib/syscall.zig
@@ -13,6 +13,12 @@ pub const Error = error{
UnknownSyscall,
};
+fn setUserMemoryAccess(enable: bool) void {
+ var sstatus = instructions.sstatus.read();
+ sstatus.supervisor_user_memory_access = @bitCast(enable);
+ instructions.sstatus.write(sstatus);
+}
+
pub fn handler(proc: *process.Info, trap_frame: *trap.Frame) !void {
switch (trap_frame.general_purpose_registers[17]) {
100000 => uprint(trap_frame),
@@ -45,6 +51,9 @@ fn uprint(trap_frame: *const trap.Frame) void {
// open(path_c: [*:0]const u8, data: usize) Result(usize) // fixme: Kernel panic if null pointer
fn open(proc: *process.Info, trap_frame: *trap.Frame) void {
+ setUserMemoryAccess(true);
+ defer setUserMemoryAccess(false);
+
const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
const data = trap_frame.general_purpose_registers[11];
@@ -73,6 +82,9 @@ fn close(proc: *process.Info, trap_frame: *const trap.Frame) void {
// writeFn: ?vfs.Stream.WriteFn,
// ) Result(void)
fn provideStream(trap_frame: *trap.Frame) void {
+ setUserMemoryAccess(true);
+ defer setUserMemoryAccess(false);
+
const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
const readFn: ?vfs.Stream.ReadFn = @ptrFromInt(trap_frame.general_purpose_registers[11]);
const writeFn: ?vfs.Stream.WriteFn = @ptrFromInt(trap_frame.general_purpose_registers[12]);
@@ -93,6 +105,9 @@ fn provideStream(trap_frame: *trap.Frame) void {
// closeFn: ?vfs.File.CloseFn,
// ) Result(void)
fn provideFile(trap_frame: *trap.Frame) void {
+ setUserMemoryAccess(true);
+ defer setUserMemoryAccess(false);
+
const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
const openFn: vfs.File.OpenFn = @ptrFromInt(trap_frame.general_purpose_registers[11]);
const readFn: ?vfs.File.ReadFn = @ptrFromInt(trap_frame.general_purpose_registers[12]);
@@ -114,6 +129,9 @@ fn provideFile(trap_frame: *trap.Frame) void {
// callback: vfs.Hook.Callback,
// ) Result(void)
fn provideHook(trap_frame: *trap.Frame) void {
+ setUserMemoryAccess(true);
+ defer setUserMemoryAccess(false);
+
const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
const callback: vfs.Hook.Callback = @ptrFromInt(trap_frame.general_purpose_registers[11]);
@@ -144,6 +162,9 @@ fn mkdir(trap_frame: *trap.Frame) void {
// removeFn: vfs.DirHook.RemoveFn,
// ) Result(void)
fn provideDirHook(trap_frame: *trap.Frame) void {
+ setUserMemoryAccess(true);
+ defer setUserMemoryAccess(false);
+
const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
const provideFn: vfs.DirHook.ProvideFn = @ptrFromInt(trap_frame.general_purpose_registers[11]);
const findFn: vfs.DirHook.FindFn = @ptrFromInt(trap_frame.general_purpose_registers[12]);
@@ -168,6 +189,9 @@ fn remove(trap_frame: *const trap.Frame) void {
// read(handle: usize, buffer: [*]u8, len: usize) Result(usize)
fn read(proc: *const process.Info, trap_frame: *trap.Frame) void {
+ setUserMemoryAccess(true);
+ defer setUserMemoryAccess(false);
+
const handle = trap_frame.general_purpose_registers[10];
const buffer: [*]u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]);
const len = trap_frame.general_purpose_registers[12];
@@ -181,6 +205,9 @@ fn read(proc: *const process.Info, trap_frame: *trap.Frame) void {
// write(handle: usize, bytes: [*]const u8, len: usize) Result(usize)
fn write(proc: *const process.Info, trap_frame: *trap.Frame) void {
+ setUserMemoryAccess(true);
+ defer setUserMemoryAccess(false);
+
const handle = trap_frame.general_purpose_registers[10];
const bytes: [*]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]);
const len = trap_frame.general_purpose_registers[12];