about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/include/myalign.h3
-rw-r--r--src/libtools/myalign.c44
-rw-r--r--src/wrapped/wrappedglib2.c7
-rwxr-xr-xtests/misc/gvariantbin15704 -> 12728 bytes
-rw-r--r--tests/misc/gvariant.c41
-rw-r--r--tests/misc/gvariant.txt6
6 files changed, 86 insertions, 15 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);
 }
 
diff --git a/tests/misc/gvariant b/tests/misc/gvariant
index 17c33f3d..21d5d2fe 100755
--- a/tests/misc/gvariant
+++ b/tests/misc/gvariant
Binary files differdiff --git a/tests/misc/gvariant.c b/tests/misc/gvariant.c
index 5e7df684..870dfc0d 100644
--- a/tests/misc/gvariant.c
+++ b/tests/misc/gvariant.c
@@ -1,14 +1,8 @@
 // gcc `pkg-config --cflags glib-2.0` `pkg-config --libs glib-2.0` -O1 gvariant.c -o gvariant
 #include <glib.h>
 
-static void func(const gchar* format, ...)
+static void print(GVariant* variant)
 {
-    GVariant* variant = NULL;
-    va_list ap;
-    va_start(ap, format);
-    variant = g_variant_new_va(format, NULL, &ap);
-    va_end(ap);
-
     if (variant != NULL) {
         gchar* str = g_variant_print(variant, TRUE);
         g_print("%s\n", str);
@@ -19,13 +13,36 @@ static void func(const gchar* format, ...)
     }
 }
 
+static void func(const gchar* format, ...)
+{
+    GVariant* variant = NULL;
+    va_list ap;
+    va_start(ap, format);
+    variant = g_variant_new_va(format, NULL, &ap);
+    va_end(ap);
+
+    print(variant);
+}
+
 int main(int argc, char* argv[])
 {
-    func("(bynqiuxthiiiiiiiiiiiiii)", FALSE, 'A', 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23);
-    func("(bynqiuxthdiiiiiiiiidiii)", TRUE, 'A', 3, 4, 5, 6, 7, 8, 9, 10.1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.2, 21, 22, 23);
-    func("(bdididxdidididididididi)", TRUE, 2.2, 3, 4.4, 5, 6.6, 7, 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18.18, 19, 20.2, 21, 22.22, 23);
-    func("(bdididxdididididiiiiiii)", TRUE, 2.2, 3, 4.4, 5, 6.6, 7, 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18, 19, 20, 21, 22, 23);
-    func("(biidiixdiiidiiidiiidiii)", TRUE, 2, 3, 4.4, 5, 6, 7, 8.8, 9, 10, 11, 12.12, 13, 14, 15, 16.16, 17, 18, 19, 20.2, 21, 22, 23);
+    func("(bynqiuxthiiiiiiiiiiiiii)", FALSE, 'A', 3, 4, 5, 6, G_GINT64_CONSTANT(7), G_GUINT64_CONSTANT(8), 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23);
+    func("(bynqiuxthdiiiiiiiiidiii)", TRUE, 'A', 3, 4, 5, 6, G_GINT64_CONSTANT(7), G_GUINT64_CONSTANT(8), 9, 10.1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.2, 21, 22, 23);
+    func("(bdididxdidididididididi)", TRUE, 2.2, 3, 4.4, 5, 6.6, G_GINT64_CONSTANT(7), 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18.18, 19, 20.2, 21, 22.22, 23);
+    func("(bdididxdididididiiiiiii)", TRUE, 2.2, 3, 4.4, 5, 6.6, G_GINT64_CONSTANT(7), 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18, 19, 20, 21, 22, 23);
+    func("(biidiixdiiidiiidiiidiii)", TRUE, 2, 3, 4.4, 5, 6, G_GINT64_CONSTANT(7), 8.8, 9, 10, 11, 12.12, 13, 14, 15, 16.16, 17, 18, 19, 20.2, 21, 22, 23);
     func("(ddddddddddddddddddddddd)", 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16, 17.17, 18.18, 19.19, 20.2, 21.21, 22.22, 23.23);
+    GVariant* variant = g_variant_new("(bynqiuxthiiiiiiiiiiiiii)", FALSE, 'A', 3, 4, 5, 6, G_GINT64_CONSTANT(7), G_GUINT64_CONSTANT(8), 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23);
+    print(variant);
+    variant = g_variant_new("(bynqiuxthdiiiiiiiiidiii)", TRUE, 'A', 3, 4, 5, 6, G_GINT64_CONSTANT(7), G_GUINT64_CONSTANT(8), 9, 10.1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.2, 21, 22, 23);
+    print(variant);
+    variant = g_variant_new("(bdididxdidididididididi)", TRUE, 2.2, 3, 4.4, 5, 6.6, G_GINT64_CONSTANT(7), 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18.18, 19, 20.2, 21, 22.22, 23);
+    print(variant);
+    variant = g_variant_new("(bdididxdididididiiiiiii)", TRUE, 2.2, 3, 4.4, 5, 6.6, G_GINT64_CONSTANT(7), 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18, 19, 20, 21, 22, 23);
+    print(variant);
+    variant = g_variant_new("(biidiixdiiidiiidiiidiii)", TRUE, 2, 3, 4.4, 5, 6, G_GINT64_CONSTANT(7), 8.8, 9, 10, 11, 12.12, 13, 14, 15, 16.16, 17, 18, 19, 20.2, 21, 22, 23);
+    print(variant);
+    variant = g_variant_new("(ddddddddddddddddddddddd)", 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16, 17.17, 18.18, 19.19, 20.2, 21.21, 22.22, 23.23);
+    print(variant);
     return 0;
 }
