#include <amd64/regsasm.h>

.extern syscall_dispatch

.global syscall_entry
syscall_entry:
  cli

  movq %rsp, %gs:0
  movq %gs:8, %rsp
 
  pushq $0x1b
  pushq %gs:0
  pushq %r11
  pushq $0x23
  pushq %rcx
  pushq $0
  pushq $0

  push_regs

  movw $0x10, %ax
  movw %ax, %ds
  movw %ax, %es
  movw %ax, %ss

  cld

  movq %rsp, %rdi

  movq %cr3, %rax; pushq %rax

  movq %rsp, %rbp

  andq $-16, %rsp

  callq syscall_dispatch

  movq %rbp, %rsp

  popq %rbx; movq %rbx, %cr3

  pop_regs_skip_rax
  
  addq $56, %rsp
  movq %gs:0, %rsp
  
  sysretq
