diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-10-08 20:48:13 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-10-08 20:48:13 +0200 |
| commit | bb651298c4a42adc2912c95acc5d34075a8b8443 (patch) | |
| tree | 4bced0859850367001d2caf69a74554a6cf7049b /src | |
| parent | 8850a1107219024d5540c18d2dda18cdfaeaf73c (diff) | |
| download | box64-bb651298c4a42adc2912c95acc5d34075a8b8443.tar.gz box64-bb651298c4a42adc2912c95acc5d34075a8b8443.zip | |
[BOX32] Added better handling of fcntl (should help Wine when futex_waitv syscall is not available)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/include/myalign32.h | 13 | ||||
| -rwxr-xr-x | src/libtools/myalign32.c | 26 | ||||
| -rwxr-xr-x | src/wrapped32/wrappedlibc.c | 20 |
3 files changed, 56 insertions, 3 deletions
diff --git a/src/include/myalign32.h b/src/include/myalign32.h index 07585141..505f6cbe 100755 --- a/src/include/myalign32.h +++ b/src/include/myalign32.h @@ -435,6 +435,19 @@ typedef struct __attribute__((packed, aligned(4))) x86_flock64_s { // alignment void UnalignFlock64_32(void* dest, void* source); // Arm -> x86 void AlignFlock64_32(void* dest, void* source); // x86 -> Arm + +typedef struct __attribute__((packed, aligned(4))) i386_flock_s +{ + short int l_type; + short int l_whence; + long_t l_start; + long_t l_len; + int l_pid; +} i386_flock_t; + +void UnalignFlock_32(void* dest, void* source); // Arm -> x86 +void AlignFlock_32(void* dest, void* source); // x86 -> Arm + #if 0 // defined in wrapperlibc.c int of_convert(int); // x86->arm diff --git a/src/libtools/myalign32.c b/src/libtools/myalign32.c index e14912a0..e47167d9 100755 --- a/src/libtools/myalign32.c +++ b/src/libtools/myalign32.c @@ -1547,4 +1547,28 @@ void UnalignMsgHdr_32(void* dest, void* source) } else d->msg_control = 0; d->msg_flags = s->msg_flags; -} \ No newline at end of file +} + +#define TRANSFERT \ +GO(l_type) \ +GO(l_whence) \ +GO(l_start) \ +GO(l_len) \ +GO(l_pid) + +// Arm -> x86 +void UnalignFlock_32(void* dest, void* source) +{ + #define GO(A) ((i386_flock_t*)dest)->A = ((my_flock64_t*)source)->A; + TRANSFERT + #undef GO +} + +// x86 -> Arm +void AlignFlock_32(void* dest, void* source) +{ + #define GO(A) ((my_flock64_t*)dest)->A = ((i386_flock_t*)source)->A; + TRANSFERT + #undef GO +} +#undef TRANSFERT diff --git a/src/wrapped32/wrappedlibc.c b/src/wrapped32/wrappedlibc.c index 418430d9..5a829510 100755 --- a/src/wrapped32/wrappedlibc.c +++ b/src/wrapped32/wrappedlibc.c @@ -2120,12 +2120,20 @@ EXPORT int32_t my32_fcntl64(x64emu_t* emu, int32_t a, int32_t b, uint32_t d1, ui d1 = of_convert32(d1); if(b==F_GETLK64 || b==F_SETLK64 || b==F_SETLKW64) { - my_flock64_t fl; + my_flock64_t fl = {0}; AlignFlock64_32(&fl, from_ptrv(d1)); int ret = fcntl(a, b, &fl); UnalignFlock64_32(from_ptrv(d1), &fl); return ret; } + if(b==F_GETLK || b==F_SETLK || b==F_SETLKW) + { + struct flock fl = {0}; + AlignFlock_32(&fl, from_ptrv(d1)); + int ret = fcntl(a, b, &fl); + UnalignFlock_32(from_ptrv(d1), &fl); + return ret; + } //TODO: check if better to use the syscall or regular fcntl? //return syscall(__NR_fcntl64, a, b, d1); // should be enough int ret = fcntl(a, b, d1); @@ -2151,12 +2159,20 @@ EXPORT int32_t my32_fcntl(x64emu_t* emu, int32_t a, int32_t b, uint32_t d1, uint d1 = of_convert32(d1); if(b==F_GETLK64 || b==F_SETLK64 || b==F_SETLKW64) { - my_flock64_t fl; + my_flock64_t fl = {0}; AlignFlock64_32(&fl, from_ptrv(d1)); int ret = fcntl(a, b, &fl); UnalignFlock64_32(from_ptrv(d1), &fl); return ret; } + if(b==F_GETLK || b==F_SETLK || b==F_SETLKW) + { + struct flock fl = {0}; + AlignFlock_32(&fl, from_ptrv(d1)); + int ret = fcntl(a, b, &fl); + UnalignFlock_32(from_ptrv(d1), &fl); + return ret; + } int ret = fcntl(a, b, d1); if(b==F_GETFL && ret!=-1) ret = of_unconvert32(ret); |