diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-09-19 18:59:34 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-09-19 18:59:34 +0200 |
| commit | b2bd3103d878628d7b2eeb68f469c00c9574f94a (patch) | |
| tree | 919044b20da53dd01173b0dd3807443d52ef13db /src | |
| parent | 745fd1b702ebe4d2913118372d67ad8bac489516 (diff) | |
| download | box64-b2bd3103d878628d7b2eeb68f469c00c9574f94a.tar.gz box64-b2bd3103d878628d7b2eeb68f469c00c9574f94a.zip | |
Fixed va_list conversion for aarch64
Diffstat (limited to 'src')
| -rwxr-xr-x | src/include/myalign.h | 62 |
1 files changed, 31 insertions, 31 deletions
diff --git a/src/include/myalign.h b/src/include/myalign.h index 0ad36a93..80cc1449 100755 --- a/src/include/myalign.h +++ b/src/include/myalign.h @@ -21,31 +21,31 @@ typedef struct { void *reg_save_area; } va_list[1]; */ -#define CREATE_SYSV_VALIST(A) \ - va_list sysv_varargs; \ +#define CREATE_SYSV_VALIST(A) \ + va_list sysv_varargs; \ sysv_varargs->gp_offset=X64_VA_MAX_REG; \ sysv_varargs->fp_offset=X64_VA_MAX_XMM; \ - sysv_varargs->reg_save_area=A; \ - sysv_varargs->overflow_arg_area=A; + sysv_varargs->reg_save_area=(A); \ + sysv_varargs->overflow_arg_area=A -#define CONVERT_VALIST(A) \ - va_list sysv_varargs; \ +#define CONVERT_VALIST(A) \ + va_list sysv_varargs; \ sysv_varargs->gp_offset=(A)->gp_offset; \ sysv_varargs->fp_offset=(A)->fp_offset; \ sysv_varargs->reg_save_area=(A)->reg_save_area; \ sysv_varargs->overflow_arg_area=(A)->overflow_arg_area; #define CREATE_VALIST_FROM_VAARG(STACK, SCRATCH, N) \ - va_list sysv_varargs; \ - sysv_varargs->gp_offset=(6-((N<6)?N:6))*8;\ - sysv_varargs->fp_offset=(6*8); \ - sysv_varargs->reg_save_area=SCRATCH; \ - sysv_varargs->overflow_arg_area=STACK; \ - { \ - uint64_t *p = (uint64_t*)SCRATCH; \ - p[0]=R_RDI; p[1]=R_RSI; p[2]=R_RDX; \ - p[3]=R_RCX; p[4]=R_R8; p[5]=R_R9; \ - memcpy(&p[6], emu->xmm, 8*16); \ + va_list sysv_varargs; \ + sysv_varargs->gp_offset=(6-(((N)<6)?(N):6))*8; \ + sysv_varargs->fp_offset=(6*8); \ + sysv_varargs->reg_save_area=(SCRATCH); \ + sysv_varargs->overflow_arg_area=(STACK); \ + { \ + uint64_t *p = (uint64_t*)(SCRATCH); \ + p[0]=R_RDI; p[1]=R_RSI; p[2]=R_RDX; \ + p[3]=R_RCX; p[4]=R_R8; p[5]=R_R9; \ + memcpy(&p[6], emu->xmm, 8*16); \ } @@ -66,28 +66,28 @@ typedef struct va_list { va_list sysv_varargs; \ sysv_varargs.__gr_offs=(8*8); \ sysv_varargs.__vr_offs=(8*16); \ - sysv_varargs.__stack=A; + sysv_varargs.__stack=(A) -#define CONVERT_VALIST(A) \ - va_list sysv_varargs; \ +#define CONVERT_VALIST(A) \ + va_list sysv_varargs; \ sysv_varargs.__gr_offs=-(6*8)+(A)->gp_offset; \ sysv_varargs.__vr_offs=-(8*16)+((A)->fp_offset-X64_VA_MAX_REG); \ sysv_varargs.__stack=(A)->overflow_arg_area; \ sysv_varargs.__gr_top=(A)->reg_save_area + X64_VA_MAX_REG; \ sysv_varargs.__vr_top=(A)->reg_save_area + X64_VA_MAX_XMM; -#define CREATE_VALIST_FROM_VAARG(STACK, SCRATCH, N) \ - va_list sysv_varargs; \ - sysv_varargs.__gr_offs=(8*(2+((N<6)?N:6))); \ - sysv_varargs.__vr_offs=0; \ - sysv_varargs.__stack=STACK; \ - sysv_varargs.__gr_top=SCRATCH + X64_VA_MAX_REG; \ - sysv_varargs.__vr_top=SCRATCH + X64_VA_MAX_XMM; \ - { \ - uint64_t *p = (uint64_t*)SCRATCH; \ - p[0]=R_RDI; p[1]=R_RSI; p[2]=R_RDX; \ - p[3]=R_RCX; p[4]=R_R8; p[5]=R_R9; \ - memcpy(&p[6], emu->xmm, 8*16); \ +#define CREATE_VALIST_FROM_VAARG(STACK, SCRATCH, N) \ + va_list sysv_varargs; \ + sysv_varargs.__gr_offs=-(6*8)+(8*(((N)<6)?(N):6)); \ + sysv_varargs.__vr_offs=-(8*16); \ + sysv_varargs.__stack=(STACK); \ + sysv_varargs.__gr_top=(void*)((uintptr_t)(SCRATCH) + X64_VA_MAX_REG); \ + sysv_varargs.__vr_top=(void*)((uintptr_t)(SCRATCH) + X64_VA_MAX_XMM); \ + { \ + uintptr_t *p = (uintptr_t*)(SCRATCH); \ + p[0]=R_RDI; p[1]=R_RSI; p[2]=R_RDX; \ + p[3]=R_RCX; p[4]=R_R8; p[5]=R_R9; \ + memcpy(&p[6], emu->xmm, 8*16); \ } #elif defined(__powerpc64__) |