about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-09-26 12:06:01 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-09-26 12:06:01 +0200
commit783e9a4b7442506765fe9687d006e0cd17c3c2f1 (patch)
tree8f29384177f4fa05f02bdb8c52bbc84d561bc5b3 /src
parent202a067a6177e4a9d6b31e1089cd81368ae9d4b3 (diff)
downloadbox64-783e9a4b7442506765fe9687d006e0cd17c3c2f1.tar.gz
box64-783e9a4b7442506765fe9687d006e0cd17c3c2f1.zip
More untested support for loongarch64 va_list
Diffstat (limited to 'src')
-rwxr-xr-xsrc/include/myalign.h16
-rwxr-xr-xsrc/wrapped/wrappeddbus.c8
-rwxr-xr-xsrc/wrapped/wrappedgio2.c8
-rwxr-xr-xsrc/wrapped/wrappedglib2.c30
-rwxr-xr-xsrc/wrapped/wrappedgobject2.c20
-rwxr-xr-xsrc/wrapped/wrappedgtkx112.c12
-rwxr-xr-xsrc/wrapped/wrappedlibncurses.c5
-rwxr-xr-xsrc/wrapped/wrappedlibncurses6.c5
-rwxr-xr-xsrc/wrapped/wrappedlibncursesw.c5
-rwxr-xr-xsrc/wrapped/wrappedsdl2.c7
-rwxr-xr-xsrc/wrapped/wrappedudev0.c10
-rwxr-xr-xsrc/wrapped/wrappedudev1.c10
12 files changed, 132 insertions, 4 deletions
diff --git a/src/include/myalign.h b/src/include/myalign.h
index 1e238d78..4c805049 100755
--- a/src/include/myalign.h
+++ b/src/include/myalign.h
@@ -102,8 +102,18 @@ typedef struct  va_list {
   #error TODO!
 #elif defined(__loongarch64)
 #define CREATE_SYSV_VALIST(A) \
-  va_list sysv_vaargs = (va_list)A;
+  va_list sysv_vaargs = (va_list)A
 // not creating CONVERT_VALIST(A) on purpose
+// this one will create a VA_LIST from x64_va_list using only GPRS and 100 stack element
+#define CREATE_VALIST_FROM_VALIST(VA, SCRATCH)                          \
+  va_list sysv_varargs;                                                 \
+  {                                                                     \
+    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], STACK, 100*8);                                        \
+    sysv_varargs = (va_list)p;                                            \
+  }
 // this is an approximation, and if the va_list have some float/double, it will fail!
 // if the funciton needs more than 100 args, it will also fail
 #define CREATE_VALIST_FROM_VAARG(STACK, SCRATCH, N)                     \
@@ -113,8 +123,8 @@ typedef struct  va_list {
     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);                                        \
-    sysv_varargs = (void*)&p[N];                                        \
-  }                                                                     \
+    sysv_varargs = (va_list)&p[N];                                        \
+  }
 #else
 #error Unknown architecture!
 #endif
