diff options
author | Freya Murphy <freya@freyacat.org> | 2025-04-28 11:09:43 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2025-04-28 11:09:43 -0400 |
commit | 103e9e001036dce5cd34209b62a416fd1f34abbf (patch) | |
tree | 4363f631c929f23b618c94f4d1a05ce51c4e6de8 /kernel/syscall.c | |
parent | add stderr (diff) | |
download | comus-103e9e001036dce5cd34209b62a416fd1f34abbf.tar.gz comus-103e9e001036dce5cd34209b62a416fd1f34abbf.tar.bz2 comus-103e9e001036dce5cd34209b62a416fd1f34abbf.zip |
move context save area to pcb not in stack
Diffstat (limited to 'kernel/syscall.c')
-rw-r--r-- | kernel/syscall.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/kernel/syscall.c b/kernel/syscall.c index b595b6a..44bfe5f 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -10,11 +10,11 @@ static struct pcb *pcb; -#define RET(type, name) type *name = (type *)(&pcb->regs->rax) -#define ARG1(type, name) type name = (type)(pcb->regs->rdi) -#define ARG2(type, name) type name = (type)(pcb->regs->rsi) -#define ARG3(type, name) type name = (type)(pcb->regs->rdx) -#define ARG4(type, name) type name = (type)(pcb->regs->rcx) +#define RET(type, name) type *name = (type *)(&pcb->regs.rax) +#define ARG1(type, name) type name = (type)(pcb->regs.rdi) +#define ARG2(type, name) type name = (type)(pcb->regs.rsi) +#define ARG3(type, name) type name = (type)(pcb->regs.rdx) +#define ARG4(type, name) type name = (type)(pcb->regs.rcx) __attribute__((noreturn)) static int sys_exit(void) { @@ -255,20 +255,16 @@ static int (*syscall_tbl[N_SYSCALLS])(void) = { [SYS_drm] = sys_drm, [SYS_ticks] = sys_ticks, }; -void syscall_handler(struct cpu_regs *regs) +void syscall_handler(void) { uint64_t num; int (*handler)(void); int ret = 1; - // make sure were in the kernel memory context - mem_ctx_switch(kernel_mem_ctx); - // update data pcb = current_pcb; - pcb->regs = regs; - num = pcb->regs->rax; - pcb->regs->rax = 0; + num = pcb->regs.rax; + pcb->regs.rax = 0; current_pcb = NULL; // check for invalid syscall @@ -287,7 +283,7 @@ void syscall_handler(struct cpu_regs *regs) // on failure, set rax if (ret) - pcb->regs->rax = ret; + pcb->regs.rax = ret; // return to current pcb current_pcb = pcb; |