From: Mohamed Mediouni <mohamed@unpredictable.fr>
The implementation in Hyper-V works fine and the code
currently present doesn't handle x2APIC correctly anyway, so
remove it and use the implementation in Hyper-V.
Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
Link: https://lore.kernel.org/r/20260307181856.2209-10-mohamed@unpredictable.fr
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
target/i386/whpx/whpx-all.c | 97 -------------------------------------
1 file changed, 97 deletions(-)
diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c
index b095c96962d..4d5d3dbd243 100644
--- a/target/i386/whpx/whpx-all.c
+++ b/target/i386/whpx/whpx-all.c
@@ -1692,100 +1692,6 @@ int whpx_vcpu_run(CPUState *cpu)
ret = whpx_handle_halt(cpu);
break;
- case WHvRunVpExitReasonX64ApicInitSipiTrap: {
- WHV_INTERRUPT_CONTROL ipi = {0};
- uint64_t icr = vcpu->exit_ctx.ApicInitSipi.ApicIcr;
- uint32_t delivery_mode =
- (icr & APIC_ICR_DELIV_MOD) >> APIC_ICR_DELIV_MOD_SHIFT;
- int dest_shorthand =
- (icr & APIC_ICR_DEST_SHORT) >> APIC_ICR_DEST_SHORT_SHIFT;
- bool broadcast = false;
- bool include_self = false;
- uint32_t i;
-
- /* We only registered for INIT and SIPI exits. */
- if ((delivery_mode != APIC_DM_INIT) &&
- (delivery_mode != APIC_DM_SIPI)) {
- error_report(
- "WHPX: Unexpected APIC exit that is not a INIT or SIPI");
- break;
- }
-
- if (delivery_mode == APIC_DM_INIT) {
- ipi.Type = WHvX64InterruptTypeInit;
- } else {
- ipi.Type = WHvX64InterruptTypeSipi;
- }
-
- ipi.DestinationMode =
- ((icr & APIC_ICR_DEST_MOD) >> APIC_ICR_DEST_MOD_SHIFT) ?
- WHvX64InterruptDestinationModeLogical :
- WHvX64InterruptDestinationModePhysical;
-
- ipi.TriggerMode =
- ((icr & APIC_ICR_TRIGGER_MOD) >> APIC_ICR_TRIGGER_MOD_SHIFT) ?
- WHvX64InterruptTriggerModeLevel :
- WHvX64InterruptTriggerModeEdge;
-
- ipi.Vector = icr & APIC_VECTOR_MASK;
- switch (dest_shorthand) {
- /* no shorthand. Bits 56-63 contain the destination. */
- case 0:
- ipi.Destination = (icr >> 56) & APIC_VECTOR_MASK;
- hr = whp_dispatch.WHvRequestInterrupt(whpx->partition,
- &ipi, sizeof(ipi));
- if (FAILED(hr)) {
- error_report("WHPX: Failed to request interrupt hr=%08lx",
- hr);
- }
-
- break;
-
- /* self */
- case 1:
- include_self = true;
- break;
-
- /* broadcast, including self */
- case 2:
- broadcast = true;
- include_self = true;
- break;
-
- /* broadcast, excluding self */
- case 3:
- broadcast = true;
- break;
- }
-
- if (!broadcast && !include_self) {
- break;
- }
-
- for (i = 0; i <= max_vcpu_index; i++) {
- if (i == cpu->cpu_index && !include_self) {
- continue;
- }
-
- /*
- * Assuming that APIC Ids are identity mapped since
- * WHvX64RegisterApicId & WHvX64RegisterInitialApicId registers
- * are not handled yet and the hypervisor doesn't allow the
- * guest to modify the APIC ID.
- */
- ipi.Destination = i;
- hr = whp_dispatch.WHvRequestInterrupt(whpx->partition,
- &ipi, sizeof(ipi));
- if (FAILED(hr)) {
- error_report(
- "WHPX: Failed to request SIPI for %d, hr=%08lx",
- i, hr);
- }
- }
-
- break;
- }
-
case WHvRunVpExitReasonCanceled:
if (exclusive_step_mode != WHPX_STEP_NONE) {
/*
@@ -2249,9 +2155,6 @@ int whpx_accel_init(AccelState *as, MachineState *ms)
memset(&prop, 0, sizeof(WHV_PARTITION_PROPERTY));
prop.ExtendedVmExits.X64MsrExit = 1;
prop.ExtendedVmExits.ExceptionExit = 1;
- if (whpx_irqchip_in_kernel()) {
- prop.ExtendedVmExits.X64ApicInitSipiExitTrap = 1;
- }
hr = whp_dispatch.WHvSetPartitionProperty(
whpx->partition,
--
2.53.0