summaryrefslogtreecommitdiff
path: root/kernel/src/sys/syscall_asm.S
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/sys/syscall_asm.S')
-rw-r--r--kernel/src/sys/syscall_asm.S40
1 files changed, 40 insertions, 0 deletions
diff --git a/kernel/src/sys/syscall_asm.S b/kernel/src/sys/syscall_asm.S
new file mode 100644
index 0000000..a9942ca
--- /dev/null
+++ b/kernel/src/sys/syscall_asm.S
@@ -0,0 +1,40 @@
+.extern syscall_handler
+
+.macro pushall
+ push %rax
+ push %rcx
+ push %rdx
+ push %rsi
+ push %rdi
+ push %r8
+ push %r9
+ push %r10
+ push %r11
+ pushfq
+.endm
+
+.macro popall
+ popfq
+ pop %r11
+ pop %r10
+ pop %r9
+ pop %r8
+ pop %rdi
+ pop %rsi
+ pop %rdx
+ pop %rcx
+ pop %rax
+.endm
+
+.global __syscall
+__syscall:
+ pushq %rcx
+ pushq %r11
+
+ pushall
+ call syscall_handler
+ popall
+
+ popfq
+ popq %rcx
+ sysretq