diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/syscall.zig | 27 |
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]; |