about summary refs log tree commit diff stats
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
parent23eef578f76ef2bd1bf03726e227129fdcc7ec6e (diff)
downloadbox64-62c22e55e704edd4cd5fdb0b95eb9f9f79bc37fe.tar.gz
box64-62c22e55e704edd4cd5fdb0b95eb9f9f79bc37fe.zip
Attempts at conversion of va_list
-rwxr-xr-xCMakeLists.txt5
-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
-rw-r--r--tests/ref15.txt1
-rwxr-xr-xtests/test15bin0 -> 19664 bytes
-rw-r--r--tests/test15.c24
8 files changed, 71 insertions, 17 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0126d403..63648c9d 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -321,6 +321,11 @@ add_test(test13 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
 #    -D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref14.txt
 #    -P ${CMAKE_SOURCE_DIR}/runTest.cmake )
 
+add_test(test15 ${CMAKE_COMMAND} -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64} 
+    -D TEST_ARGS=${CMAKE_SOURCE_DIR}/tests/test15 -D TEST_OUTPUT=tmpfile.txt 
+    -D TEST_REFERENCE=${CMAKE_SOURCE_DIR}/tests/ref15.txt
+    -P ${CMAKE_SOURCE_DIR}/runTest.cmake )
+
 file(GLOB extension_tests "${CMAKE_SOURCE_DIR}/tests/extensions/*.c")
 foreach(file ${extension_tests})
     get_filename_component(testname "${file}" NAME_WE)
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, 
diff --git a/tests/ref15.txt b/tests/ref15.txt
new file mode 100644
index 00000000..b2bb8503
--- /dev/null
+++ b/tests/ref15.txt
@@ -0,0 +1 @@
+Hello x86_64 World, pi=3.14159!
diff --git a/tests/test15 b/tests/test15
new file mode 100755
index 00000000..b2bd8836
--- /dev/null
+++ b/tests/test15
Binary files differdiff --git a/tests/test15.c b/tests/test15.c
new file mode 100644
index 00000000..b00c7171
--- /dev/null
+++ b/tests/test15.c
@@ -0,0 +1,24 @@
+#include <stdio.h>

+#include <stdarg.h>

+

+int my_func(const char* fmt, va_list a)

+{

+    return vprintf(fmt, a);

+}

+

+int my_func1(const char* fmt, ...)

+{

+    va_list args;

+    va_start(args, fmt);

+    int ret = my_func(fmt, args);

+    va_end(args);

+    return ret;

+}

+

+int main(int argc, char **argv)

+{

+    int ret = my_func1("Hello %s World, pi=%g!\n", "x86_64", 3.14159265);

+    return 0;

+}

+

+