about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-03-25 09:25:25 +0000
committerptitSeb <sebastien.chev@gmail.com>2023-03-25 09:25:25 +0000
commitafae5d80c7554d6f9d19af6c1a3cc78e33313074 (patch)
tree6804679a736234596699432bf9b7460cd01f1a5d /src
parent5e680e0f6678a9b9c51b603c8ea1333c325b2d26 (diff)
downloadbox64-afae5d80c7554d6f9d19af6c1a3cc78e33313074.tar.gz
box64-afae5d80c7554d6f9d19af6c1a3cc78e33313074.zip
[RV64][LA464][PPC64] Fixed some issues with VALIST handling
Diffstat (limited to 'src')
-rwxr-xr-xsrc/include/myalign.h13
-rwxr-xr-xsrc/wrapped/wrappeddbus.c57
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);
 }