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 | |
| parent | 5e680e0f6678a9b9c51b603c8ea1333c325b2d26 (diff) | |
| download | box64-afae5d80c7554d6f9d19af6c1a3cc78e33313074.tar.gz box64-afae5d80c7554d6f9d19af6c1a3cc78e33313074.zip | |
[RV64][LA464][PPC64] Fixed some issues with VALIST handling
Diffstat (limited to 'src')
| -rwxr-xr-x | src/include/myalign.h | 13 | ||||
| -rwxr-xr-x | src/wrapped/wrappeddbus.c | 57 |
2 files changed, 64 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 diff --git a/src/wrapped/wrappeddbus.c b/src/wrapped/wrappeddbus.c index 384c0d79..491466c2 100755 --- a/src/wrapped/wrappeddbus.c +++ b/src/wrapped/wrappeddbus.c @@ -404,7 +404,64 @@ EXPORT int my_dbus_message_append_args_valist(x64emu_t* emu, void* message, int #ifdef CONVERT_VALIST CONVERT_VALIST(b); #else + #if 1 CREATE_VALIST_FROM_VALIST(b, emu->scratch); + #else + va_list sysv_varargs; + uintptr_t *p = (uintptr_t*)(emu->scratch); + int n = (X64_VA_MAX_REG - b->gp_offset)/8; + int x = (X64_VA_MAX_XMM - b->fp_offset)/8; + int idx = 0; + int type = arg; + while(arg) { + if(arg == (int)'d') { + // double + if(x) + *(p++) = *(uintptr_t*)(b->reg_save_area + X64_VA_MAX_XMM - (x--)*8); + else + *(p++) = *(uintptr_t*)(b->overflow_arg_area + (idx++)*8); + } else if(arg == (int)'a') { + // array + // type + if(n) + *(p++) = *(uintptr_t*)(b->reg_save_area + X64_VA_MAX_REG - (n--)*8); + else + *(p++) = *(uintptr_t*)(b->overflow_arg_area + (idx++)*8); + // elements + if(n) + *(p++) = *(uintptr_t*)(b->reg_save_area + X64_VA_MAX_REG - (n--)*8); + else + *(p++) = *(uintptr_t*)(b->overflow_arg_area + (idx++)*8); + // number of elements + if(n) + *(p++) = *(uintptr_t*)(b->reg_save_area + X64_VA_MAX_REG - (n--)*8); + else + *(p++) = *(uintptr_t*)(b->overflow_arg_area + (idx++)*8); + } else if(arg == (int)'s' || arg == (int)'g' || arg == (int)'o') { + // elements + if(n) + *(p++) = *(uintptr_t*)(b->reg_save_area + X64_VA_MAX_REG - (n--)*8); + else + *(p++) = *(uintptr_t*)(b->overflow_arg_area + (idx++)*8); + // number of elements + if(n) + *(p++) = *(uintptr_t*)(b->reg_save_area + X64_VA_MAX_REG - (n--)*8); + else + *(p++) = *(uintptr_t*)(b->overflow_arg_area + (idx++)*8); + } else { + if(n) + *(p++) = *(uintptr_t*)(b->reg_save_area + X64_VA_MAX_REG - (n--)*8); + else + *(p++) = *(uintptr_t*)(b->overflow_arg_area + (idx++)*8); + } + if(n) + arg = *(uintptr_t*)(b->reg_save_area + X64_VA_MAX_REG - (n--)*8); + else + arg = *(uintptr_t*)(b->overflow_arg_area + (idx++)*8); + *(p++) = arg; + } + sysv_varargs = (va_list)p; + #endif #endif return my->dbus_message_append_args_valist(message, arg, VARARGS); } |