qemu/target-i386
Alexander Graf 33dfdb56f2 x86: only allow real mode to access 32bit without LMA
When we're running in non-64bit mode with qemu-system-x86_64 we can
still end up with virtual addresses that are above the 32bit boundary
if a segment offset is set up.

GNU Hurd does exactly that. It sets the segment offset to 0x80000000 and
puts its EIP value to 0x8xxxxxxx to access low memory.

This doesn't hit us when we enable paging, as there we just mask away the
unused bits. But with real mode, we assume that vaddr == paddr which is
wrong in this case. Real hardware wraps the virtual address around at the
32bit boundary. So let's do the same.

This fixes booting GNU Hurd in qemu-system-x86_64 for me.

Reported-by: Michael Tokarev <mjt@tls.msk.ru>
Signed-off-by: Alexander Graf <agraf@suse.de>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
2013-12-23 16:02:20 +04:00
..
arch_dump.c dump: rebase from host-private RAMBlock offsets to guest-physical addresses 2013-08-08 11:01:46 -04:00
arch_memory_mapping.c target-i386: Fix compiler warning (integer constant is too large) 2013-10-02 22:55:28 +04:00
cc_helper_template.h target-i386: Implement BLSR, BLSMSK, BLSI 2013-02-18 15:52:05 -08:00
cc_helper.c target-i386/helper: remove DF macro 2013-06-15 17:50:21 +00:00
cpu-qom.h target-i386: forward CPUID cache leaves when -cpu host is used 2013-09-20 12:38:40 +02:00
cpu.c target-i386: fix cpuid leaf 0x0d 2013-12-05 18:51:08 +01:00
cpu.h x86: fix migration from pre-version 12 2013-10-02 18:58:23 +03:00
excp_helper.c target-i386/helper: remove EIP macro 2013-06-15 17:50:13 +00:00
fpu_helper.c target-i386: add AES-NI instructions 2013-04-13 13:51:57 +02:00
gdbstub.c cpu: Introduce CPUClass::gdb_{read,write}_register() 2013-07-27 00:04:17 +02:00
helper.c x86: only allow real mode to access 32bit without LMA 2013-12-23 16:02:20 +04:00
helper.h target-i386: yield to another VCPU on PAUSE 2013-11-21 17:39:20 +01:00
int_helper.c target-i386/helper: remove EDX macro 2013-06-15 17:49:10 +00:00
ioport-user.c exec: move include files to include/exec/ 2012-12-19 08:31:31 +01:00
kvm_i386.h softmmu: move include files to include/sysemu/ 2012-12-19 08:32:45 +01:00
kvm-stub.c target-i386: Fix build by providing stub kvm_arch_get_supported_cpuid() 2013-11-21 17:39:11 +01:00
kvm.c kvm: Fix uninitialized cpuid_data 2013-11-07 13:14:56 +02:00
machine.c fix steal time MSR vmsd callback to proper opaque type 2013-09-20 12:37:52 +02:00
Makefile.objs Makefile.target: CONFIG_NO_* variables removed 2013-10-16 18:21:00 +02:00
mem_helper.c target-i386/helper: remove EDX macro 2013-06-15 17:49:10 +00:00
misc_helper.c target-i386: yield to another VCPU on PAUSE 2013-11-21 17:39:20 +01:00
ops_sse_header.h target-i386: add AES-NI instructions 2013-04-13 13:51:57 +02:00
ops_sse.h target-i386: add AES-NI instructions 2013-04-13 13:51:57 +02:00
seg_helper.c target-i386: Change LOG_PCALL_STATE() argument to CPUState 2013-07-09 21:33:04 +02:00
shift_helper_template.h target-i386: compute eflags outside rcl/rcr helper 2013-02-18 15:03:56 -08:00
smm_helper.c log: Change log_cpu_state[_mask]() argument to CPUState 2013-07-09 21:33:04 +02:00
svm_helper.c target-i386: fix over 80 chars warnings 2013-06-15 17:50:38 +00:00
svm.h Use new macro QEMU_PACKED for packed structures 2011-09-03 10:45:59 +00:00
TODO target-i386: fix {min,max}{pd,ps,sd,ss} SSE2 instructions 2012-01-11 09:55:28 +01:00
topology.h target-i386: Inline bitops_flsl 2013-02-16 11:12:29 +00:00
translate.c target-i386: yield to another VCPU on PAUSE 2013-11-21 17:39:20 +01:00