diff --git a/tests/misc/gvariant.txt b/tests/misc/gvariant.txt
index 6d26e8c5..686a1252 100644
--- a/tests/misc/gvariant.txt
+++ b/tests/misc/gvariant.txt
@@ -4,3 +4,9 @@
 (true, 2.2000000000000002, 3, 4.4000000000000004, 5, 6.5999999999999996, int64 7, 8.8000000000000007, 9, 10.1, 11, 12.119999999999999, 13, 14.140000000000001, 15, 16.16, 17, 18, 19, 20, 21, 22, 23)
 (true, 2, 3, 4.4000000000000004, 5, 6, int64 7, 8.8000000000000007, 9, 10, 11, 12.119999999999999, 13, 14, 15, 16.16, 17, 18, 19, 20.199999999999999, 21, 22, 23)
 (1.1000000000000001, 2.2000000000000002, 3.2999999999999998, 4.4000000000000004, 5.5, 6.5999999999999996, 7.7000000000000002, 8.8000000000000007, 9.9000000000000004, 10.1, 11.109999999999999, 12.119999999999999, 13.130000000000001, 14.140000000000001, 15.15, 16.16, 17.170000000000002, 18.18, 19.190000000000001, 20.199999999999999, 21.210000000000001, 22.219999999999999, 23.23)
+(false, byte 0x41, int16 3, uint16 4, 5, uint32 6, int64 7, uint64 8, handle 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23)
+(true, byte 0x41, int16 3, uint16 4, 5, uint32 6, int64 7, uint64 8, handle 9, 10.1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.199999999999999, 21, 22, 23)
+(true, 2.2000000000000002, 3, 4.4000000000000004, 5, 6.5999999999999996, int64 7, 8.8000000000000007, 9, 10.1, 11, 12.119999999999999, 13, 14.140000000000001, 15, 16.16, 17, 18.18, 19, 20.199999999999999, 21, 22.219999999999999, 23)
+(true, 2.2000000000000002, 3, 4.4000000000000004, 5, 6.5999999999999996, int64 7, 8.8000000000000007, 9, 10.1, 11, 12.119999999999999, 13, 14.140000000000001, 15, 16.16, 17, 18, 19, 20, 21, 22, 23)
+(true, 2, 3, 4.4000000000000004, 5, 6, int64 7, 8.8000000000000007, 9, 10, 11, 12.119999999999999, 13, 14, 15, 16.16, 17, 18, 19, 20.199999999999999, 21, 22, 23)
+(1.1000000000000001, 2.2000000000000002, 3.2999999999999998, 4.4000000000000004, 5.5, 6.5999999999999996, 7.7000000000000002, 8.8000000000000007, 9.9000000000000004, 10.1, 11.109999999999999, 12.119999999999999, 13.130000000000001, 14.140000000000001, 15.15, 16.16, 17.170000000000002, 18.18, 19.190000000000001, 20.199999999999999, 21.210000000000001, 22.219999999999999, 23.23)