If we got a wraparound of 32-bit operand, and the limit is 0xffffffff, read and
writes should be successful. It just needs to be done in two segments.
Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
                }
                if (addr.ea > lim)
                        goto bad;
-               *max_size = min_t(u64, ~0u, (u64)lim + 1 - addr.ea);
-               if (size > *max_size)
-                       goto bad;
+               if (lim == 0xffffffff)
+                       *max_size = ~0u;
+               else {
+                       *max_size = (u64)lim + 1 - addr.ea;
+                       if (size > *max_size)
+                               goto bad;
+               }
                la &= (u32)-1;
                break;
        }
 
                if (rc != X86EMUL_CONTINUE)
                        return rc;
                addr += now;
+               if (ctxt->mode != X86EMUL_MODE_PROT64)
+                       addr = (u32)addr;
                val += now;
                bytes -= now;
        }