Mercurial > pub > dyncall > dyncall
diff dyncall/dyncall_call_x64.S @ 339:4f9f49fb82ce
- x64 SysV syscall support
author | Tassilo Philipp |
---|---|
date | Sat, 04 Jan 2020 01:07:49 +0100 |
parents | f5577f6bf97a |
children | ab2d78e48ca2 |
line wrap: on
line diff
--- a/dyncall/dyncall_call_x64.S Fri Jan 03 22:48:20 2020 +0100 +++ b/dyncall/dyncall_call_x64.S Sat Jan 04 01:07:49 2020 +0100 @@ -6,7 +6,7 @@ Description: All x64 abi call kernel implementation License: - Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>, + Copyright (c) 2007-2020 Daniel Adler <dadler@uni-goettingen.de>, Tassilo Philipp <tphilipp@potion-studios.com> Permission to use, copy, modify, and distribute this software for any @@ -60,7 +60,7 @@ ADD(LIT(31),RDI) /* Align stack to 32-byte. */ AND(LIT(-32),RDI) - ADD(LIT(8),RDI) /* Adjust by 8-byte for the return-address. */ + ADD(LIT(8),RDI) /* Adjust by 8-byte for the return-address. */ SUB(RDI,RSP) /* Setup stack frame by subtracting the size of arguments. */ MOV(RDI,RCX) /* Store number of bytes to copy to stack in RCX (for rep movsb). */ @@ -143,5 +143,30 @@ END_PROC(dcCall_x64_win64) +/*--------------------------------------------------------------------------- + + Call Kernel for x64 System V syscalls + + Input: + RDI : pointer to arguments + RSI : syscall id + +*/ + +GLOBAL(dcCall_x64_sys_syscall_sysv) +BEGIN_PROC(dcCall_x64_sys_syscall_sysv) + + MOV(RSI,RAX) /* load system call id. */ + MOV(QWORD(RDI,40),R9) /* copy first six int/pointer arguments to RDI, RSI, RDX, R10, R8, R9. */ + MOV(QWORD(RDI,32),R8) + MOV(QWORD(RDI,24),R10) + MOV(QWORD(RDI,16),RDX) + MOV(QWORD(RDI,8),RSI) + MOV(QWORD(RDI,0),RDI) /* Set RDI last to not overwrite it to soon. */ + SYSCALL + RET() + +END_PROC(dcCall_x64_sys_syscall_sysv) + END_ASM