diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-03-25 09:25:25 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-03-25 09:25:25 +0000 |
| commit | afae5d80c7554d6f9d19af6c1a3cc78e33313074 (patch) | |
| tree | 6804679a736234596699432bf9b7460cd01f1a5d /src/include | |
| parent | 5e680e0f6678a9b9c51b603c8ea1333c325b2d26 (diff) | |
| download | box64-afae5d80c7554d6f9d19af6c1a3cc78e33313074.tar.gz box64-afae5d80c7554d6f9d19af6c1a3cc78e33313074.zip | |
[RV64][LA464][PPC64] Fixed some issues with VALIST handling
Diffstat (limited to 'src/include')
| -rwxr-xr-x | src/include/myalign.h | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/include/myalign.h b/src/include/myalign.h index cc4922bd..1a0f60bf 100755 --- a/src/include/myalign.h +++ b/src/include/myalign.h @@ -114,8 +114,8 @@ typdef struct { { \ uintptr_t *p = (uintptr_t*)(SCRATCH); \ int n = (X64_VA_MAX_REG - (VA)->gp_offset)/8; \ - if(n) memcpy(&p[0], (VA)->reg_save_area, n*8); \ - memcpy(&p[n], (VA)->overflow_arg_area, 100*8); \ + if(n) memcpy(&p[0], (VA)->reg_save_area+X64_VA_MAX_REG-n*8, n*8); \ + memcpy(&p[n], (VA)->overflow_arg_area, 20*8); \ sysv_varargs.__offset = (VA)->gp_offset; \ sysv_varargs.__base = (char*)p; \ } @@ -126,7 +126,7 @@ typdef struct { 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[8+N], STACK, 100*8 - (8+N)*8); \ + memcpy(&p[8+N], STACK, 20*8); \ sysv_varargs.__offset = N*8; \ sysv_varargs.__base = (char*)p; \ } @@ -139,10 +139,11 @@ typdef struct { #define CREATE_VALIST_FROM_VALIST(VA, SCRATCH) \ va_list sysv_varargs; \ { \ + if((VA)->fp_offset!=X64_VA_MAX_XMM) printf_log(LOG_DEBUG, "Warning: %s: CREATE_VALIST_FROM_VALIST with %d XMM register!\n", __FUNCTION__, (X64_VA_MAX_XMM - (VA)->fp_offset)/16);\ uintptr_t *p = (uintptr_t*)(SCRATCH); \ int n = (X64_VA_MAX_REG - (VA)->gp_offset)/8; \ - if(n) memcpy(&p[0], (VA)->reg_save_area, n*8); \ - memcpy(&p[n], (VA)->overflow_arg_area, 100*8); \ + if(n) memcpy(&p[0], (VA)->reg_save_area+X64_VA_MAX_REG-n*8, n*8); \ + memcpy(&p[n], (VA)->overflow_arg_area, 20*8); \ sysv_varargs = (va_list)p; \ } // this is an approximation, and if the va_list have some float/double, it will fail! @@ -153,7 +154,7 @@ typdef struct { 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], STACK, 100*8); \ + memcpy(&p[6], STACK, 20*8); \ sysv_varargs = (va_list)&p[N]; \ } #else |