diff options
| author | wannacu <76616478+wannacu@users.noreply.github.com> | 2023-10-27 16:43:06 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-27 10:43:06 +0200 |
| commit | 81ca3cd06e17e33c4f19d4aa52030b53cb9f6e42 (patch) | |
| tree | 23b96a643d1ef2195f2f9b763839e86b48bc4bde | |
| parent | f8d65a831e6f92314513ab2603e74627bbc1711f (diff) | |
| download | box64-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.c | 86 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibc.c | 7 |
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; } |