Fix wrong behavior of cpu_memory_rw_debug() function in SMM
There is a problem, that you don't have access to the data using cpu_memory_rw_debug() function when in SMM. You can't remotely debug SMM mode program because of that for example. Likely attrs version of get_phys_page_debug should be used to get correct asidx at the end to handle access properly. Here the patch to fix it. Signed-off-by: Dmitry Poletaev <poletaev@ispras.ru> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
549d400587
commit
56f997500a
|
@ -5984,7 +5984,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
cc->asidx_from_attrs = x86_asidx_from_attrs;
|
cc->asidx_from_attrs = x86_asidx_from_attrs;
|
||||||
cc->get_memory_mapping = x86_cpu_get_memory_mapping;
|
cc->get_memory_mapping = x86_cpu_get_memory_mapping;
|
||||||
cc->get_phys_page_debug = x86_cpu_get_phys_page_debug;
|
cc->get_phys_page_attrs_debug = x86_cpu_get_phys_page_attrs_debug;
|
||||||
cc->write_elf64_note = x86_cpu_write_elf64_note;
|
cc->write_elf64_note = x86_cpu_write_elf64_note;
|
||||||
cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote;
|
cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote;
|
||||||
cc->write_elf32_note = x86_cpu_write_elf32_note;
|
cc->write_elf32_note = x86_cpu_write_elf32_note;
|
||||||
|
|
|
@ -1551,7 +1551,8 @@ void x86_cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list,
|
||||||
|
|
||||||
void x86_cpu_dump_state(CPUState *cs, FILE *f, int flags);
|
void x86_cpu_dump_state(CPUState *cs, FILE *f, int flags);
|
||||||
|
|
||||||
hwaddr x86_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
hwaddr x86_cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr,
|
||||||
|
MemTxAttrs *attrs);
|
||||||
|
|
||||||
int x86_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
int x86_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||||
int x86_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
int x86_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||||
|
|
|
@ -715,7 +715,8 @@ void cpu_x86_update_cr4(CPUX86State *env, uint32_t new_cr4)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
|
hwaddr x86_cpu_get_phys_page_attrs_debug(CPUState *cs, vaddr addr,
|
||||||
|
MemTxAttrs *attrs)
|
||||||
{
|
{
|
||||||
X86CPU *cpu = X86_CPU(cs);
|
X86CPU *cpu = X86_CPU(cs);
|
||||||
CPUX86State *env = &cpu->env;
|
CPUX86State *env = &cpu->env;
|
||||||
|
@ -725,6 +726,8 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
|
||||||
uint32_t page_offset;
|
uint32_t page_offset;
|
||||||
int page_size;
|
int page_size;
|
||||||
|
|
||||||
|
*attrs = cpu_get_mem_attrs(env);
|
||||||
|
|
||||||
a20_mask = x86_get_a20_mask(env);
|
a20_mask = x86_get_a20_mask(env);
|
||||||
if (!(env->cr[0] & CR0_PG_MASK)) {
|
if (!(env->cr[0] & CR0_PG_MASK)) {
|
||||||
pte = addr & a20_mask;
|
pte = addr & a20_mask;
|
||||||
|
|
Loading…
Reference in a new issue