- coro: support live patch for libcare
- tests/acpi: Update expected ACPI tables for vcpu hotplug(update BinDir)
- arm/virt: Require mc->has_hotpluggable_cpus for cold-plugged vcpu
- arm/virt: Consider has_ged when set mc->has_hotpluggable_cpus
- arm/virt-acpi: Require possible_cpu_arch_ids for build_cpus_aml()
- acpi/ged: Remove cpuhp field of ged
- acpi/ged: Init cpu hotplug only when machine support it
- intc/gicv3: Fixes for vcpu hotplug
- arm/kvm: Set psci smccc filter only with vcpu hotplug
- accel/kvm: Use correct id for parked vcpu
- arm/virt: Fix adjudgement of core_id for vcpu hotplugged
- arm/virt.c: Convey local_err when set psci-conduit
- system/cpus: Fix resume_all_vcpus() under vCPU hotplug condition
- system/cpus: Fix pause_all_vcpus() under concurrent environment
- acpi/cpu: Fix cpu_hotplug_hw_init()
- arm/cpu: Some fixes for arm_cpu_unrealizefn()
- system/physmem: Fix possible double free when destroy cpu as
- hw/arm/virt: Expose cold-booted CPUs as MADT GICC Enabled
- tcg/mttcg: enable threads to unregister in tcg_ctxs[]
- hw/arm: Support hotplug capability check using _OSC method
- target/arm/kvm,tcg: Register/Handle SMCCC hypercall exits to VMM/Qemu
- target/arm/kvm: Write CPU state back to KVM on reset
- target/arm: Add support of *unrealize* ARMCPU during vCPU Hot-unplug
- physmem,gdbstub: Common helping funcs/changes to *unrealize* vCPU
- hw/arm: Changes required for reset and to support next boot
- arm/virt: Update the guest(via GED) about CPU hot-(un)plug events
- hw/intc/arm-gicv3*: Changes required to (re)init the vCPU register info
- hw/arm,gicv3: Changes to update GIC with vCPU hot-plug notification
- arm/virt: Changes to (un)wire GICC<->vCPU IRQs during hot-(un)plug
- arm/virt: Add/update basic hot-(un)plug framework
- hw/acpi: Update ACPI GED framework to support vCPU Hotplug
- arm/virt: Release objects for *disabled* possible vCPUs after init
- hw/acpi: Make _MAT method optional
- hw/arm: MADT Tbl change to size the guest with possible vCPUs
- hw/acpi: Update GED _EVT method AML with cpu scan
- hw/acpi: ACPI/AML Changes to reflect the correct _STA.{PRES,ENA} Bits to Guest
- arm/virt: Make ARM vCPU *present* status ACPI *persistent*
- arm/virt/acpi: Build CPUs AML with CPU Hotplug support
- tests/acpi/bios-tables-test: Allow changes to virt/DSDT file
- acpi/cpu: Add cpu_cppc building support
- arm/virt/acpi: Factor out CPPC building from DSDT CPU aml
- hw/acpi: Update CPUs AML with cpu-(ctrl)dev change
- arm/virt: Create GED dev before *disabled* CPU Objs are destroyed
- arm/virt: Add cpu hotplug events to GED during creation
- hw/acpi: Init GED framework with cpu hotplug events
- hw/acpi: Use qemu_present_cpu() API in ACPI CPU hotplug init
- hw/acpi: Add ACPI CPU hotplug init stub
- arm/acpi: Enable ACPI support for vcpu hotplug
- hw/acpi: Move CPU ctrl-dev MMIO region len macro to common header file
- arm/virt: Init PMU at host for all possible vcpus
- arm/virt,gicv3: Changes to pre-size GIC with possible vcpus @machine init
- arm/virt,kvm: Pre-create disabled possible vCPUs @machine init
- accel/kvm: Extract common KVM vCPU {creation,parking} code
- arm/virt,target/arm: Machine init time change common to vCPU {cold|hot}-plug
- hw/arm/virt: Move setting of common CPU properties in a function
- cpus-common: Add common CPU utility for possible vCPUs
- arm/virt,target/arm: Add new ARMCPU {socket,cluster,core,thread}-id property
Signed-off-by: Jiabo Feng <fengjiabo1@huawei.com>
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
|
|
|