diff --git a/src/wrapped/wrappeddbus.c b/src/wrapped/wrappeddbus.c
index 56f1c054..f2910741 100755
--- a/src/wrapped/wrappeddbus.c
+++ b/src/wrapped/wrappeddbus.c
@@ -411,7 +411,11 @@ EXPORT int my_dbus_message_get_args_valist(x64emu_t* emu, void* message, void* e
 {
     (void)emu;
     dbus_my_t *my = (dbus_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(b);
+    #else
+    CREATE_VALIST_FROM_VALIST(b, emu->scratch);
+    #endif
     return my->dbus_message_get_args_valist(message, e, arg, VARARGS);
 }
 
@@ -428,7 +432,11 @@ EXPORT int my_dbus_message_append_args_valist(x64emu_t* emu, void* message, int
 {
     (void)emu;
     dbus_my_t *my = (dbus_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(b);
+    #else
+    CREATE_VALIST_FROM_VALIST(b, emu->scratch);
+    #endif
     return my->dbus_message_append_args_valist(message, arg, VARARGS);
 }
 
diff --git a/src/wrapped/wrappedgio2.c b/src/wrapped/wrappedgio2.c
index 47571c0c..43e58573 100755
--- a/src/wrapped/wrappedgio2.c
+++ b/src/wrapped/wrappedgio2.c
@@ -590,7 +590,11 @@ EXPORT void my_g_async_initable_new_valist_async(x64emu_t* emu, size_t type, voi
     library_t * lib = GetLibInternal(libname);
     gio2_my_t *my = (gio2_my_t*)lib->priv.w.p2;
 
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(var_args);
+    #else
+    CREATE_VALIST_FROM_VALIST(var_args, emu->scratch);
+    #endif
     my->g_async_initable_new_valist_async(type, first, VARARGS, priority, cancellable, findGAsyncReadyCallbackFct(cb), data);
 }
 
@@ -728,7 +732,11 @@ EXPORT void my_g_simple_async_result_set_error_va(x64emu_t* emu, void* simple, v
     library_t * lib = GetLibInternal(libname);
     gio2_my_t *my = (gio2_my_t*)lib->priv.w.p2;
 
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(V);
+    #else
+    CREATE_VALIST_FROM_VALIST(V, emu->scratch);
+    #endif
     my->g_simple_async_result_set_error_va(simple, domain, code, fmt, VARARGS);
 }
 
diff --git a/src/wrapped/wrappedglib2.c b/src/wrapped/wrappedglib2.c
index a163bb23..5a332a7c 100755
--- a/src/wrapped/wrappedglib2.c
+++ b/src/wrapped/wrappedglib2.c
@@ -823,7 +823,11 @@ EXPORT void* my_g_variant_new_from_data(x64emu_t* emu, void* type, void* data, s
 EXPORT void* my_g_variant_new_parsed_va(x64emu_t* emu, void* fmt, x64_va_list_t b)
 {
     glib2_my_t *my = (glib2_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(b);
+    #else
+    CREATE_VALIST_FROM_VALIST(b, emu->scratch);
+    #endif
     return my->g_variant_new_parsed_va(fmt, &VARARGS);
 }
 
@@ -1196,7 +1200,11 @@ EXPORT void* my_g_variant_new_va(x64emu_t* emu, char* fmt, void* endptr, x64_va_
 {
     glib2_my_t *my = (glib2_my_t*)my_lib->priv.w.p2;
 
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(*b);
+    #else
+    CREATE_VALIST_FROM_VALIST(*b, emu->scratch);
+    #endif
     va_list* aligned = &VARARGS;
     return my->g_variant_new_va(fmt, endptr, &aligned);
 }
@@ -1367,7 +1375,11 @@ EXPORT void* my_g_error_new(x64emu_t* emu, void* domain, int code, void* fmt, ui
 EXPORT void* my_g_error_new_valist(x64emu_t* emu, void* domain, int code, void* fmt, x64_va_list_t V)
 {
     glib2_my_t *my = (glib2_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(V);
+    #else
+    CREATE_VALIST_FROM_VALIST(V, emu->scratch);
+    #endif
     return my->g_error_new_valist(domain, code, fmt, VARARGS);
 }
 
@@ -1382,7 +1394,11 @@ EXPORT int my_g_fprintf(x64emu_t* emu, void* f, void* fmt, uintptr_t* b)
 EXPORT void my_g_logv(x64emu_t* emu, void* domain, int level, void* fmt, x64_va_list_t V)
 {
     glib2_my_t *my = (glib2_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(V);
+    #else
+    CREATE_VALIST_FROM_VALIST(V, emu->scratch);
+    #endif
     my->g_logv(domain, level, fmt, VARARGS);
 }
 EXPORT void my_g_log(x64emu_t* emu, void* domain, int level, void* fmt, uintptr_t* b)
@@ -1436,7 +1452,12 @@ EXPORT void my_g_string_append_printf(x64emu_t* emu, void* string, void* fmt, ui
 EXPORT void my_g_string_append_vprintf(x64emu_t* emu, void* string, void* fmt, x64_va_list_t V)
 {
     glib2_my_t *my = (glib2_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(V);
+    #else
+    myStackAlignValist(emu, (const char*)fmt, emu->scratch, V);
+    PREPARE_VALIST;
+    #endif
     return my->g_string_append_vprintf(string, fmt, VARARGS);
 }
 
@@ -1451,7 +1472,12 @@ EXPORT void my_g_string_printf(x64emu_t* emu, void* string, void* fmt, uintptr_t
 EXPORT void my_g_string_vprintf(x64emu_t* emu, void* string, void* fmt, x64_va_list_t V)
 {
     glib2_my_t *my = (glib2_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(V);
+    #else
+    myStackAlignValist(emu, (const char*)fmt, emu->scratch, V);
+    PREPARE_VALIST;
+    #endif
     return my->g_string_vprintf(string, fmt, VARARGS);
 }
 
@@ -1465,7 +1491,11 @@ EXPORT void* my_g_strjoin(x64emu_t* emu, void* a, uintptr_t* b)
 EXPORT void* my_g_strjoinv(x64emu_t* emu, void* a, x64_va_list_t V)
 {
     glib2_my_t *my = (glib2_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(V);
+    #else
+    CREATE_VALIST_FROM_VALIST(V, emu->scratch);
+    #endif
     return my->g_strjoinv(a, VARARGS);
 }
 
diff --git a/src/wrapped/wrappedgobject2.c b/src/wrapped/wrappedgobject2.c
index 42ff5099..31b85938 100755
--- a/src/wrapped/wrappedgobject2.c
+++ b/src/wrapped/wrappedgobject2.c
@@ -590,7 +590,11 @@ EXPORT uint32_t my_g_signal_new_valist(x64emu_t* emu, void* name, size_t itype,
     gobject2_my_t *my = (gobject2_my_t*)my_lib->priv.w.p2;
 
     printf_log(LOG_DEBUG, "g_signal_new_valist for \"%s\", with %d args\n", (const char*)name, n);
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(b);
+    #else
+    CREATE_VALIST_FROM_VALIST(b, emu->scratch);
+    #endif
     return my->g_signal_new_valist(name, itype, flags, closure, findAccumulatorFct(acc), accu_data, findMarshalFct(marsh), rtype, n, VARARGS);
 }
 
@@ -648,7 +652,11 @@ EXPORT void* my_g_object_new(x64emu_t* emu, size_t type, void* first, void* b)
 EXPORT void* my_g_object_new_valist(x64emu_t* emu, size_t type, void* first, x64_va_list_t b)
 {
     gobject2_my_t *my = (gobject2_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(b);
+    #else
+    CREATE_VALIST_FROM_VALIST(b, emu->scratch);
+    #endif
     return my->g_object_new_valist(type, first, VARARGS);
 }
 
@@ -767,7 +775,11 @@ EXPORT void* my_g_type_class_peek_parent(x64emu_t* emu, void* object)
 EXPORT void my_g_signal_emit_valist(x64emu_t* emu, void* inst, uint32_t id, void* quark, x64_va_list_t b)
 {
     gobject2_my_t *my = (gobject2_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(b);
+    #else
+    CREATE_VALIST_FROM_VALIST(b, emu->scratch);
+    #endif
     my->g_signal_emit_valist(inst, id, quark, VARARGS);
 }
 
@@ -781,7 +793,11 @@ EXPORT void my_g_signal_emit(x64emu_t* emu, void* inst, uint32_t id, void* quark
 EXPORT void my_g_object_get_valist(x64emu_t* emu, void* a1, void* a2, x64_va_list_t b)
 {
     gobject2_my_t *my = (gobject2_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(b);
+    #else
+    CREATE_VALIST_FROM_VALIST(b, emu->scratch);
+    #endif
     my->g_object_get_valist(a1, a2, VARARGS);
 }
 
@@ -796,7 +812,11 @@ EXPORT void my_g_object_get(x64emu_t* emu, void* a1, void* a2, uintptr_t* b)
 EXPORT void my_g_object_set_valist(x64emu_t* emu, void* a1, void* a2, x64_va_list_t b)
 {
     gobject2_my_t *my = (gobject2_my_t*)my_lib->priv.w.p2;
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(b);
+    #else
+    CREATE_VALIST_FROM_VALIST(b, emu->scratch);
+    #endif
     my->g_object_set_valist(a1, a2, VARARGS);
 }
 
diff --git a/src/wrapped/wrappedgtkx112.c b/src/wrapped/wrappedgtkx112.c
index 6be9e538..b288aa89 100755
--- a/src/wrapped/wrappedgtkx112.c
+++ b/src/wrapped/wrappedgtkx112.c
@@ -691,7 +691,11 @@ EXPORT void my_gtk_list_store_set_valist(x64emu_t* emu, void* list, void* iter,
     library_t * lib = GetLibInternal(libname);
     gtkx112_my_t *my = (gtkx112_my_t*)lib->priv.w.p2;
 
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(V);
+    #else
+    CREATE_VALIST_FROM_VALIST(V, emu->scratch);
+    #endif
     my->gtk_list_store_set_valist(list, iter, VARARGS);
 }
 
@@ -709,7 +713,11 @@ EXPORT void my_gtk_widget_style_get_valist(x64emu_t* emu, void* widget, void* fi
     library_t * lib = GetLibInternal(libname);
     gtkx112_my_t *my = (gtkx112_my_t*)lib->priv.w.p2;
 
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(V);
+    #else
+    CREATE_VALIST_FROM_VALIST(V, emu->scratch);
+    #endif
     my->gtk_widget_style_get_valist(widget, first, VARARGS);
 }
 
@@ -1206,7 +1214,11 @@ EXPORT void my_gtk_tree_model_get_valist(x64emu_t* emu, void* tree, void* iter,
     library_t * lib = GetLibInternal(libname);
     gtkx112_my_t *my = (gtkx112_my_t*)lib->priv.w.p2;
 
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(V);
+    #else
+    CREATE_VALIST_FROM_VALIST(V, emu->scratch);
+    #endif
     my->gtk_tree_model_get_valist(tree, iter, VARARGS);
 }
 
diff --git a/src/wrapped/wrappedlibncurses.c b/src/wrapped/wrappedlibncurses.c
index 37ad0021..901a5e0e 100755
--- a/src/wrapped/wrappedlibncurses.c
+++ b/src/wrapped/wrappedlibncurses.c
@@ -79,7 +79,12 @@ EXPORT int my_vwprintw(x64emu_t* emu, void* p, void* fmt, x64_va_list_t b)
 {
     libncurses_my_t *my = (libncurses_my_t*)my_lib->priv.w.p2;
 
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(b);
+    #else
+    myStackAlignValist(emu, (const char*)fmt, emu->scratch, b);
+    PREPARE_VALIST;
+    #endif
     return my->vwprintw(p, fmt, VARARGS);
 }
 
diff --git a/src/wrapped/wrappedlibncurses6.c b/src/wrapped/wrappedlibncurses6.c
index 8d2e3157..164d9ceb 100755
--- a/src/wrapped/wrappedlibncurses6.c
+++ b/src/wrapped/wrappedlibncurses6.c
@@ -79,7 +79,12 @@ EXPORT int my6_vwprintw(x64emu_t* emu, void* p, void* fmt, x64_va_list_t b)
 {
     libncurses6_my_t *my = (libncurses6_my_t*)my_lib->priv.w.p2;
 
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(b);
+    #else
+    myStackAlignValist(emu, (const char*)fmt, emu->scratch, b);
+    PREPARE_VALIST;
+    #endif
     return my->vwprintw(p, fmt, VARARGS);
 }
 
diff --git a/src/wrapped/wrappedlibncursesw.c b/src/wrapped/wrappedlibncursesw.c
index f602086a..1b110f1c 100755
--- a/src/wrapped/wrappedlibncursesw.c
+++ b/src/wrapped/wrappedlibncursesw.c
@@ -77,7 +77,12 @@ EXPORT int myw_vwprintw(x64emu_t* emu, void* p, void* fmt, x64_va_list_t b)
 {
     libncursesw_my_t *my = (libncursesw_my_t*)my_lib->priv.w.p2;
 
+    #ifdef CONVERT_VALIST
     CONVERT_VALIST(b);
+    #else
+    myStackAlignValist(emu, (const char*)fmt, emu->scratch, b);
+    PREPARE_VALIST;
+    #endif
     return my->vwprintw(p, fmt, VARARGS);
 }
 
diff --git a/src/wrapped/wrappedsdl2.c b/src/wrapped/wrappedsdl2.c
index 7e266c17..53b2b1a6 100755
--- a/src/wrapped/wrappedsdl2.c
+++ b/src/wrapped/wrappedsdl2.c
@@ -557,7 +557,12 @@ EXPORT void my2_SDL_LogSetOutputFunction(x64emu_t* emu, void* f, void* arg)
 EXPORT int my2_SDL_vsnprintf(x64emu_t* emu, void* buff, size_t s, void * fmt, x64_va_list_t b)
 {
     (void)emu;
-    CONVERT_VALIST(b)
+    #ifdef CONVERT_VALIST
+    CONVERT_VALIST(b);
+    #else
+    myStackAlignValist(emu, (const char*)fmt, emu->scratch, b);
+    PREPARE_VALIST;
+    #endif
     int r = vsnprintf(buff, s, fmt, VARARGS);
     return r;
 }
diff --git a/src/wrapped/wrappedudev0.c b/src/wrapped/wrappedudev0.c
index c6ca5857..e9147a58 100755
--- a/src/wrapped/wrappedudev0.c
+++ b/src/wrapped/wrappedudev0.c
@@ -58,6 +58,7 @@ GO(3)   \
 GO(4)
 
 // log_fn ...
+#ifdef CONVERT_VALIST
 #define GO(A)   \
 static uintptr_t my_log_fn_fct_##A = 0;                                                                 \
 static void my_log_fn_##A(void* udev, int p, void *f, int l, void* fn, void* fmt, x64_va_list_t args)   \
@@ -65,6 +66,15 @@ static void my_log_fn_##A(void* udev, int p, void *f, int l, void* fn, void* fmt
     CONVERT_VALIST(args)                                                                                \
     RunFunction(my_context, my_log_fn_fct_##A, 7, udev, p, f, l, fn, fmt, VARARGS);                     \
 }
+#else
+#define GO(A)   \
+static uintptr_t my_log_fn_fct_##A = 0;                                                                 \
+static void my_log_fn_##A(void* udev, int p, void *f, int l, void* fn, void* fmt, x64_va_list_t args)   \
+{                                                                                                       \
+    CREATE_VALIST_FROM_VALIST(b, emu->scratch);                                                         \
+    RunFunction(my_context, my_log_fn_fct_##A, 7, udev, p, f, l, fn, fmt, VARARGS);                     \
+}
+#endif
 SUPER()
 #undef GO
 static void* find_log_fn_Fct(void* fct)
diff --git a/src/wrapped/wrappedudev1.c b/src/wrapped/wrappedudev1.c
index 5939ef2c..903af343 100755
--- a/src/wrapped/wrappedudev1.c
+++ b/src/wrapped/wrappedudev1.c
@@ -58,6 +58,7 @@ GO(3)   \
 GO(4)
 
 // log_fn ...
+#ifdef CONVERT_VALIST
 #define GO(A)   \
 static uintptr_t my_log_fn_fct_##A = 0;                                                                 \
 static void my_log_fn_##A(void* udev, int p, void *f, int l, void* fn, void* fmt, x64_va_list_t args)   \
@@ -65,6 +66,15 @@ static void my_log_fn_##A(void* udev, int p, void *f, int l, void* fn, void* fmt
     CONVERT_VALIST(args)                                                                                \
     RunFunction(my_context, my_log_fn_fct_##A, 7, udev, p, f, l, fn, fmt, VARARGS);                     \
 }
+#else
+#define GO(A)   \
+static uintptr_t my_log_fn_fct_##A = 0;                                                                 \
+static void my_log_fn_##A(void* udev, int p, void *f, int l, void* fn, void* fmt, x64_va_list_t args)   \
+{                                                                                                       \
+    CREATE_VALIST_FROM_VALIST(b, emu->scratch);                                                         \
+    RunFunction(my_context, my_log_fn_fct_##A, 7, udev, p, f, l, fn, fmt, VARARGS);                     \
+}
+#endif
 SUPER()
 #undef GO
 static void* find_log_fn_Fct(void* fct)