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.zig9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig
index 959a8ad..62176db 100644
--- a/src/lib/syscall.zig
+++ b/src/lib/syscall.zig
@@ -12,6 +12,7 @@ const trap = @import("trap.zig");
pub const Error = error{
Unimplemented,
+ ZeroAddressSupplied,
};
pub const HandleError = error{
@@ -36,8 +37,8 @@ pub const ErrorNameError = error{ErrorOutOfRange};
// errorName(value: usize, buffer: [*]u8, len: usize) !usize
fn errorName(trap_frame: *const trap.Frame) !usize {
const value_wide = trap_frame.general_purpose_registers[10];
- // fixme: Kernel panic if null pointer
- const buffer_ptr: [*]u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]);
+ const buffer_opt: ?[*]u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]);
+ const buffer_ptr = buffer_opt orelse return Error.ZeroAddressSupplied;
const len = trap_frame.general_purpose_registers[12];
const value = std.math.cast(u16, value_wide) orelse {
@@ -75,8 +76,8 @@ fn uprint(trap_frame: *const trap.Frame) void {
fn launch(trap_frame: *const trap.Frame) !usize {
const alignment = @alignOf(std.elf.Elf64_Ehdr);
const bytes_addr = trap_frame.general_purpose_registers[10];
- // fixme: Kernel panic if null pointer
- const bytes_ptr: [*]align(alignment) const u8 = @ptrFromInt(bytes_addr);
+ const bytes_opt: ?[*]align(alignment) const u8 = @ptrFromInt(bytes_addr);
+ const bytes_ptr = bytes_opt orelse return Error.ZeroAddressSupplied;
const len = trap_frame.general_purpose_registers[11];
const bytes = bytes_ptr[0..len];