diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-08 18:34:07 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-08 18:34:07 +0100 |
| commit | 62c22e55e704edd4cd5fdb0b95eb9f9f79bc37fe (patch) | |
| tree | 3b8aa89489eec843737a8942b5e3c20109fc8f76 | |
| parent | 23eef578f76ef2bd1bf03726e227129fdcc7ec6e (diff) | |
| download | box64-62c22e55e704edd4cd5fdb0b95eb9f9f79bc37fe.tar.gz box64-62c22e55e704edd4cd5fdb0b95eb9f9f79bc37fe.zip | |
Attempts at conversion of va_list
| -rwxr-xr-x | CMakeLists.txt | 5 | ||||
| -rwxr-xr-x | src/include/myalign.h | 35 | ||||
| -rwxr-xr-x | src/libtools/myalign.c | 1 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 20 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc_private.h | 2 | ||||
| -rw-r--r-- | tests/ref15.txt | 1 | ||||
| -rwxr-xr-x | tests/test15 | bin | 0 -> 19664 bytes | |||
| -rw-r--r-- | tests/test15.c | 24 |
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; +} + + |