about summary refs log tree commit diff stats
path: root/src/include
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/include
parent5e680e0f6678a9b9c51b603c8ea1333c325b2d26 (diff)
downloadbox64-afae5d80c7554d6f9d19af6c1a3cc78e33313074.tar.gz
box64-afae5d80c7554d6f9d19af6c1a3cc78e33313074.zip
[RV64][LA464][PPC64] Fixed some issues with VALIST handling
Diffstat (limited to 'src/include')
-rwxr-xr-xsrc/include/myalign.h13
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