128 lines
4.0 KiB
Diff
128 lines
4.0 KiB
Diff
|
|
From 8fa5af7de07d9bc2535ea8fab087d509795e3579 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Salil Mehta <salil.mehta@huawei.com>
|
||
|
|
Date: Sun, 6 Aug 2023 22:12:52 +0000
|
||
|
|
Subject: [PATCH] physmem,gdbstub: Common helping funcs/changes to *unrealize*
|
||
|
|
vCPU
|
||
|
|
|
||
|
|
Supporting vCPU Hotplug for ARM arch also means introducing new functionality of
|
||
|
|
unrealizing the ARMCPU. This requires some new common functions.
|
||
|
|
|
||
|
|
Defining them as part of architecture independent change so that this code could
|
||
|
|
be reused by other interested parties.
|
||
|
|
|
||
|
|
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||
|
|
---
|
||
|
|
gdbstub/gdbstub.c | 6 ++++++
|
||
|
|
include/exec/cpu-common.h | 8 ++++++++
|
||
|
|
include/exec/gdbstub.h | 1 +
|
||
|
|
include/hw/core/cpu.h | 1 +
|
||
|
|
system/physmem.c | 25 +++++++++++++++++++++++++
|
||
|
|
5 files changed, 41 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
|
||
|
|
index 46d752bbc2..f16006d2a8 100644
|
||
|
|
--- a/gdbstub/gdbstub.c
|
||
|
|
+++ b/gdbstub/gdbstub.c
|
||
|
|
@@ -582,6 +582,12 @@ void gdb_register_coprocessor(CPUState *cpu,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
+void gdb_unregister_coprocessor_all(CPUState *cpu)
|
||
|
|
+{
|
||
|
|
+ g_array_free(cpu->gdb_regs, true);
|
||
|
|
+ cpu->gdb_regs = NULL;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
static void gdb_process_breakpoint_remove_all(GDBProcess *p)
|
||
|
|
{
|
||
|
|
CPUState *cpu = gdb_get_first_cpu_in_process(p);
|
||
|
|
diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
|
||
|
|
index 41115d8919..2a3d4aa1c8 100644
|
||
|
|
--- a/include/exec/cpu-common.h
|
||
|
|
+++ b/include/exec/cpu-common.h
|
||
|
|
@@ -139,6 +139,14 @@ size_t qemu_ram_pagesize_largest(void);
|
||
|
|
*/
|
||
|
|
void cpu_address_space_init(CPUState *cpu, int asidx,
|
||
|
|
const char *prefix, MemoryRegion *mr);
|
||
|
|
+/**
|
||
|
|
+ * cpu_address_space_destroy:
|
||
|
|
+ * @cpu: CPU for which address space needs to be destroyed
|
||
|
|
+ * @asidx: integer index of this address space
|
||
|
|
+ *
|
||
|
|
+ * Note that with KVM only one address space is supported.
|
||
|
|
+ */
|
||
|
|
+void cpu_address_space_destroy(CPUState *cpu, int asidx);
|
||
|
|
|
||
|
|
void cpu_physical_memory_rw(hwaddr addr, void *buf,
|
||
|
|
hwaddr len, bool is_write);
|
||
|
|
diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h
|
||
|
|
index d8a3c56fa2..d123b838c2 100644
|
||
|
|
--- a/include/exec/gdbstub.h
|
||
|
|
+++ b/include/exec/gdbstub.h
|
||
|
|
@@ -39,6 +39,7 @@ typedef int (*gdb_set_reg_cb)(CPUArchState *env, uint8_t *buf, int reg);
|
||
|
|
void gdb_register_coprocessor(CPUState *cpu,
|
||
|
|
gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg,
|
||
|
|
int num_regs, const char *xml, int g_pos);
|
||
|
|
+void gdb_unregister_coprocessor_all(CPUState *cpu);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* gdbserver_start: start the gdb server
|
||
|
|
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
|
||
|
|
index 0ca778eb75..6dbe163548 100644
|
||
|
|
--- a/include/hw/core/cpu.h
|
||
|
|
+++ b/include/hw/core/cpu.h
|
||
|
|
@@ -496,6 +496,7 @@ struct CPUState {
|
||
|
|
QSIMPLEQ_HEAD(, qemu_work_item) work_list;
|
||
|
|
|
||
|
|
CPUAddressSpace *cpu_ases;
|
||
|
|
+ int cpu_ases_ref_count;
|
||
|
|
int num_ases;
|
||
|
|
AddressSpace *as;
|
||
|
|
MemoryRegion *memory;
|
||
|
|
diff --git a/system/physmem.c b/system/physmem.c
|
||
|
|
index 247c252e53..299174ad91 100644
|
||
|
|
--- a/system/physmem.c
|
||
|
|
+++ b/system/physmem.c
|
||
|
|
@@ -761,6 +761,7 @@ void cpu_address_space_init(CPUState *cpu, int asidx,
|
||
|
|
|
||
|
|
if (!cpu->cpu_ases) {
|
||
|
|
cpu->cpu_ases = g_new0(CPUAddressSpace, cpu->num_ases);
|
||
|
|
+ cpu->cpu_ases_ref_count = cpu->num_ases;
|
||
|
|
}
|
||
|
|
|
||
|
|
newas = &cpu->cpu_ases[asidx];
|
||
|
|
@@ -774,6 +775,30 @@ void cpu_address_space_init(CPUState *cpu, int asidx,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
+void cpu_address_space_destroy(CPUState *cpu, int asidx)
|
||
|
|
+{
|
||
|
|
+ CPUAddressSpace *cpuas;
|
||
|
|
+
|
||
|
|
+ assert(asidx < cpu->num_ases);
|
||
|
|
+ assert(asidx == 0 || !kvm_enabled());
|
||
|
|
+ assert(cpu->cpu_ases);
|
||
|
|
+
|
||
|
|
+ cpuas = &cpu->cpu_ases[asidx];
|
||
|
|
+ if (tcg_enabled()) {
|
||
|
|
+ memory_listener_unregister(&cpuas->tcg_as_listener);
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ address_space_destroy(cpuas->as);
|
||
|
|
+ g_free_rcu(cpuas->as, rcu);
|
||
|
|
+
|
||
|
|
+ if (cpu->cpu_ases_ref_count == 1) {
|
||
|
|
+ g_free(cpu->cpu_ases);
|
||
|
|
+ cpu->cpu_ases = NULL;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ cpu->cpu_ases_ref_count--;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
AddressSpace *cpu_get_address_space(CPUState *cpu, int asidx)
|
||
|
|
{
|
||
|
|
/* Return the AddressSpace corresponding to the specified index */
|
||
|
|
--
|
||
|
|
2.27.0
|
||
|
|
|