diff options
Diffstat (limited to 'target')
-rw-r--r-- | target/i386/cpu.c | 21 | ||||
-rw-r--r-- | target/i386/hax-mem.c | 19 |
2 files changed, 34 insertions, 6 deletions
diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 13c0985f11..7e87031fad 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2577,6 +2577,15 @@ out: return ret; } +static gchar *x86_gdb_arch_name(CPUState *cs) +{ +#ifdef TARGET_X86_64 + return g_strdup("i386:x86-64"); +#else + return g_strdup("i386"); +#endif +} + X86CPU *cpu_x86_init(const char *cpu_model) { return X86_CPU(cpu_generic_init(TYPE_X86_CPU, cpu_model)); @@ -4056,10 +4065,14 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data) cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote; cc->vmsd = &vmstate_x86_cpu; #endif - /* CPU_NB_REGS * 2 = general regs + xmm regs - * 25 = eip, eflags, 6 seg regs, st[0-7], fctrl,...,fop, mxcsr. - */ - cc->gdb_num_core_regs = CPU_NB_REGS * 2 + 25; + cc->gdb_arch_name = x86_gdb_arch_name; +#ifdef TARGET_X86_64 + cc->gdb_core_xml_file = "i386-64bit-core.xml"; + cc->gdb_num_core_regs = 40; +#else + cc->gdb_core_xml_file = "i386-32bit-core.xml"; + cc->gdb_num_core_regs = 32; +#endif #ifndef CONFIG_USER_ONLY cc->debug_excp_handler = breakpoint_handler; #endif diff --git a/target/i386/hax-mem.c b/target/i386/hax-mem.c index 2884040021..af090343f3 100644 --- a/target/i386/hax-mem.c +++ b/target/i386/hax-mem.c @@ -106,10 +106,10 @@ static void hax_update_mapping(uint64_t start_pa, uint32_t size, uint64_t host_va, uint8_t flags) { uint64_t end_pa = start_pa + size; - uint32_t chunk_sz; HAXMapping *entry, *next; QTAILQ_FOREACH_SAFE(entry, &mappings, entry, next) { + uint32_t chunk_sz; if (start_pa >= entry->start_pa + entry->size) { continue; } @@ -121,7 +121,16 @@ static void hax_update_mapping(uint64_t start_pa, uint32_t size, start_pa += chunk_sz; host_va += chunk_sz; size -= chunk_sz; + } else if (start_pa > entry->start_pa) { + /* split the existing chunk at start_pa */ + chunk_sz = start_pa - entry->start_pa; + hax_insert_mapping_before(entry, entry->start_pa, chunk_sz, + entry->host_va, entry->flags); + entry->start_pa += chunk_sz; + entry->host_va += chunk_sz; + entry->size -= chunk_sz; } + /* now start_pa == entry->start_pa */ chunk_sz = MIN(size, entry->size); if (chunk_sz) { bool nop = hax_mapping_is_opposite(entry, host_va, flags); @@ -165,8 +174,14 @@ static void hax_process_section(MemoryRegionSection *section, uint8_t flags) unsigned int delta; uint64_t host_va; - /* We only care about RAM pages */ + /* We only care about RAM and ROM regions */ if (!memory_region_is_ram(mr)) { + if (memory_region_is_romd(mr)) { + /* HAXM kernel module does not support ROMD yet */ + fprintf(stderr, "%s: Warning: Ignoring ROMD region 0x%016" PRIx64 + "->0x%016" PRIx64 "\n", __func__, start_pa, + start_pa + size); + } return; } |