diff options
author | Ian Moffett <ian@osmora.org> | 2025-09-17 19:21:57 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-09-17 19:21:57 -0400 |
commit | 8e268df60bde6b5548b849cc9b83a224a74b3e43 (patch) | |
tree | bdf63b45702b9f926400dd621571a2ee42aafb4c /src/sys/arch/amd64 | |
parent | f90b091a023ba80d1901eab70baf44af03921ace (diff) |
kern: Add syscall entry and SYS_exit syscall
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/sys/arch/amd64')
-rw-r--r-- | src/sys/arch/amd64/cpu/cpu_conf.c | 3 | ||||
-rw-r--r-- | src/sys/arch/amd64/cpu/trap.S | 6 | ||||
-rw-r--r-- | src/sys/arch/amd64/cpu/trap.c | 19 |
3 files changed, 28 insertions, 0 deletions
diff --git a/src/sys/arch/amd64/cpu/cpu_conf.c b/src/sys/arch/amd64/cpu/cpu_conf.c index e462ef3..531f53b 100644 --- a/src/sys/arch/amd64/cpu/cpu_conf.c +++ b/src/sys/arch/amd64/cpu/cpu_conf.c @@ -36,6 +36,8 @@ #include <machine/gdt.h> #include <string.h> +extern void syscall_isr(void); + /* * Initialize interrupt vectors */ @@ -54,6 +56,7 @@ init_vectors(void) idt_set_desc(0xC, IDT_TRAP_GATE, ISR(ss_fault), 0); idt_set_desc(0xD, IDT_TRAP_GATE, ISR(general_prot), 0); idt_set_desc(0xE, IDT_TRAP_GATE, ISR(page_fault), 0); + idt_set_desc(0x80, IDT_USER_GATE, ISR(syscall_isr), 0); } void diff --git a/src/sys/arch/amd64/cpu/trap.S b/src/sys/arch/amd64/cpu/trap.S index ef5c14f..6e4d58c 100644 --- a/src/sys/arch/amd64/cpu/trap.S +++ b/src/sys/arch/amd64/cpu/trap.S @@ -107,3 +107,9 @@ INTR_ENTRY(lapic_tmr_isr) mov %rsp, %rdi call md_sched_switch INTR_EXIT(lapic_tmr_isr) + + .global syscall_isr +INTR_ENTRY(syscall_isr) + mov %rsp, %rdi + call trap_syscall +INTR_EXIT(syscall_isr) diff --git a/src/sys/arch/amd64/cpu/trap.c b/src/sys/arch/amd64/cpu/trap.c index 046263b..6ddc079 100644 --- a/src/sys/arch/amd64/cpu/trap.c +++ b/src/sys/arch/amd64/cpu/trap.c @@ -36,6 +36,7 @@ #include <sys/cdefs.h> #include <sys/panic.h> #include <sys/syslog.h> +#include <sys/syscall.h> #include <machine/trap.h> /* @@ -146,6 +147,24 @@ trapframe_dump(struct trapframe *tf) } void +trap_syscall(struct trapframe *tf) +{ + struct syscall_args scargs = { + .arg[0] = tf->rdi, + .arg[1] = tf->rsi, + .arg[2] = tf->rdx, + .arg[3] = tf->r10, + .arg[4] = tf->r9, + .arg[5] = tf->r8, + .tf = tf + }; + + if (tf->rax < MAX_SYSCALLS && tf->rax > 0) { + tf->rax = g_sctab[tf->rax](&scargs); + } +} + +void trap_handler(struct trapframe *tf) { trapframe_dump(tf); |