diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/myalign.h | 3 | ||||
| -rw-r--r-- | src/libtools/myalign.c | 44 | ||||
| -rw-r--r-- | src/wrapped/wrappedglib2.c | 7 |
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); } |