about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-08 18:34:07 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-08 18:34:07 +0100
commit62c22e55e704edd4cd5fdb0b95eb9f9f79bc37fe (patch)
tree3b8aa89489eec843737a8942b5e3c20109fc8f76 /src
parent23eef578f76ef2bd1bf03726e227129fdcc7ec6e (diff)
downloadbox64-62c22e55e704edd4cd5fdb0b95eb9f9f79bc37fe.tar.gz
box64-62c22e55e704edd4cd5fdb0b95eb9f9f79bc37fe.zip
Attempts at conversion of va_list
Diffstat (limited to 'src')
-rwxr-xr-xsrc/include/myalign.h35
-rwxr-xr-xsrc/libtools/myalign.c1
-rwxr-xr-xsrc/wrapped/wrappedlibc.c20
-rwxr-xr-xsrc/wrapped/wrappedlibc_private.h2
4 files changed, 41 insertions, 17 deletions
diff --git a/src/include/myalign.h b/src/include/myalign.h
index 9789894f..29de8c4f 100755
--- a/src/include/myalign.h
+++ b/src/include/myalign.h
@@ -1,5 +1,15 @@
 #include <stdint.h>
 
+typedef struct x64_va_list_s {
+   unsigned int gp_offset;
+   unsigned int fp_offset;
+   void *overflow_arg_area;
+   void *reg_save_area;
+} x64_va_list_t[1];
+
+#define X64_VA_MAX_REG  (6*8)
+#define X64_VA_MAX_XMM  ((6*8)+(8*16))
+
 #ifdef __x86_64__
 // x86_64, 6 64bits general regs and 16 or 8? 128bits float regs
 /*
@@ -13,10 +23,19 @@ typedef struct {
 */
 #define CREATE_SYSV_VALIST(A) \
   va_list sysv_varargs; \
-  sysv_varargs->gp_offset=(6*8); \
-  sysv_varargs->fp_offset=(6*8)+(16*16); \
+  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;
+
+#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;
+
+
 #elif defined(__aarch64__)
 // aarch64: 8 64bits general regs and 8 128bits float regs
 /*
@@ -34,6 +53,15 @@ typedef struct  va_list {
   sysv_varargs.__gr_offs=(8*8); \
   sysv_varargs.__vr_offs=(8*16); \
   sysv_varargs.__stack=A;
+
+#define CONVERT_VALIST(A) \
+  va_list sysv_varargs; \
+  sysv_varargs.__gr_offs=(2+A->gp_offset)*8;  \
+  sysv_varargs.__vr_offs=A->fp_offset;        \
+  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;
+
 #elif defined(__powerpc64__)
 // TODO, is this correct?
 #define CREATE_SYSV_VALIST(A) \
@@ -41,6 +69,9 @@ typedef struct  va_list {
   sysv_varargs->gpr=8; \
   sysv_varargs->fpr=8; \
   sysv_varargs->overflow_arg_area=A;
+
+#define CONVERT_VALIST(A) \
+  #error TODO!
 #else
 #error Unknown architecture!
 #endif
diff --git a/src/libtools/myalign.c b/src/libtools/myalign.c
index 0d5190f4..e027558a 100755
--- a/src/libtools/myalign.c
+++ b/src/libtools/myalign.c
@@ -136,6 +136,7 @@ void myStackAlign(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mystac
         }
     }
 }
+
 #if 0
 void myStackAlignGVariantNew(const char* fmt, uint32_t* st, uint32_t* mystack)
 {
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 03825002..4790b868 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -575,22 +575,14 @@ EXPORT int my_printf(x64emu_t *emu, void* fmt, void* b) {
     return vprintf((const char*)fmt, VARARGS);
 }
 EXPORT int my___printf_chk(x64emu_t *emu, void* fmt, void* b) __attribute__((alias("my_printf")));
-#if 0
-EXPORT int my_vprintf(x64emu_t *emu, void* fmt, void* b, va_list V) {
-    #ifndef NOALIGN
-    // need to align on arm
-    myStackAlign((const char*)fmt, (uint32_t*)b, emu->scratch);
-    PREPARE_VALIST;
-    void* f = vprintf;
-    return ((iFpp_t)f)(fmt, VARARGS);
-    #else
-    // other platform don't need that
-    void* f = vprintf;
-    return ((iFpp_t)f)(fmt, (uint32_t*)b);
-    #endif
+
+EXPORT int my_vprintf(x64emu_t *emu, void* fmt, x64_va_list_t b) {
+    CONVERT_VALIST(b);
+    return vprintf(fmt, VARARGS);
 }
-EXPORT int my___vprintf_chk(x64emu_t *emu, void* fmt, void* b, va_list V) __attribute__((alias("my_vprintf")));
+EXPORT int my___vprintf_chk(x64emu_t *emu, void* fmt, x64_va_list_t b) __attribute__((alias("my_vprintf")));
 
+#if 0
 EXPORT int my_vfprintf(x64emu_t *emu, void* F, void* fmt, void* b) {
     #ifndef NOALIGN
     // need to align on arm
diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h
index a957630c..5b2e36b5 100755
--- a/src/wrapped/wrappedlibc_private.h
+++ b/src/wrapped/wrappedlibc_private.h
@@ -2055,7 +2055,7 @@ GO(usleep, iFu)
 //GO(vhangup, 
 //GO(vlimit, 
 //GO(vmsplice, 
-//GO(vprintf, 
+GOM(vprintf, iFEpp)
 //GO(__vprintf_chk, 
 //GOW(vscanf, 
 //GOW(__vsnprintf,