From dcc68154b2933ffede8e9d4faf8da931c5dac8f5 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Sat, 20 Sep 2025 00:28:28 +0200 Subject: [PATCH] Make syscalls accept their interrupt frame, remove useless intr_eoi() param --- kernel/hal/x86_64/intr.c | 14 +++++--------- kernel/hal/x86_64/intr.h | 2 -- kernel/syscall/sched.c | 4 +--- kernel/syscall/syscall.h | 24 ++++++++++++++++-------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/kernel/hal/x86_64/intr.c b/kernel/hal/x86_64/intr.c index 9160c10..a74acb5 100644 --- a/kernel/hal/x86_64/intr.c +++ b/kernel/hal/x86_64/intr.c @@ -17,8 +17,6 @@ #include "proc/ps2kbproc/ps2kbproc.h" #include "rbuf/rbuf.h" -IntrStackFrame *INTR_CURRENT_FRAME; - typedef struct BackTraceFrame { struct BackTraceFrame *rbp; uint64_t rip; @@ -182,8 +180,8 @@ void hal_syscalldispatch(IntrStackFrame *frame) { } uint64_t cr3; asm volatile("mov %%cr3, %0" : "=r"(cr3)); - int32_t ret = fn(frame->regs.rdi, frame->regs.rsi, frame->regs.rdx, - frame->regs.r10, frame->regs.r8, frame->regs.r9); + int32_t ret = fn(frame, frame->regs.rdi, frame->regs.rsi, frame->regs.rdx, + frame->regs.r10, frame->regs.r8, frame->regs.r9); if (ret == E_DOSCHEDULING) { proc_sched((void *)frame); @@ -192,14 +190,12 @@ void hal_syscalldispatch(IntrStackFrame *frame) { } } -void intr_eoi(uint8_t irq) { +void intr_eoi() { io_out8(PIC2_CMD, PIC_EOI); io_out8(PIC1_CMD, PIC_EOI); } void intr_handleintr(IntrStackFrame *frame) { - INTR_CURRENT_FRAME = frame; - if (frame->trapnum <= 31) { kprintf("ERROR %s, 0x%lX\n", exceptions[frame->trapnum], frame->errnum); intr_dumpframe(frame); @@ -214,7 +210,7 @@ void intr_handleintr(IntrStackFrame *frame) { switch (frame->trapnum) { case INTR_IRQBASE+0: PIT_TICKS++; - intr_eoi(frame->trapnum - INTR_IRQBASE); + intr_eoi(); proc_sched((void *)frame); break; case INTR_IRQBASE+1: @@ -225,7 +221,7 @@ void intr_handleintr(IntrStackFrame *frame) { rbuf_push(&PS2KB_BUF.rbuf, b); spinlock_release(&PS2KB_BUF.spinlock); } - intr_eoi(frame->trapnum - INTR_IRQBASE); + intr_eoi(); break; } } else if (frame->trapnum == 0x80) { diff --git a/kernel/hal/x86_64/intr.h b/kernel/hal/x86_64/intr.h index b578d28..232f202 100644 --- a/kernel/hal/x86_64/intr.h +++ b/kernel/hal/x86_64/intr.h @@ -35,6 +35,4 @@ typedef struct { void intr_init(void); -IntrStackFrame *INTR_CURRENT_FRAME; - #endif // HAL_INTR_H_ diff --git a/kernel/syscall/sched.c b/kernel/syscall/sched.c index 44260e6..29714e1 100644 --- a/kernel/syscall/sched.c +++ b/kernel/syscall/sched.c @@ -11,9 +11,7 @@ int32_t SYSCALL0(sys_schedrelease) { Proc *proc = PROCS.current; spinlock_release(&PROCS.spinlock); - if (INTR_CURRENT_FRAME != NULL) { - proc_sched((void *)INTR_CURRENT_FRAME); - } + proc_sched((void *)frame); return E_OK; } diff --git a/kernel/syscall/syscall.h b/kernel/syscall/syscall.h index 4fa8903..fe6fa60 100644 --- a/kernel/syscall/syscall.h +++ b/kernel/syscall/syscall.h @@ -3,11 +3,13 @@ #include #include "compiler/attr.h" +#include "hal/hal.h" #define SYSCALLS_MAX 0xff #define SYSCALL0(name) \ - name(UNUSED uint64_t _1, \ + name(IntrStackFrame *frame, \ + UNUSED uint64_t _1, \ UNUSED uint64_t _2, \ UNUSED uint64_t _3, \ UNUSED uint64_t _4, \ @@ -16,7 +18,8 @@ ) #define SYSCALL1(name, arg1) \ - name(uint64_t arg1, \ + name(IntrStackFrame *frame, \ + uint64_t arg1, \ UNUSED uint64_t _2, \ UNUSED uint64_t _3, \ UNUSED uint64_t _4, \ @@ -25,7 +28,8 @@ ) #define SYSCALL2(name, arg1, arg2) \ - name(uint64_t arg1, \ + name(IntrStackFrame *frame, \ + uint64_t arg1, \ uint64_t arg2, \ UNUSED uint64_t _3, \ UNUSED uint64_t _4, \ @@ -34,7 +38,8 @@ ) #define SYSCALL3(name, arg1, arg2, arg3) \ - name(uint64_t arg1, \ + name(IntrStackFrame *frame, \ + uint64_t arg1, \ uint64_t arg2, \ uint64_t arg3, \ UNUSED uint64_t _4, \ @@ -43,7 +48,8 @@ ) #define SYSCALL4(name, arg1, arg2, arg3, arg4) \ - name(uint64_t arg1, \ + name(IntrStackFrame *frame, \ + uint64_t arg1, \ uint64_t arg2, \ uint64_t arg3, \ uint64_t arg4, \ @@ -52,7 +58,8 @@ ) #define SYSCALL5(name, arg1, arg2, arg3, arg4, arg5) \ - name(uint64_t arg1, \ + name(IntrStackFrame *frame, \ + uint64_t arg1, \ uint64_t arg2, \ uint64_t arg3, \ uint64_t arg4, \ @@ -61,7 +68,8 @@ ) #define SYSCALL6(name, arg1, arg2, arg3, arg4, arg5, arg6) \ - name(uint64_t arg1, \ + name(IntrStackFrame *frame, \ + uint64_t arg1, \ uint64_t arg2, \ uint64_t arg3, \ uint64_t arg4, \ @@ -69,7 +77,7 @@ uint64_t arg6 \ ) -typedef int32_t (*SyscallFn)(uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t); +typedef int32_t (*SyscallFn)(IntrStackFrame *, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t); extern SyscallFn SYSCALL_TABLE[SYSCALLS_MAX];