mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 18:44:58 -06:00
target/i386: emulate 64-bit ring 0 for linux-user if LM feature is set
32-bit binaries can run on a long mode processor even if the kernel is 64-bit, of course, and this can have slightly different behavior; for example, SYSCALL is allowed on Intel processors. Allow reporting LM to programs running under user mode emulation, so that "-cpu" can be used with named CPU models even for qemu-i386 and even without disabling LM by hand. Fortunately, most of the runtime code in QEMU has to depend on HF_LMA_MASK or on HF_CS64_MASK (which is anyway false for qemu-i386's 32-bit code segment) rather than TARGET_X86_64, therefore all that is needed is an update of linux-user's ring 0 setup. Fixes: https://gitlab.com/qemu-project/qemu/-/issues/1534 Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
d903259dd2
commit
40a205da41
3 changed files with 44 additions and 34 deletions
|
@ -666,7 +666,10 @@ void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
|
|||
* and therefore using the 32-bit ABI; the CPU itself might be 64-bit
|
||||
* but again the difference is only visible in kernel mode.
|
||||
*/
|
||||
#if defined CONFIG_USER_ONLY
|
||||
#if defined CONFIG_LINUX_USER
|
||||
#define CPUID_EXT2_KERNEL_FEATURES (CPUID_EXT2_LM | CPUID_EXT2_FFXSR)
|
||||
#elif defined CONFIG_USER_ONLY
|
||||
/* FIXME: Long mode not yet supported for i386 bsd-user */
|
||||
#define CPUID_EXT2_KERNEL_FEATURES CPUID_EXT2_FFXSR
|
||||
#else
|
||||
#define CPUID_EXT2_KERNEL_FEATURES 0
|
||||
|
@ -5539,7 +5542,15 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
|||
}
|
||||
#ifndef TARGET_X86_64
|
||||
if (w == FEAT_8000_0001_EDX) {
|
||||
r &= ~CPUID_EXT2_LM;
|
||||
/*
|
||||
* 32-bit TCG can emulate 64-bit compatibility mode. If there is no
|
||||
* way for userspace to get out of its 32-bit jail, we can leave
|
||||
* the LM bit set.
|
||||
*/
|
||||
uint32_t unavail = tcg_enabled()
|
||||
? CPUID_EXT2_LM & ~CPUID_EXT2_KERNEL_FEATURES
|
||||
: CPUID_EXT2_LM;
|
||||
r &= ~unavail;
|
||||
}
|
||||
#endif
|
||||
if (migratable_only) {
|
||||
|
|
|
@ -173,12 +173,14 @@ typedef struct DisasContext {
|
|||
#endif
|
||||
#if !defined(TARGET_X86_64)
|
||||
#define CODE64(S) false
|
||||
#define LMA(S) false
|
||||
#elif defined(CONFIG_USER_ONLY)
|
||||
#define CODE64(S) true
|
||||
#define LMA(S) true
|
||||
#else
|
||||
#define CODE64(S) (((S)->flags & HF_CS64_MASK) != 0)
|
||||
#endif
|
||||
#if defined(CONFIG_SOFTMMU) && !defined(TARGET_X86_64)
|
||||
#define LMA(S) false
|
||||
#else
|
||||
#define LMA(S) (((S)->flags & HF_LMA_MASK) != 0)
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue