# HG changeset patch # User Tassilo Philipp # Date 1578175202 -3600 # Node ID ab2d78e48ca2b88375564b9471218a1ad4b3c352 # Parent 6e33db95e724ea620eee4c8909b70145afc31d98 - gen-masm . fallback on clang if gcc not available . consolidated use of redundant scripts . regen of portasm based masm files - minor symbol name changes for clarity/consistency diff -r 6e33db95e724 -r ab2d78e48ca2 dyncall/dyncall_call_x64.S --- a/dyncall/dyncall_call_x64.S Sat Jan 04 22:48:51 2020 +0100 +++ b/dyncall/dyncall_call_x64.S Sat Jan 04 23:00:02 2020 +0100 @@ -153,8 +153,8 @@ */ -GLOBAL(dcCall_x64_sys_syscall_sysv) -BEGIN_PROC(dcCall_x64_sys_syscall_sysv) +GLOBAL(dcCall_x64_syscall_sysv) +BEGIN_PROC(dcCall_x64_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. */ @@ -166,7 +166,7 @@ SYSCALL RET() -END_PROC(dcCall_x64_sys_syscall_sysv) +END_PROC(dcCall_x64_syscall_sysv) END_ASM diff -r 6e33db95e724 -r ab2d78e48ca2 dyncall/dyncall_call_x64.h --- a/dyncall/dyncall_call_x64.h Sat Jan 04 22:48:51 2020 +0100 +++ b/dyncall/dyncall_call_x64.h Sat Jan 04 23:00:02 2020 +0100 @@ -54,7 +54,7 @@ void dcCall_x64_sysv(DCsize stacksize, DCpointer stackdata, DCpointer regdata_i, DCpointer regdata_f, DCpointer target); void dcCall_x64_win64(DCsize stacksize, DCpointer stackdata, DCpointer regdata, DCpointer target); -void dcCall_x64_sys_syscall_sysv(DCpointer argdata, DCpointer target); +void dcCall_x64_syscall_sysv(DCpointer argdata, DCpointer target); #ifdef __cplusplus } diff -r 6e33db95e724 -r ab2d78e48ca2 dyncall/dyncall_call_x64_generic_masm.asm --- a/dyncall/dyncall_call_x64_generic_masm.asm Sat Jan 04 22:48:51 2020 +0100 +++ b/dyncall/dyncall_call_x64_generic_masm.asm Sat Jan 04 23:00:02 2020 +0100 @@ -1,6 +1,5 @@ ; auto-generated by gen-masm.sh .CODE - dcCall_x64_sysv PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push RBP @@ -34,7 +33,7 @@ pop RBX pop RBP ret -dcCALl_x64_sysv ENDP +dcCall_x64_sysv ENDP dcCall_x64_win64 PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push RBP @@ -67,4 +66,16 @@ pop RBP ret dcCall_x64_win64 ENDP +dcCall_x64_syscall_sysv PROC +OPTION PROLOGUE:NONE, EPILOGUE:NONE + mov RAX,RSI + mov R9,qword ptr [RDI+40] + mov R8,qword ptr [RDI+32] + mov R10,qword ptr [RDI+24] + mov RDX,qword ptr [RDI+16] + mov RSI,qword ptr [RDI+8] + mov RDI,qword ptr [RDI+0] + SYSCALL + ret +dcCall_x64_syscall_sysv ENDP END diff -r 6e33db95e724 -r ab2d78e48ca2 dyncall/dyncall_call_x86.S --- a/dyncall/dyncall_call_x86.S Sat Jan 04 22:48:51 2020 +0100 +++ b/dyncall/dyncall_call_x86.S Sat Jan 04 23:00:02 2020 +0100 @@ -182,8 +182,8 @@ */ -GLOBAL(dcCall_x86_sys_int80h_linux) -BEGIN_PROC(dcCall_x86_sys_int80h_linux) +GLOBAL(dcCall_x86_syscall_int80h_linux) +BEGIN_PROC(dcCall_x86_syscall_int80h_linux) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(EBX) /* save preserved. */ @@ -203,7 +203,7 @@ MOVL(EBP,ESP) /* epilog. */ POP(EBP) RET() -END_PROC(dcCall_x86_sys_int80h_linux) +END_PROC(dcCall_x86_syscall_int80h_linux) /*--- syscall int80 bsd ----------------------------------------------------- @@ -212,8 +212,8 @@ */ -GLOBAL(dcCall_x86_sys_int80h_bsd) -BEGIN_PROC(dcCall_x86_sys_int80h_bsd) +GLOBAL(dcCall_x86_syscall_int80h_bsd) +BEGIN_PROC(dcCall_x86_syscall_int80h_bsd) PUSH(EBP) /* prolog. */ MOVL(ESP,EBP) PUSH(ESI) /* save preserved. */ @@ -233,7 +233,7 @@ _do_int: INT(LIT(HEX(80))) RET() -END_PROC(dcCall_x86_sys_int80h_bsd) +END_PROC(dcCall_x86_syscall_int80h_bsd) END_ASM diff -r 6e33db95e724 -r ab2d78e48ca2 dyncall/dyncall_call_x86.h --- a/dyncall/dyncall_call_x86.h Sat Jan 04 22:48:51 2020 +0100 +++ b/dyncall/dyncall_call_x86.h Sat Jan 04 23:00:02 2020 +0100 @@ -53,14 +53,14 @@ */ #if defined(DC__OS_Plan9) /* No support for other cconvs on Plan9 and vice-versa. */ -void dcCall_x86_plan9 (DCpointer target, DCpointer stackdata, DCsize size); +void dcCall_x86_plan9 (DCpointer target, DCpointer stackdata, DCsize size); #else -void dcCall_x86_cdecl (DCpointer target, DCpointer stackdata, DCsize size); -void dcCall_x86_win32_std (DCpointer target, DCpointer stackdata, DCsize size); -void dcCall_x86_win32_fast (DCpointer target, DCpointer stackdata, DCsize size); -void dcCall_x86_win32_msthis (DCpointer target, DCpointer stackdata, DCsize size); -void dcCall_x86_sys_int80h_linux (DCpointer target, DCpointer stackdata, DCsize size); -void dcCall_x86_sys_int80h_bsd (DCpointer target, DCpointer stackdata, DCsize size); +void dcCall_x86_cdecl (DCpointer target, DCpointer stackdata, DCsize size); +void dcCall_x86_win32_std (DCpointer target, DCpointer stackdata, DCsize size); +void dcCall_x86_win32_fast (DCpointer target, DCpointer stackdata, DCsize size); +void dcCall_x86_win32_msthis (DCpointer target, DCpointer stackdata, DCsize size); +void dcCall_x86_syscall_int80h_linux(DCpointer target, DCpointer stackdata, DCsize size); +void dcCall_x86_syscall_int80h_bsd (DCpointer target, DCpointer stackdata, DCsize size); #endif #ifdef __cplusplus diff -r 6e33db95e724 -r ab2d78e48ca2 dyncall/dyncall_call_x86_generic_masm.asm --- a/dyncall/dyncall_call_x86_generic_masm.asm Sat Jan 04 22:48:51 2020 +0100 +++ b/dyncall/dyncall_call_x86_generic_masm.asm Sat Jan 04 23:00:02 2020 +0100 @@ -2,7 +2,6 @@ .386 .MODEL FLAT .CODE - _dcCall_x86_cdecl PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP @@ -89,10 +88,10 @@ pop EBP ret _dcCall_x86_win32_fast ENDP -_dcCall_x86_sys_int80h_linux PROC +_dcCall_x86_syscall_int80h_linux PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP - mov EBP,ESP + mov EBP,ESP push EBX push ESI push EDI @@ -110,11 +109,11 @@ mov ESP,EBP pop EBP ret -_dcCall_x86_sys_int80h_linux ENDP -_dcCall_x86_sys_int80h_bsd PROC +_dcCall_x86_syscall_int80h_linux ENDP +_dcCall_x86_syscall_int80h_bsd PROC OPTION PROLOGUE:NONE, EPILOGUE:NONE push EBP - mov EBP,ESP + mov EBP,ESP push ESI push EDI mov ESI,dword ptr [EBP+12] @@ -132,5 +131,5 @@ _do_int: int 80h ret -_dcCall_x86_sys_int80h_bsd ENDP +_dcCall_x86_syscall_int80h_bsd ENDP END diff -r 6e33db95e724 -r ab2d78e48ca2 dyncall/dyncall_callvm_x64.c --- a/dyncall/dyncall_callvm_x64.c Sat Jan 04 22:48:51 2020 +0100 +++ b/dyncall/dyncall_callvm_x64.c Sat Jan 04 23:00:02 2020 +0100 @@ -192,17 +192,17 @@ /* --- syscall ------------------------------------------------------------- */ #include -void dc_callvm_call_x64_sys_syscall_sysv(DCCallVM* in_self, DCpointer target) +void dc_callvm_call_x64_syscall_sysv(DCCallVM* in_self, DCpointer target) { /* syscalls can have up to 6 args, required to be "Only values of class INTEGER or class MEMORY" (from */ /* SysV manual), so we can use self->mRegData.i directly; verify this holds at least 6 values, though. */ assert(numIntRegs >= 6); DCCallVM_x64* self = (DCCallVM_x64*)in_self; - dcCall_x64_sys_syscall_sysv(self->mRegData.i, target); + dcCall_x64_syscall_sysv(self->mRegData.i, target); } -DCCallVM_vt gVT_x64_sys_syscall_sysv = +DCCallVM_vt gVT_x64_syscall_sysv = { &dc_callvm_free_x64 , &dc_callvm_reset_x64 @@ -217,16 +217,16 @@ , &dc_callvm_argDouble_x64 , &dc_callvm_argPointer_x64 , NULL /* argStruct */ -, (DCvoidvmfunc*) &dc_callvm_call_x64_sys_syscall_sysv -, (DCboolvmfunc*) &dc_callvm_call_x64_sys_syscall_sysv -, (DCcharvmfunc*) &dc_callvm_call_x64_sys_syscall_sysv -, (DCshortvmfunc*) &dc_callvm_call_x64_sys_syscall_sysv -, (DCintvmfunc*) &dc_callvm_call_x64_sys_syscall_sysv -, (DClongvmfunc*) &dc_callvm_call_x64_sys_syscall_sysv -, (DClonglongvmfunc*) &dc_callvm_call_x64_sys_syscall_sysv -, (DCfloatvmfunc*) &dc_callvm_call_x64_sys_syscall_sysv -, (DCdoublevmfunc*) &dc_callvm_call_x64_sys_syscall_sysv -, (DCpointervmfunc*) &dc_callvm_call_x64_sys_syscall_sysv +, (DCvoidvmfunc*) &dc_callvm_call_x64_syscall_sysv +, (DCboolvmfunc*) &dc_callvm_call_x64_syscall_sysv +, (DCcharvmfunc*) &dc_callvm_call_x64_syscall_sysv +, (DCshortvmfunc*) &dc_callvm_call_x64_syscall_sysv +, (DCintvmfunc*) &dc_callvm_call_x64_syscall_sysv +, (DClongvmfunc*) &dc_callvm_call_x64_syscall_sysv +, (DClonglongvmfunc*) &dc_callvm_call_x64_syscall_sysv +, (DCfloatvmfunc*) &dc_callvm_call_x64_syscall_sysv +, (DCdoublevmfunc*) &dc_callvm_call_x64_syscall_sysv +, (DCpointervmfunc*) &dc_callvm_call_x64_syscall_sysv , NULL /* callStruct */ }; @@ -253,7 +253,7 @@ case DC_CALL_SYS_DEFAULT: # if defined DC_UNIX case DC_CALL_SYS_X64_SYSCALL_SYSV: - vt = &gVT_x64_sys_syscall_sysv; break; + vt = &gVT_x64_syscall_sysv; break; # else self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; # endif diff -r 6e33db95e724 -r ab2d78e48ca2 dyncall/dyncall_callvm_x86.c --- a/dyncall/dyncall_callvm_x86.c Sat Jan 04 22:48:51 2020 +0100 +++ b/dyncall/dyncall_callvm_x86.c Sat Jan 04 23:00:02 2020 +0100 @@ -499,19 +499,19 @@ /* call syscall */ -void dc_callvm_call_x86_sys_int80h_linux(DCCallVM* in_self, DCpointer target) +void dc_callvm_call_x86_syscall_int80h_linux(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; - dcCall_x86_sys_int80h_linux( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); + dcCall_x86_syscall_int80h_linux( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } -void dc_callvm_call_x86_sys_int80h_bsd(DCCallVM* in_self, DCpointer target) +void dc_callvm_call_x86_syscall_int80h_bsd(DCCallVM* in_self, DCpointer target) { DCCallVM_x86* self = (DCCallVM_x86*) in_self; - dcCall_x86_sys_int80h_bsd( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); + dcCall_x86_syscall_int80h_bsd( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) ); } -DCCallVM_vt gVT_x86_sys_int80h_linux = +DCCallVM_vt gVT_x86_syscall_int80h_linux = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 @@ -526,20 +526,20 @@ , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ -, (DCvoidvmfunc*) &dc_callvm_call_x86_sys_int80h_linux -, (DCboolvmfunc*) &dc_callvm_call_x86_sys_int80h_linux -, (DCcharvmfunc*) &dc_callvm_call_x86_sys_int80h_linux -, (DCshortvmfunc*) &dc_callvm_call_x86_sys_int80h_linux -, (DCintvmfunc*) &dc_callvm_call_x86_sys_int80h_linux -, (DClongvmfunc*) &dc_callvm_call_x86_sys_int80h_linux -, (DClonglongvmfunc*) &dc_callvm_call_x86_sys_int80h_linux -, (DCfloatvmfunc*) &dc_callvm_call_x86_sys_int80h_linux -, (DCdoublevmfunc*) &dc_callvm_call_x86_sys_int80h_linux -, (DCpointervmfunc*) &dc_callvm_call_x86_sys_int80h_linux +, (DCvoidvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux +, (DCboolvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux +, (DCcharvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux +, (DCshortvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux +, (DCintvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux +, (DClongvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux +, (DClonglongvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux +, (DCfloatvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux +, (DCdoublevmfunc*) &dc_callvm_call_x86_syscall_int80h_linux +, (DCpointervmfunc*) &dc_callvm_call_x86_syscall_int80h_linux , NULL /* callStruct */ }; -DCCallVM_vt gVT_x86_sys_int80h_bsd = +DCCallVM_vt gVT_x86_syscall_int80h_bsd = { &dc_callvm_free_x86 , &dc_callvm_reset_x86 @@ -554,16 +554,16 @@ , &dc_callvm_argDouble_x86 , &dc_callvm_argPointer_x86 , NULL /* argStruct */ -, (DCvoidvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd -, (DCboolvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd -, (DCcharvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd -, (DCshortvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd -, (DCintvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd -, (DClongvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd -, (DClonglongvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd -, (DCfloatvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd -, (DCdoublevmfunc*) &dc_callvm_call_x86_sys_int80h_bsd -, (DCpointervmfunc*) &dc_callvm_call_x86_sys_int80h_bsd +, (DCvoidvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd +, (DCboolvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd +, (DCcharvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd +, (DCshortvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd +, (DCintvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd +, (DClongvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd +, (DClonglongvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd +, (DCfloatvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd +, (DCdoublevmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd +, (DCpointervmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd , NULL /* callStruct */ }; @@ -595,15 +595,15 @@ case DC_CALL_SYS_DEFAULT: # if defined DC_UNIX # if defined DC__OS_Linux - vt = &gVT_x86_sys_int80h_linux; break; + vt = &gVT_x86_syscall_int80h_linux; break; # else - vt = &gVT_x86_sys_int80h_bsd; break; + vt = &gVT_x86_syscall_int80h_bsd; break; # endif # else self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return; # endif - case DC_CALL_SYS_X86_INT80H_LINUX: vt = &gVT_x86_sys_int80h_linux; break; - case DC_CALL_SYS_X86_INT80H_BSD: vt = &gVT_x86_sys_int80h_bsd; break; + case DC_CALL_SYS_X86_INT80H_LINUX: vt = &gVT_x86_syscall_int80h_linux; break; + case DC_CALL_SYS_X86_INT80H_BSD: vt = &gVT_x86_syscall_int80h_bsd; break; #endif default: self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; diff -r 6e33db95e724 -r ab2d78e48ca2 dyncall/gen-masm.sh --- a/dyncall/gen-masm.sh Sat Jan 04 22:48:51 2020 +0100 +++ b/dyncall/gen-masm.sh Sat Jan 04 23:00:02 2020 +0100 @@ -1,7 +1,6 @@ #!/bin/sh +cd `dirname $0` -# Uses portasm to generates MASM sources for intel platforms. -printf "; auto-generated by `basename $0`\r\n" > dyncall_call_x86_generic_masm.asm -printf "; auto-generated by `basename $0`\r\n" > dyncall_call_x64_generic_masm.asm -gcc -E -P -DGEN_MASM dyncall_call_x86.S | awk '{printf "%s\r\n", $0}' >> dyncall_call_x86_generic_masm.asm -gcc -E -P -DGEN_MASM dyncall_call_x64.S | awk '{printf "%s\r\n", $0}' >> dyncall_call_x64_generic_masm.asm +../portasm/gen-masm.sh dyncall_call_x86 _generic_masm +../portasm/gen-masm.sh dyncall_call_x64 _generic_masm + diff -r 6e33db95e724 -r ab2d78e48ca2 dyncallback/dyncall_callback_x86_masm.asm --- a/dyncallback/dyncall_callback_x86_masm.asm Sat Jan 04 22:48:51 2020 +0100 +++ b/dyncallback/dyncall_callback_x86_masm.asm Sat Jan 04 23:00:02 2020 +0100 @@ -2,7 +2,6 @@ .386 .MODEL FLAT .CODE - DCThunk_size = 16 DCArgs_size = 20 DCValue_size = 8 diff -r 6e33db95e724 -r ab2d78e48ca2 dyncallback/gen-masm.sh --- a/dyncallback/gen-masm.sh Sat Jan 04 22:48:51 2020 +0100 +++ b/dyncallback/gen-masm.sh Sat Jan 04 23:00:02 2020 +0100 @@ -1,8 +1,6 @@ #!/bin/sh +cd `dirname $0` -# Uses portasm to generates MASM sources for intel platforms. -printf "; auto-generated by `basename $0`\r\n" >dyncall_callback_x86_masm.asm -printf "; auto-generated by `basename $0`\r\n" >dyncall_callback_x64_masm.asm -gcc -E -P -DGEN_MASM dyncall_callback_x86.S | awk '{printf "%s\r\n", $0}' >> dyncall_callback_x86_masm.asm -gcc -E -P -DGEN_MASM dyncall_callback_x64.S | awk '{printf "%s\r\n", $0}' >> dyncall_callback_x64_masm.asm +../portasm/gen-masm.sh dyncall_callback_x86 _masm +../portasm/gen-masm.sh dyncall_callback_x64 _masm diff -r 6e33db95e724 -r ab2d78e48ca2 portasm/README.txt --- a/portasm/README.txt Sat Jan 04 22:48:51 2020 +0100 +++ b/portasm/README.txt Sat Jan 04 23:00:02 2020 +0100 @@ -26,7 +26,7 @@ #include portasm-.S at front In order to generate MASM files for X86 and X64, run - 'gen-masm.sh ' script which reads .S and outputs .masm file. + 'gen-masm.sh []' script which reads .S and outputs .masm file. Common Macros: diff -r 6e33db95e724 -r ab2d78e48ca2 portasm/gen-masm.sh --- a/portasm/gen-masm.sh Sat Jan 04 22:48:51 2020 +0100 +++ b/portasm/gen-masm.sh Sat Jan 04 23:00:02 2020 +0100 @@ -1,3 +1,7 @@ #!/bin/sh -gcc -E -P -DGEN_MASM $1.S >$1.asm +`which gcc || which clang` -E -P -DGEN_MASM ${1:?Usage: $0 []}.S \ + | sed "/^$/d;1i\\ +; auto-generated by `basename $0` +;s/$/ /" \ + > $1$2.asm diff -r 6e33db95e724 -r ab2d78e48ca2 test/gen-masm/gen_masm.sh --- a/test/gen-masm/gen_masm.sh Sat Jan 04 22:48:51 2020 +0100 +++ b/test/gen-masm/gen_masm.sh Sat Jan 04 23:00:02 2020 +0100 @@ -1,3 +1,6 @@ -gcc -E -P -DGEN_MASM call_x86.S >call_x86.masm -gcc -E -P -DGEN_MASM call_x64.S >call_x64.masm +#!/bin/sh +cd `dirname $0` +../../portasm/gen-masm.sh call_x86 +../../portasm/gen-masm.sh call_x64 +