Hi Bernhard,
On 19/10/25 23:03, Bernhard Beschow wrote:
As per the previous patch, the APIC instance is already available in
apic_msr_{read,write}, so it can be passed along. It turns out that
the call to cpu_get_current_apic() is only required in
apic_mem_{read,write}, so it has been moved there. Longer term,
cpu_get_current_apic() could be removed entirely if
apic_mem_{read,write} is tied to a CPU's local address space.
Signed-off-by: Bernhard Beschow <[email protected]>
---
hw/intc/apic.c | 35 ++++++++++++++++-------------------
1 file changed, 16 insertions(+), 19 deletions(-)
@@ -1054,12 +1046,17 @@ static int apic_register_write(int index, uint64_t val)
static void apic_mem_write(void *opaque, hwaddr addr, uint64_t val,
unsigned size)
{
+ APICCommonState *s = cpu_get_current_apic();
int index = (addr >> 4) & 0xff;
if (size < 4) {
return;
}
+ if (!s) {
+ return;
+ }
This is not the correct place to return...
if (addr > 0xfff || !index) {
/*
* MSI and MMIO APIC are at the same memory location,
... because of this comment. See the (squashed) fix below.
@@ -1073,7 +1070,7 @@ static void apic_mem_write(void *opaque, hwaddr addr,
uint64_t val,
return;
}
- apic_register_write(index, val);
+ apic_register_write(s, index, val);
}
-- >8 --
diff --git a/hw/intc/apic.c b/hw/intc/apic.c
index 077ef18686b..aad253af158 100644
--- a/hw/intc/apic.c
+++ b/hw/intc/apic.c
@@ -1046,30 +1046,30 @@ static int apic_register_write(APICCommonState
*s, int index, uint64_t val)
static void apic_mem_write(void *opaque, hwaddr addr, uint64_t val,
unsigned size)
{
APICCommonState *s = cpu_get_current_apic();
int index = (addr >> 4) & 0xff;
if (size < 4) {
return;
}
- if (!s) {
- return;
- }
-
if (addr > 0xfff || !index) {
/*
* MSI and MMIO APIC are at the same memory location,
* but actually not on the global bus: MSI is on PCI bus
* APIC is connected directly to the CPU.
* Mapping them on the global bus happens to work because
* MSI registers are reserved in APIC MMIO and vice versa.
*/
MSIMessage msi = { .address = addr, .data = val };
apic_send_msi(&msi);
return;
}
+ if (!s) {
+ return;
+ }
+
apic_register_write(s, index, val);
}
---