mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33:54 -06:00
target/i386: enable A20 automatically in system management mode
Ignore env->a20_mask when running in system management mode. Reported-by: Anthony Xu <anthony.xu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <1494502528-12670-1-git-send-email-pbonzini@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
2cbe2de545
commit
c8bc83a4dd
3 changed files with 42 additions and 27 deletions
|
@ -272,25 +272,27 @@ void x86_cpu_get_memory_mapping(CPUState *cs, MemoryMappingList *list,
|
|||
{
|
||||
X86CPU *cpu = X86_CPU(cs);
|
||||
CPUX86State *env = &cpu->env;
|
||||
int32_t a20_mask;
|
||||
|
||||
if (!cpu_paging_enabled(cs)) {
|
||||
/* paging is disabled */
|
||||
return;
|
||||
}
|
||||
|
||||
a20_mask = x86_get_a20_mask(env);
|
||||
if (env->cr[4] & CR4_PAE_MASK) {
|
||||
#ifdef TARGET_X86_64
|
||||
if (env->hflags & HF_LMA_MASK) {
|
||||
if (env->cr[4] & CR4_LA57_MASK) {
|
||||
hwaddr pml5e_addr;
|
||||
|
||||
pml5e_addr = (env->cr[3] & PLM4_ADDR_MASK) & env->a20_mask;
|
||||
walk_pml5e(list, cs->as, pml5e_addr, env->a20_mask);
|
||||
pml5e_addr = (env->cr[3] & PLM4_ADDR_MASK) & a20_mask;
|
||||
walk_pml5e(list, cs->as, pml5e_addr, a20_mask);
|
||||
} else {
|
||||
hwaddr pml4e_addr;
|
||||
|
||||
pml4e_addr = (env->cr[3] & PLM4_ADDR_MASK) & env->a20_mask;
|
||||
walk_pml4e(list, cs->as, pml4e_addr, env->a20_mask,
|
||||
pml4e_addr = (env->cr[3] & PLM4_ADDR_MASK) & a20_mask;
|
||||
walk_pml4e(list, cs->as, pml4e_addr, a20_mask,
|
||||
0xffffULL << 48);
|
||||
}
|
||||
} else
|
||||
|
@ -298,16 +300,16 @@ void x86_cpu_get_memory_mapping(CPUState *cs, MemoryMappingList *list,
|
|||
{
|
||||
hwaddr pdpe_addr;
|
||||
|
||||
pdpe_addr = (env->cr[3] & ~0x1f) & env->a20_mask;
|
||||
walk_pdpe2(list, cs->as, pdpe_addr, env->a20_mask);
|
||||
pdpe_addr = (env->cr[3] & ~0x1f) & a20_mask;
|
||||
walk_pdpe2(list, cs->as, pdpe_addr, a20_mask);
|
||||
}
|
||||
} else {
|
||||
hwaddr pde_addr;
|
||||
bool pse;
|
||||
|
||||
pde_addr = (env->cr[3] & ~0xfff) & env->a20_mask;
|
||||
pde_addr = (env->cr[3] & ~0xfff) & a20_mask;
|
||||
pse = !!(env->cr[4] & CR4_PSE_MASK);
|
||||
walk_pde2(list, cs->as, pde_addr, env->a20_mask, pse);
|
||||
walk_pde2(list, cs->as, pde_addr, a20_mask, pse);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue