Merge pull request #88 from SamTebbs33/feature/refactor-syscall-handler-type

Add syscall args to syscall handler type
This commit is contained in:
Sam Tebbs 2019-09-24 11:05:41 +01:00 committed by GitHub
commit 4a1209785a

View file

@ -11,7 +11,7 @@ pub const INTERRUPT: u16 = 0x80;
pub const NUM_HANDLERS: u16 = 256; pub const NUM_HANDLERS: u16 = 256;
/// A syscall handler /// A syscall handler
pub const SyscallHandler = fn (ctx: *arch.InterruptContext) u32; pub const SyscallHandler = fn (ctx: *arch.InterruptContext, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32;
/// Errors that syscall utility functions can throw /// Errors that syscall utility functions can throw
pub const SyscallError = error{ pub const SyscallError = error{
@ -46,7 +46,7 @@ fn handle(ctx: *arch.InterruptContext) void {
const syscall = ctx.eax; const syscall = ctx.eax;
if (isValidSyscall(syscall)) { if (isValidSyscall(syscall)) {
if (handlers[syscall]) |handler| { if (handlers[syscall]) |handler| {
ctx.eax = handler(ctx); ctx.eax = handler(ctx, syscallArg(ctx, 0), syscallArg(ctx, 1), syscallArg(ctx, 2), syscallArg(ctx, 3), syscallArg(ctx, 4));
} else { } else {
log.logWarning("Syscall {} triggered but not registered\n", syscall); log.logWarning("Syscall {} triggered but not registered\n", syscall);
} }
@ -219,34 +219,34 @@ pub fn init(comptime options: type) void {
/// Tests /// Tests
var testInt: u32 = 0; var testInt: u32 = 0;
fn testHandler0(ctx: *arch.InterruptContext) u32 { fn testHandler0(ctx: *arch.InterruptContext, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
testInt += 1; testInt += 1;
return 0; return 0;
} }
fn testHandler1(ctx: *arch.InterruptContext) u32 { fn testHandler1(ctx: *arch.InterruptContext, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
testInt += syscallArg(ctx, 0); testInt += arg1;
return 1; return 1;
} }
fn testHandler2(ctx: *arch.InterruptContext) u32 { fn testHandler2(ctx: *arch.InterruptContext, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
testInt += syscallArg(ctx, 1); testInt += arg1 + arg2;
return testHandler1(ctx) + 1; return 2;
} }
fn testHandler3(ctx: *arch.InterruptContext) u32 { fn testHandler3(ctx: *arch.InterruptContext, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
testInt += syscallArg(ctx, 2); testInt += arg1 + arg2 + arg3;
return testHandler2(ctx) + 1; return 3;
} }
fn testHandler4(ctx: *arch.InterruptContext) u32 { fn testHandler4(ctx: *arch.InterruptContext, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
testInt += syscallArg(ctx, 3); testInt += arg1 + arg2 + arg3 + arg4;
return testHandler3(ctx) + 1; return 4;
} }
fn testHandler5(ctx: *arch.InterruptContext) u32 { fn testHandler5(ctx: *arch.InterruptContext, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
testInt += syscallArg(ctx, 4); testInt += arg1 + arg2 + arg3 + arg4 + arg5;
return testHandler4(ctx) + 1; return 5;
} }
test "registerSyscall returns SyscallExists" { test "registerSyscall returns SyscallExists" {