about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorwannacu <76616478+wannacu@users.noreply.github.com>2023-10-27 16:43:06 +0800
committerGitHub <noreply@github.com>2023-10-27 10:43:06 +0200
commit81ca3cd06e17e33c4f19d4aa52030b53cb9f6e42 (patch)
tree23b96a643d1ef2195f2f9b763839e86b48bc4bde
parentf8d65a831e6f92314513ab2603e74627bbc1711f (diff)
downloadbox64-81ca3cd06e17e33c4f19d4aa52030b53cb9f6e42.tar.gz
box64-81ca3cd06e17e33c4f19d4aa52030b53cb9f6e42.zip
[WRAPPER] Fixed my_execl (#1044)
* [WRAPPER] Fixed my_execl

* [ARM64_DYNAREC] Added 66 0F 17 and Fixed 66 0F 21
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c86
-rw-r--r--src/wrapped/wrappedlibc.c7
2 files changed, 81 insertions, 12 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c
index 69cc17b8..800436f3 100644
--- a/src/dynarec/arm64/dynarec_arm64_660f.c
+++ b/src/dynarec/arm64/dynarec_arm64_660f.c
@@ -1084,7 +1084,22 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                         SMWRITE2();

                     }

                     break;

-

+                case 0x17:

+                    INST_NAME("EXTRACTPS Ew, Gx, Ib");

+                    nextop = F8;

+                    GETGX(q0, 0);

+                    if (MODREG) {

+                        ed = xRAX+(nextop&7)+(rex.b<<3);

+                        u8 = F8&0b11;

+                        MOVx_REG(ed, xZR);

+                        VMOVSto(ed, q0, u8);

+                    } else {

+                        addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0xfff<<2, 3, rex, NULL, 0, 1);

+                        u8 = F8&0b11;

+                        VMOVSto(x1, q0, u8);

+                        STW(x1, wback, fixedaddress);

+                    }

+                    break;

                 case 0x20:

                     INST_NAME("PINSRB Gx, ED, Ib");

                     nextop = F8;

@@ -1097,21 +1112,70 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     INST_NAME("INSERTPS Gx, Ex, Ib");

                     nextop = F8;

                     GETGX(q0, 1);

-                    if(MODREG) {

-                        GETEX(q1, 0, 1);

+                    d0 = fpu_get_scratch(dyn);

+                    VMOVQ(d0, q0);

+                    if (MODREG) {

+                        q1 = sse_get_reg(dyn, ninst, x1, (nextop & 7) + (rex.b << 3), 0);

                         u8 = F8;

-                        VMOVQDto(x1, q1, (u8>>6)&3);

+                        uint8_t count_d = (u8 >> 4) & 3;

+                        uint8_t count_s = u8 >> 6;

+                        #define GO(A) \

+                            switch (count_d) {              \

+                                case 0:                     \

+                                    VMOVeS(d0, 0, q1, A);   \

+                                    break;                  \

+                                case 1:                     \

+                                    VMOVeS(d0, 1, q1, A);   \

+                                    break;                  \

+                                case 2:                     \

+                                    VMOVeS(d0, 2, q1, A);   \

+                                    break;                  \

+                                case 3:                     \

+                                    VMOVeS(q0, 3, q1, A);   \

+                                    break;                  \

+                            }

+                        switch (count_s) {

+                            case 0:

+                                GO(0)

+                                break;

+                            case 1:

+                                GO(1)

+                                break;

+                            case 2:

+                                GO(2)

+                                break;

+                            case 3:

+                                GO(3)

+                                break;

+                        }

+                        #undef GO

                     } else {

                         SMREAD();

-                        addr = geted(dyn, addr, ninst, nextop, &wback, x1, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 1);

-                        LDW(x1, wback, fixedaddress);

+                        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 1);

                         u8 = F8;

+                        uint8_t count_d = (u8 >> 4) & 3;

+                        LDW(x2, ed, fixedaddress);

+                        switch (count_d) {

+                            case 0:

+                                VMOVQSfrom(d0, 0, x2);

+                                break; 

+                            case 1:

+                                VMOVQSfrom(d0, 1, x2);

+                                break;

+                            case 2:

+                                VMOVQSfrom(d0, 2, x2);

+                                break;

+                            case 3:

+                                VMOVQSfrom(d0, 3, x2);

+                                break;

+                        }

                     }

-                    for(int i=0; i<4; ++i) {

-                        if(u8&(1<<i)) {

-                            VMOVQDfrom(q0, i, xZR);

-                        } else if(i==(u8>>4)&3) {

-                            VMOVQDfrom(q0, i, x1);

+                    uint8_t zmask = u8 & 0xf;

+                    for (uint8_t i=0; i<4; i++) {

+                        if (zmask & (1<<i)) {

+                            VMOVQSfrom(q0, i, wZR);

+                        } else {

+                            VMOVeS(q0, i, d0, i);

                         }

                     }

                     break;

diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 47c6da19..d78b6ecb 100644
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -2090,7 +2090,12 @@ EXPORT int32_t my_execl(x64emu_t* emu, const char* path)
         newargv[j++] = getVargN(emu, k+1);
     if(self) newargv[1] = emu->context->fullpath;
     printf_log(LOG_DEBUG, " => execle(\"%s\", %p [\"%s\", \"%s\"...:%d])\n", newargv[0], newargv, newargv[1], i?newargv[2]:"", i);
-    int ret = execv(newargv[0], newargv);
+    int ret = 0;
+    if (!(x64 || x86 || script || self)) {
+        ret = execv(path, newargv);
+    } else {
+        ret = execv(newargv[0], newargv);
+    }
     box_free(newargv);
     return ret;
 }