95 lines
2.4 KiB
ArmAsm
95 lines
2.4 KiB
ArmAsm
#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 vm_region_create SYS_VM_REGION_CREATE 8
|
|
SYSCALL_GATE vm_region_kill SYS_VM_REGION_KILL 1
|
|
SYSCALL_GATE vm_region_read SYS_VM_REGION_READ 5
|
|
SYSCALL_GATE vm_region_write SYS_VM_REGION_WRITE 5
|
|
SYSCALL_GATE vm_region_map_absolute SYS_VM_REGION_MAP_ABSOLUTE 7
|
|
SYSCALL_GATE vm_region_map_relative SYS_VM_REGION_MAP_RELATIVE 7
|
|
SYSCALL_GATE vm_region_unmap_absolute SYS_VM_REGION_UNMAP_ABSOLUTE 3
|
|
SYSCALL_GATE vm_region_unmap_relative SYS_VM_REGION_UNMAP_RELATIVE 3
|
|
|
|
SYSCALL_GATE kern_log SYS_KERN_LOG 1
|
|
SYSCALL_GATE kern_handle_close SYS_KERN_HANDLE_CLOSE 1
|
|
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
|
|
|