Browse Source

Kernel: Implement syscall entry for x86_64

Gunnar Beutner 4 years ago
parent
commit
b6435372cc
1 changed files with 27 additions and 2 deletions
  1. 27 2
      Kernel/Syscall.cpp

+ 27 - 2
Kernel/Syscall.cpp

@@ -55,8 +55,33 @@ NEVER_INLINE void syscall_asm_entry_dummy()
     asm(
         ".globl syscall_asm_entry\n"
         "syscall_asm_entry:\n"
-        "    cli\n"
-        "    hlt\n");
+        "    pushq $0x0\n"
+        "    pushq %r15\n"
+        "    pushq %r14\n"
+        "    pushq %r13\n"
+        "    pushq %r12\n"
+        "    pushq %r11\n"
+        "    pushq %r10\n"
+        "    pushq %r9\n"
+        "    pushq %r8\n"
+        "    pushq %rax\n"
+        "    pushq %rcx\n"
+        "    pushq %rdx\n"
+        "    pushq %rbx\n"
+        "    pushq %rsp\n"
+        "    pushq %rbp\n"
+        "    pushq %rsi\n"
+        "    pushq %rdi\n"
+        "    pushq %rsp \n" /* set TrapFrame::regs */
+        "    subq $" __STRINGIFY(TRAP_FRAME_SIZE - 8) ", %rsp \n"
+        "    subq $0x8, %rsp\n" /* align stack */
+        "    lea 0x8(%rsp), %rdi \n"
+        "    cld\n"
+        "    call enter_trap_no_irq \n"
+        "    lea 0x8(%rsp), %rdi \n"
+        "    call syscall_handler\n"
+        "    addq $0x8, %rsp\n" /* undo alignment */
+        "    jmp common_trap_exit \n");
 #endif
     // clang-format on
 }