@@ -92,7 +92,7 @@ vioapic_set_pinstate(struct acrn_vioapic *vioapic, uint32_t pin, uint32_t level)
92
92
uint32_t old_lvl ;
93
93
union ioapic_rte rte ;
94
94
95
- if (pin < REDIR_ENTRIES_HW ) {
95
+ if (pin < vioapic -> nr_pins ) {
96
96
rte = vioapic -> rtbl [pin ];
97
97
old_lvl = (uint32_t )bitmap_test ((uint16_t )(pin & 0x3FU ), & vioapic -> pin_state [pin >> 6U ]);
98
98
if (level == 0U ) {
@@ -232,11 +232,9 @@ static inline bool vioapic_need_intr(const struct acrn_vioapic *vioapic, uint16_
232
232
{
233
233
uint32_t lvl ;
234
234
union ioapic_rte rte ;
235
- bool ret ;
235
+ bool ret = false ;
236
236
237
- if (pin >= REDIR_ENTRIES_HW ) {
238
- ret = false;
239
- } else {
237
+ if (pin < vioapic -> nr_pins ) {
240
238
rte = vioapic -> rtbl [pin ];
241
239
lvl = (uint32_t )bitmap_test (pin & 0x3FU , & vioapic -> pin_state [pin >> 6U ]);
242
240
ret = !!(((rte .bits .intr_polarity == IOAPIC_RTE_INTPOL_ALO ) && lvl == 0U ) ||
@@ -359,7 +357,7 @@ vioapic_mmio_rw(struct acrn_vioapic *vioapic, uint64_t gpa,
359
357
uint32_t offset ;
360
358
uint64_t rflags ;
361
359
362
- offset = (uint32_t )(gpa - VIOAPIC_BASE );
360
+ offset = (uint32_t )(gpa - vioapic -> base_addr );
363
361
364
362
spinlock_irqsave_obtain (& (vioapic -> mtx ), & rflags );
365
363
@@ -466,30 +464,29 @@ vioapic_init(struct acrn_vm *vm)
466
464
vm -> arch_vm .vioapic .vm = vm ;
467
465
spinlock_init (& (vm -> arch_vm .vioapic .mtx ));
468
466
467
+ vm -> arch_vm .vioapic .base_addr = VIOAPIC_BASE ;
468
+ if (is_sos_vm (vm )) {
469
+ vm -> arch_vm .vioapic .nr_pins = REDIR_ENTRIES_HW ;
470
+ } else {
471
+ vm -> arch_vm .vioapic .nr_pins = VIOAPIC_RTE_NUM ;
472
+ }
473
+
469
474
vioapic_reset (vm );
470
475
471
476
register_mmio_emulation_handler (vm ,
472
477
vioapic_mmio_access_handler ,
473
- (uint64_t )VIOAPIC_BASE ,
474
- (uint64_t )VIOAPIC_BASE + VIOAPIC_SIZE ,
475
- vm , false);
478
+ (uint64_t )vm -> arch_vm . vioapic . base_addr ,
479
+ (uint64_t )vm -> arch_vm . vioapic . base_addr + VIOAPIC_SIZE ,
480
+ ( void * ) & vm -> arch_vm . vioapic , false);
476
481
ept_del_mr (vm , (uint64_t * )vm -> arch_vm .nworld_eptp ,
477
- (uint64_t )VIOAPIC_BASE , ( uint64_t ) VIOAPIC_SIZE );
482
+ (uint64_t )vm -> arch_vm . vioapic . base_addr , VIOAPIC_SIZE );
478
483
vm -> arch_vm .vioapic .ready = true;
479
484
}
480
485
481
486
uint32_t
482
487
vioapic_pincount (const struct acrn_vm * vm )
483
488
{
484
- uint32_t ret ;
485
-
486
- if (is_sos_vm (vm )) {
487
- ret = REDIR_ENTRIES_HW ;
488
- } else {
489
- ret = VIOAPIC_RTE_NUM ;
490
- }
491
-
492
- return ret ;
489
+ return vm -> arch_vm .vioapic .nr_pins ;
493
490
}
494
491
495
492
/*
@@ -498,14 +495,11 @@ vioapic_pincount(const struct acrn_vm *vm)
498
495
*/
499
496
int32_t vioapic_mmio_access_handler (struct io_request * io_req , void * handler_private_data )
500
497
{
501
- struct acrn_vm * vm = (struct acrn_vm * )handler_private_data ;
502
- struct acrn_vioapic * vioapic ;
498
+ struct acrn_vioapic * vioapic = (struct acrn_vioapic * )handler_private_data ;
503
499
struct mmio_request * mmio = & io_req -> reqs .mmio ;
504
500
uint64_t gpa = mmio -> address ;
505
501
int32_t ret = 0 ;
506
502
507
- vioapic = vm_ioapic (vm );
508
-
509
503
/* Note all RW to IOAPIC are 32-Bit in size */
510
504
if (mmio -> size == 4UL ) {
511
505
uint32_t data = (uint32_t )mmio -> value ;
0 commit comments