#include "mango/syscall.h" # Registers: # rax = syscall ID + return value # rdi = 1st parameter # rsi = 2nd parameter # rdx = 3rd parameter # r12 = 4th parameter # r8 = 5th parameter # r9 = 6th parameter # r13 = 7th parameter # r14 = 8th parameter .macro SYSCALL_GATE name index args .global \name .type \name, @function \name: push %rbp mov %rsp, %rbp # Syscall ID mov $\index, %rax # The syscall instruction uses rcx, so move this parameter to r12 .if \args >= 4 pushq %r12 movq %rcx, %r12 .endif # r13 and r14 are callee-saved so we save it beforehand .if \args >= 7 pushq %r13 movq 16(%rbp), %r13 .endif .if \args >= 8 pushq %r14 movq 24(%rbp), %r14 .endif syscall .if \args >= 8 popq %r14 .endif .if \args >= 7 popq %r13 .endif .if \args >= 4 popq %r12 .endif pop %rbp ret .endm SYSCALL_GATE task_exit SYS_TASK_EXIT 1 SYSCALL_GATE task_self SYS_TASK_SELF 0 SYSCALL_GATE task_create SYS_TASK_CREATE 5 SYSCALL_GATE task_create_thread SYS_TASK_CREATE_THREAD 6 SYSCALL_GATE task_get_address_space SYS_TASK_GET_ADDRESS_SPACE 1 SYSCALL_GATE thread_start SYS_THREAD_START 1 SYSCALL_GATE vm_object_create SYS_VM_OBJECT_CREATE 5 SYSCALL_GATE vm_object_read SYS_VM_OBJECT_READ 5 SYSCALL_GATE vm_object_write SYS_VM_OBJECT_WRITE 5 SYSCALL_GATE vm_object_copy SYS_VM_OBJECT_COPY 6 SYSCALL_GATE address_space_read SYS_ADDRESS_SPACE_READ 5 SYSCALL_GATE address_space_write SYS_ADDRESS_SPACE_WRITE 5 SYSCALL_GATE address_space_map SYS_ADDRESS_SPACE_MAP 7 SYSCALL_GATE address_space_unmap SYS_ADDRESS_SPACE_UNMAP 3 SYSCALL_GATE address_space_reserve SYS_ADDRESS_SPACE_RESERVE 4 SYSCALL_GATE address_space_release SYS_ADDRESS_SPACE_RELEASE 3 SYSCALL_GATE kern_log SYS_KERN_LOG 1 SYSCALL_GATE kern_handle_close SYS_KERN_HANDLE_CLOSE 1 SYSCALL_GATE kern_handle_duplicate SYS_KERN_HANDLE_DUPLICATE 2 SYSCALL_GATE kern_config_get SYS_KERN_CONFIG_GET 3 SYSCALL_GATE kern_config_set SYS_KERN_CONFIG_SET 3 SYSCALL_GATE channel_create SYS_CHANNEL_CREATE 2 SYSCALL_GATE port_create SYS_PORT_CREATE 1 SYSCALL_GATE port_connect SYS_PORT_CONNECT 3 SYSCALL_GATE port_disconnect SYS_PORT_DISCONNECT 1 SYSCALL_GATE msg_send SYS_MSG_SEND 5 SYSCALL_GATE msg_recv SYS_MSG_RECV 4 SYSCALL_GATE msg_reply SYS_MSG_REPLY 4 SYSCALL_GATE msg_read SYS_MSG_READ 6 SYSCALL_GATE msg_write SYS_MSG_WRITE 6 SYSCALL_GATE vm_controller_create SYS_VM_CONTROLLER_CREATE 1 SYSCALL_GATE vm_controller_recv SYS_VM_CONTROLLER_RECV 2 SYSCALL_GATE vm_controller_recv_async SYS_VM_CONTROLLER_RECV_ASYNC 3 SYSCALL_GATE vm_controller_create_object SYS_VM_CONTROLLER_CREATE_OBJECT 7 SYSCALL_GATE vm_controller_detach_object SYS_VM_CONTROLLER_DETACH_OBJECT 2 SYSCALL_GATE vm_controller_supply_pages SYS_VM_CONTROLLER_SUPPLY_PAGES 6 SYSCALL_GATE kern_object_wait SYS_KERN_OBJECT_WAIT 2