aboutsummaryrefslogtreecommitdiff
path: root/target
diff options
context:
space:
mode:
Diffstat (limited to 'target')
-rw-r--r--target/i386/cpu.c21
-rw-r--r--target/i386/hax-mem.c19
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;
}