about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorAlexandre Julliard <julliard@winehq.org>2023-06-23 15:24:22 +0200
committerGitHub <noreply@github.com>2023-06-23 15:24:22 +0200
commit410447b340b34c18a8ddd1da858c7f2b96c42db1 (patch)
treecff7487bce6dea276575749e59d6db93b8c37498 /src
parent6b0a1d286a0ff9a01370fb79320f85768e313549 (diff)
downloadbox64-410447b340b34c18a8ddd1da858c7f2b96c42db1.tar.gz
box64-410447b340b34c18a8ddd1da858c7f2b96c42db1.zip
[32BITS] Use 32-bit types to compute 32-bit addresses. (#851)
The base address needs to wrap around at 32 bits before being
converted to a pointer.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64run_private.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 232fe163..f80ea58e 100755
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -1147,17 +1147,17 @@ static uint64_t F64(uintptr_t* addr) {
     return ret;
 }
 
-reg64_t* GetECommon_32(x64emu_t* emu, uintptr_t* addr, uint8_t m, uintptr_t base)
+reg64_t* GetECommon_32(x64emu_t* emu, uintptr_t* addr, uint8_t m, uint32_t base)
 {
     if (m<=7) {
         if(m==0x4) {
             uint8_t sib = F8(addr);
-            base += ((sib&0x7)==5)?((uint64_t)(int64_t)F32S(addr)):(emu->regs[(sib&0x7)].dword[0]); // base
+            base += ((sib&0x7)==5)?((uint32_t)F32S(addr)):(emu->regs[(sib&0x7)].dword[0]); // base
             base += (emu->sbiidx[((sib>>3)&7)]->sdword[0] << (sib>>6));
-            return (reg64_t*)base;
+            return (reg64_t*)(uintptr_t)base;
         } else if (m==0x5) { //disp32
             base += F32S(addr);
-            return (reg64_t*)(base);
+            return (reg64_t*)(uintptr_t)base;
         }
         return (reg64_t*)(uintptr_t)(base + emu->regs[m].dword[0]);
     } else {
@@ -1169,10 +1169,10 @@ reg64_t* GetECommon_32(x64emu_t* emu, uintptr_t* addr, uint8_t m, uintptr_t base
             base += emu->regs[(m&0x7)].dword[0];
         }
         base+=(m&0x80)?F32S(addr):F8S(addr);
-        return (reg64_t*)base;
+        return (reg64_t*)(uintptr_t)base;
     }
 }
-reg64_t* GetEw16_32(x64emu_t *emu, uintptr_t* addr, uint8_t m, uintptr_t base)
+reg64_t* GetEw16_32(x64emu_t *emu, uintptr_t* addr, uint8_t m, uint32_t base)
 {
     switch(m&7) {
         case 0: base+= R_BX+R_SI; break;
@@ -1190,7 +1190,7 @@ reg64_t* GetEw16_32(x64emu_t *emu, uintptr_t* addr, uint8_t m, uintptr_t base)
         case 2: base += F16S(addr); break;
         // case 3 is C0..C7, already dealt with
     }
-    return (reg64_t*)base;
+    return (reg64_t*)(uintptr_t)base;
 }
 
 reg64_t* GetECommon(x64emu_t* emu, uintptr_t* addr, rex_t rex, uint8_t m, uint8_t delta)