diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-09-26 12:06:01 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-09-26 12:06:01 +0200 |
| commit | 783e9a4b7442506765fe9687d006e0cd17c3c2f1 (patch) | |
| tree | 8f29384177f4fa05f02bdb8c52bbc84d561bc5b3 /src | |
| parent | 202a067a6177e4a9d6b31e1089cd81368ae9d4b3 (diff) | |
| download | box64-783e9a4b7442506765fe9687d006e0cd17c3c2f1.tar.gz box64-783e9a4b7442506765fe9687d006e0cd17c3c2f1.zip | |
More untested support for loongarch64 va_list
Diffstat (limited to 'src')
| -rwxr-xr-x | src/include/myalign.h | 16 | ||||
| -rwxr-xr-x | src/wrapped/wrappeddbus.c | 8 | ||||
| -rwxr-xr-x | src/wrapped/wrappedgio2.c | 8 | ||||
| -rwxr-xr-x | src/wrapped/wrappedglib2.c | 30 | ||||
| -rwxr-xr-x | src/wrapped/wrappedgobject2.c | 20 | ||||
| -rwxr-xr-x | src/wrapped/wrappedgtkx112.c | 12 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibncurses.c | 5 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibncurses6.c | 5 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibncursesw.c | 5 | ||||
| -rwxr-xr-x | src/wrapped/wrappedsdl2.c | 7 | ||||
| -rwxr-xr-x | src/wrapped/wrappedudev0.c | 10 | ||||
| -rwxr-xr-x | src/wrapped/wrappedudev1.c | 10 |
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) |