about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/myalign.h3
-rw-r--r--src/libtools/myalign.c44
-rw-r--r--src/wrapped/wrappedglib2.c7
3 files changed, 51 insertions, 3 deletions
diff --git a/src/include/myalign.h b/src/include/myalign.h
index 54184a88..dee39253 100644
--- a/src/include/myalign.h
+++ b/src/include/myalign.h
@@ -181,7 +181,8 @@ void myStackAlignValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, x64_v
 void myStackAlignWValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, x64_va_list_t va);
 void myStackAlignScanfValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, x64_va_list_t va);
 void myStackAlignScanfWValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, x64_va_list_t va);
-void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* scratch, x64_va_list_t* b);
+void myStackAlignGVariantNewVa(x64emu_t* emu, const char* fmt, uint64_t* scratch, x64_va_list_t* b);
+void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mystack, int xmm);
 #endif
 
 struct x64_stat64 {                   /* x86_64       arm64 */
diff --git a/src/libtools/myalign.c b/src/libtools/myalign.c
index 9ef13cf5..aebfb4c7 100644
--- a/src/libtools/myalign.c
+++ b/src/libtools/myalign.c
@@ -1197,7 +1197,7 @@ void myStackAlignScanfWValist(x64emu_t* emu, const char* fmt, uint64_t* mystack,
     }
 }
 
-void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* scratch, x64_va_list_t* b)
+void myStackAlignGVariantNewVa(x64emu_t* emu, const char* fmt, uint64_t* scratch, x64_va_list_t* b)
 {
     uint64_t* grp = (uint64_t*)((*b)->reg_save_area);
     uint64_t* frp = (uint64_t*)((*b)->reg_save_area + X64_VA_MAX_REG);
@@ -1239,6 +1239,48 @@ void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* scratch,
     }
 }
 
+void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mystack, int xmm)
+{
+    int x = 0;
+    int pos = 1;
+    const char* pfmt = fmt;
+    while (*pfmt) {
+        switch (*pfmt) {
+            case 'd': // double
+                if (xmm) {
+                    *mystack = emu->xmm[x++].q[0];
+                    --xmm;
+                    mystack++;
+                } else {
+                    *mystack = *st;
+                    st++;
+                    mystack++;
+                }
+                break;
+            case 'b':
+            case 'y':
+            case 'n':
+            case 'q':
+            case 'i':
+            case 'h':
+            case 'u':
+            case 'x':
+            case 't':
+                if (pos < 6)
+                    *mystack = emu->regs[regs_abi[pos++]].q[0];
+                else {
+                    *mystack = *st;
+                    ++st;
+                }
+                ++mystack;
+                break;
+            default:
+                break;
+        }
+        pfmt++;
+    }
+}
+
 #endif
 
 #include "my_xcb_defs.h"
diff --git a/src/wrapped/wrappedglib2.c b/src/wrapped/wrappedglib2.c
index 7a24b5f4..d4f30fcf 100644
--- a/src/wrapped/wrappedglib2.c
+++ b/src/wrapped/wrappedglib2.c
@@ -1115,7 +1115,7 @@ EXPORT void* my_g_variant_new_va(x64emu_t* emu, char* fmt, void* endptr, x64_va_
     #else
       #if defined(__loongarch64) || defined(__riscv)
         va_list sysv_varargs;
-        myStackAlignGVariantNew(emu, fmt, emu->scratch, b);
+        myStackAlignGVariantNewVa(emu, fmt, emu->scratch, b);
         sysv_varargs = (va_list)emu->scratch;
       #else
         CREATE_VALIST_FROM_VALIST(*b, emu->scratch);
@@ -1126,7 +1126,12 @@ EXPORT void* my_g_variant_new_va(x64emu_t* emu, char* fmt, void* endptr, x64_va_
 
 EXPORT void* my_g_variant_new(x64emu_t* emu, char* fmt, uint64_t* V)
 {
+#if defined(__loongarch64) || defined(__riscv)
+    myStackAlignGVariantNew(emu, fmt, V, emu->scratch, R_EAX);
+    PREPARE_VALIST;
+#else
     CREATE_VALIST_FROM_VAARG(V, emu->scratch, 1);
+#endif
     return my->g_variant_new_va(fmt, NULL, &VARARGS);
 }