34
34
35
35
#define REDIR_ENTRIES_HW 120U /* SOS align with native ioapic */
36
36
#define RTBL_RO_BITS (uint32_t)(IOAPIC_RTE_REM_IRR | IOAPIC_RTE_DELIVS)
37
- #define NEED_TMR_UPDATE (~(IOAPIC_RTE_INTMASK | IOAPIC_RTE_INTPOL) )
37
+ #define NEED_TMR_UPDATE (IOAPIC_RTE_TRGRMOD | IOAPIC_RTE_DELMOD | IOAPIC_RTE_INTVEC )
38
38
39
39
#define ACRN_DBG_IOAPIC 6U
40
40
#define ACRN_IOAPIC_VERSION 0x11U
@@ -305,12 +305,12 @@ vioapic_indirect_write(struct vioapic *vioapic, uint32_t addr, uint32_t data)
305
305
if ((regnum >= IOAPIC_REDTBL ) &&
306
306
(regnum < (IOAPIC_REDTBL + (pincount * 2U )))) {
307
307
uint32_t addr_offset = regnum - IOAPIC_REDTBL ;
308
- uint32_t rte_offset = addr_offset / 2U ;
308
+ uint32_t rte_offset = addr_offset >> 1U ;
309
309
pin = rte_offset ;
310
310
311
311
last = vioapic -> rtbl [pin ];
312
312
new = last ;
313
- if ((addr_offset % 2U ) != 0U ) {
313
+ if ((addr_offset & 1U ) != 0U ) {
314
314
new .u .hi_32 = data ;
315
315
} else {
316
316
new .u .lo_32 &= RTBL_RO_BITS ;
@@ -331,8 +331,7 @@ vioapic_indirect_write(struct vioapic *vioapic, uint32_t addr, uint32_t data)
331
331
/* pin0 from vpic mask/unmask */
332
332
if ((pin == 0U ) && ((changed & IOAPIC_RTE_INTMASK ) != 0UL )) {
333
333
/* mask -> umask */
334
- if (((last .full & IOAPIC_RTE_INTMASK ) != 0UL ) &&
335
- ((new .full & IOAPIC_RTE_INTMASK ) == 0UL )) {
334
+ if ((last .full & IOAPIC_RTE_INTMASK ) != 0UL ) {
336
335
if ((vioapic -> vm -> wire_mode ==
337
336
VPIC_WIRE_NULL ) ||
338
337
(vioapic -> vm -> wire_mode ==
@@ -346,27 +345,24 @@ vioapic_indirect_write(struct vioapic *vioapic, uint32_t addr, uint32_t data)
346
345
return ;
347
346
}
348
347
/* unmask -> mask */
349
- } else if (((last .full & IOAPIC_RTE_INTMASK ) == 0UL ) &&
350
- ((new .full & IOAPIC_RTE_INTMASK ) != 0UL )) {
348
+ } else {
351
349
if (vioapic -> vm -> wire_mode ==
352
350
VPIC_WIRE_IOAPIC ) {
353
351
vioapic -> vm -> wire_mode =
354
352
VPIC_WIRE_INTR ;
355
353
dev_dbg (ACRN_DBG_IOAPIC ,
356
354
"vpic wire mode -> INTR" );
357
355
}
358
- } else {
359
- /* Can never happen since IOAPIC_RTE_INTMASK
360
- * is changed. */
361
356
}
362
357
}
363
358
vioapic -> rtbl [pin ] = new ;
364
359
dev_dbg (ACRN_DBG_IOAPIC , "ioapic pin%hhu: redir table entry %#lx" ,
365
360
pin , vioapic -> rtbl [pin ].full );
366
361
/*
367
- * If any fields in the redirection table entry (except mask
368
- * or polarity) have changed then rendezvous all the vcpus
369
- * to update their vlapic trigger-mode registers.
362
+ * If "Trigger Mode" or "Delivery Mode" or "Vector"
363
+ * in the redirection table entry have changed then
364
+ * rendezvous all the vcpus to update their vlapic
365
+ * trigger-mode registers.
370
366
*/
371
367
if ((changed & NEED_TMR_UPDATE ) != 0UL ) {
372
368
uint16_t i ;
@@ -397,15 +393,9 @@ vioapic_indirect_write(struct vioapic *vioapic, uint32_t addr, uint32_t data)
397
393
vioapic_send_intr (vioapic , pin );
398
394
}
399
395
400
- /* remap for active: interrupt mask -> unmask
401
- * remap for deactive: interrupt mask & vector set to 0
402
- * remap for trigger mode change
403
- * remap for polarity change
404
- */
405
- if ( ((changed & IOAPIC_RTE_INTMASK ) != 0UL ) ||
406
- ((changed & IOAPIC_RTE_TRGRMOD ) != 0UL ) ||
407
- ((changed & IOAPIC_RTE_INTPOL ) != 0UL ) ) {
408
-
396
+ /* remap for ptdev */
397
+ if (((new .full & IOAPIC_RTE_INTMASK ) == 0UL ) ||
398
+ ((last .full & IOAPIC_RTE_INTMASK ) == 0UL )) {
409
399
/* VM enable intr */
410
400
struct ptdev_intx_info intx ;
411
401
0 commit comments