@@ -92,6 +92,8 @@ apicv_set_intr_ready(struct acrn_vlapic *vlapic, uint32_t vector);
92
92
93
93
static void apicv_post_intr (uint16_t dest_pcpu_id );
94
94
95
+ static void vlapic_x2apic_self_ipi_handler (struct acrn_vlapic * vlapic );
96
+
95
97
/*
96
98
* Post an interrupt to the vcpu running on 'hostcpu'. This will use a
97
99
* hardware assist if available (e.g. Posted Interrupt) or fall back to
@@ -1530,6 +1532,9 @@ vlapic_read(struct acrn_vlapic *vlapic, uint32_t offset_arg, uint64_t *data)
1530
1532
break ;
1531
1533
case APIC_OFFSET_ICR_LOW :
1532
1534
* data = lapic -> icr_lo .v ;
1535
+ if (is_x2apic_enabled (vlapic )) {
1536
+ * data |= ((uint64_t )lapic -> icr_hi .v ) << 32U ;
1537
+ }
1533
1538
break ;
1534
1539
case APIC_OFFSET_ICR_HI :
1535
1540
* data = lapic -> icr_hi .v ;
@@ -1568,8 +1573,7 @@ vlapic_read(struct acrn_vlapic *vlapic, uint32_t offset_arg, uint64_t *data)
1568
1573
}
1569
1574
}
1570
1575
1571
- dev_dbg (ACRN_DBG_LAPIC ,
1572
- "vlapic read offset %#x, data %#lx" , offset , * data );
1576
+ dev_dbg (ACRN_DBG_LAPIC , "vlapic read offset %#x, data %#llx" , offset , * data );
1573
1577
return 0 ;
1574
1578
}
1575
1579
@@ -1610,10 +1614,8 @@ vlapic_write(struct acrn_vlapic *vlapic, uint32_t offset, uint64_t data)
1610
1614
case APIC_OFFSET_ICR_LOW :
1611
1615
if (is_x2apic_enabled (vlapic )) {
1612
1616
lapic -> icr_hi .v = (uint32_t )(data >> 32U );
1613
- lapic -> icr_lo .v = data32 ;
1614
- } else {
1615
- lapic -> icr_lo .v = data32 ;
1616
1617
}
1618
+ lapic -> icr_lo .v = data32 ;
1617
1619
retval = vlapic_icrlo_write_handler (vlapic );
1618
1620
break ;
1619
1621
case APIC_OFFSET_ICR_HI :
@@ -1643,7 +1645,6 @@ vlapic_write(struct acrn_vlapic *vlapic, uint32_t offset, uint64_t data)
1643
1645
lapic -> dcr_timer .v = data32 ;
1644
1646
vlapic_dcr_write_handler (vlapic );
1645
1647
break ;
1646
-
1647
1648
case APIC_OFFSET_ESR :
1648
1649
vlapic_esr_write_handler (vlapic );
1649
1650
break ;
@@ -1660,7 +1661,17 @@ vlapic_write(struct acrn_vlapic *vlapic, uint32_t offset, uint64_t data)
1660
1661
*/
1661
1662
case APIC_OFFSET_TIMER_CCR :
1662
1663
break ;
1664
+
1665
+ case APIC_OFFSET_SELF_IPI :
1666
+ if (is_x2apic_enabled (vlapic )) {
1667
+ lapic -> self_ipi .v = data32 ;
1668
+ vlapic_x2apic_self_ipi_handler (vlapic );
1669
+ break ;
1670
+ }
1671
+ /* falls through */
1672
+
1663
1673
default :
1674
+ retval = - EACCES ;
1664
1675
/* Read only */
1665
1676
break ;
1666
1677
}
@@ -2344,14 +2355,13 @@ static void vlapic_x2apic_self_ipi_handler(struct acrn_vlapic *vlapic)
2344
2355
int32_t apic_write_vmexit_handler (struct acrn_vcpu * vcpu )
2345
2356
{
2346
2357
uint64_t qual ;
2347
- int32_t error , handled ;
2358
+ int32_t err = 0 ;
2348
2359
uint32_t offset ;
2349
2360
struct acrn_vlapic * vlapic = NULL ;
2350
2361
2351
2362
qual = vcpu -> arch .exit_qualification ;
2352
2363
offset = (uint32_t )(qual & 0xFFFUL );
2353
2364
2354
- handled = 1 ;
2355
2365
vcpu_retain_rip (vcpu );
2356
2366
vlapic = vcpu_vlapic (vcpu );
2357
2367
@@ -2375,10 +2385,7 @@ int32_t apic_write_vmexit_handler(struct acrn_vcpu *vcpu)
2375
2385
vlapic_esr_write_handler (vlapic );
2376
2386
break ;
2377
2387
case APIC_OFFSET_ICR_LOW :
2378
- error = vlapic_icrlo_write_handler (vlapic );
2379
- if (error != 0 ) {
2380
- handled = 0 ;
2381
- }
2388
+ err = vlapic_icrlo_write_handler (vlapic );
2382
2389
break ;
2383
2390
case APIC_OFFSET_CMCI_LVT :
2384
2391
case APIC_OFFSET_TIMER_LVT :
@@ -2398,17 +2405,18 @@ int32_t apic_write_vmexit_handler(struct acrn_vcpu *vcpu)
2398
2405
case APIC_OFFSET_SELF_IPI :
2399
2406
if (is_x2apic_enabled (vlapic )) {
2400
2407
vlapic_x2apic_self_ipi_handler (vlapic );
2408
+ break ;
2401
2409
}
2402
- break ;
2410
+ /* falls through */
2403
2411
default :
2404
- handled = 0 ;
2412
+ err = - EACCES ;
2405
2413
pr_err ("Unhandled APIC-Write, offset:0x%x" , offset );
2406
2414
break ;
2407
2415
}
2408
2416
2409
2417
TRACE_2L (TRACE_VMEXIT_APICV_WRITE , offset , 0UL );
2410
2418
2411
- return handled ;
2419
+ return err ;
2412
2420
}
2413
2421
2414
2422
int32_t tpr_below_threshold_vmexit_handler (__unused struct acrn_vcpu * vcpu )
0 commit comments