summaryrefslogtreecommitdiff
path: root/src/sys/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/arch')
-rw-r--r--src/sys/arch/amd64/cpu/cpu_conf.c3
-rw-r--r--src/sys/arch/amd64/cpu/trap.S6
-rw-r--r--src/sys/arch/amd64/cpu/trap.c19
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);