Skip to content

Commit 2321fcd

Browse files
rarindamEddie Dong
authored andcommitted
HV:Modularize vpic code to remove usage of acrn_vm
V1:Initial Patch Modularize vpic. The current patch reduces the usage of acrn_vm inside the vpic.c file. Due to the global natire of register_pio_handler, where acrn_vm is being passed, some usage remains. These needs to be a separate "interface" file. That will come in smaller newer patch provided this patch is accepted. V2: Incorporated comments from Jason. V3: Fixed some MISRA-C Violations. Tracked-On: #1842 Signed-off-by: Arindam Roy <arindam.roy@intel.com> Reviewed-by: Xu, Anthony <anthony.xu@intel.com> Reviewed-by: Jason Chen CJ <jason.cj.chen@intel.com>
1 parent c91a548 commit 2321fcd

File tree

6 files changed

+36
-53
lines changed

6 files changed

+36
-53
lines changed

hypervisor/arch/x86/guest/assign.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ ptirq_build_physical_rte(struct acrn_vm *vm, struct ptirq_remapping_info *entry)
253253
ioapic_get_rte(phys_irq, &phys_rte);
254254
rte = phys_rte;
255255
rte.bits.trigger_mode = IOAPIC_RTE_TRGRMODE_EDGE;
256-
vpic_get_irqline_trigger_mode(vm, (uint32_t)virt_sid->intx_id.pin, &trigger);
256+
vpic_get_irqline_trigger_mode(vm_pic(vm), (uint32_t)virt_sid->intx_id.pin, &trigger);
257257
if (trigger == LEVEL_TRIGGER) {
258258
rte.bits.trigger_mode = IOAPIC_RTE_TRGRMODE_LEVEL;
259259
}
@@ -499,11 +499,11 @@ static void ptirq_handle_intx(struct acrn_vm *vm,
499499
enum vpic_trigger trigger;
500500

501501
/* VPIN_PIC src means we have vpic enabled */
502-
vpic_get_irqline_trigger_mode(vm, virt_sid->intx_id.pin, &trigger);
502+
vpic_get_irqline_trigger_mode(vm_pic(vm), virt_sid->intx_id.pin, &trigger);
503503
if (trigger == LEVEL_TRIGGER) {
504-
vpic_set_irqline(vm, virt_sid->intx_id.pin, GSI_SET_HIGH);
504+
vpic_set_irqline(vm_pic(vm), virt_sid->intx_id.pin, GSI_SET_HIGH);
505505
} else {
506-
vpic_set_irqline(vm, virt_sid->intx_id.pin, GSI_RAISING_PULSE);
506+
vpic_set_irqline(vm_pic(vm), virt_sid->intx_id.pin, GSI_RAISING_PULSE);
507507
}
508508
break;
509509
}
@@ -579,7 +579,7 @@ void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_pin, uint32_t vpin_src)
579579
}
580580
break;
581581
case PTDEV_VPIN_PIC:
582-
vpic_set_irqline(vm, virt_pin, GSI_SET_LOW);
582+
vpic_set_irqline(vm_pic(vm), virt_pin, GSI_SET_LOW);
583583
break;
584584
default:
585585
/*

hypervisor/arch/x86/guest/virq.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,14 @@ static bool vcpu_do_pending_extint(const struct acrn_vcpu *vcpu)
139139
primary = vcpu_from_vid(vm, BOOT_CPU_ID);
140140
if (vcpu == primary) {
141141

142-
vpic_pending_intr(vcpu->vm, &vector);
142+
vpic_pending_intr(vm_pic(vcpu->vm), &vector);
143143
if (vector <= NR_MAX_VECTOR) {
144144
dev_dbg(ACRN_DBG_INTR, "VPIC: to inject PIC vector %d\n",
145145
vector & 0xFFU);
146146
exec_vmwrite32(VMX_ENTRY_INT_INFO_FIELD,
147147
VMX_INT_INFO_VALID |
148148
(vector & 0xFFU));
149-
vpic_intr_accepted(vcpu->vm, vector);
149+
vpic_intr_accepted(vm_pic(vcpu->vm), vector);
150150
ret = true;
151151
}
152152
}

hypervisor/common/hypercall.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ int32_t hcall_set_irqline(const struct acrn_vm *vm, uint16_t vmid,
397397
* number #2 to PIC IRQ #0.
398398
*/
399399
irq_pic = (ops->gsi == 2U) ? 0U : ops->gsi;
400-
vpic_set_irqline(target_vm, irq_pic, ops->op);
400+
vpic_set_irqline(vm_pic(target_vm), irq_pic, ops->op);
401401
}
402402

403403
/* handle IOAPIC irqline */

hypervisor/dm/vpic.c

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636

3737
static void vpic_set_pinstate(struct acrn_vpic *vpic, uint32_t pin, uint8_t level);
3838

39-
static inline struct acrn_vpic *vm_pic(const struct acrn_vm *vm)
39+
struct acrn_vpic *vm_pic(const struct acrn_vm *vm)
4040
{
4141
return (struct acrn_vpic *)&(vm->arch_vm.vpic);
4242
}
@@ -453,21 +453,19 @@ static void vpic_set_pinstate(struct acrn_vpic *vpic, uint32_t pin, uint8_t leve
453453
/**
454454
* @brief Set vPIC IRQ line status.
455455
*
456-
* @param[in] vm Pointer to target VM
456+
* @param[in] vpic Pointer to virtual pic structure
457457
* @param[in] irqline Target IRQ number
458458
* @param[in] operation action options:GSI_SET_HIGH/GSI_SET_LOW/
459459
* GSI_RAISING_PULSE/GSI_FALLING_PULSE
460460
*
461461
* @return None
462462
*/
463-
void vpic_set_irqline(const struct acrn_vm *vm, uint32_t irqline, uint32_t operation)
463+
void vpic_set_irqline(struct acrn_vpic *vpic, uint32_t irqline, uint32_t operation)
464464
{
465-
struct acrn_vpic *vpic;
466465
struct i8259_reg_state *i8259;
467466
uint32_t pin;
468467

469468
if (irqline < NR_VPIC_PINS_TOTAL) {
470-
vpic = vm_pic(vm);
471469
i8259 = &vpic->i8259[irqline >> 3U];
472470
pin = irqline;
473471

@@ -511,13 +509,9 @@ vpic_pincount(void)
511509
* @pre irqline < NR_VPIC_PINS_TOTAL
512510
* @pre this function should be called after vpic_init()
513511
*/
514-
void vpic_get_irqline_trigger_mode(const struct acrn_vm *vm, uint32_t irqline,
512+
void vpic_get_irqline_trigger_mode(const struct acrn_vpic *vpic, uint32_t irqline,
515513
enum vpic_trigger *trigger)
516514
{
517-
struct acrn_vpic *vpic;
518-
519-
vpic = vm_pic(vm);
520-
521515
if ((vpic->i8259[irqline >> 3U].elc & (1U << (irqline & 0x7U))) != 0U) {
522516
*trigger = LEVEL_TRIGGER;
523517
} else {
@@ -528,21 +522,18 @@ void vpic_get_irqline_trigger_mode(const struct acrn_vm *vm, uint32_t irqline,
528522
/**
529523
* @brief Get pending virtual interrupts for vPIC.
530524
*
531-
* @param[in] vm Pointer to target VM
525+
* @param[in] vpic Pointer to target VM's vpic table
532526
* @param[inout] vecptr Pointer to vector buffer and will be filled
533527
* with eligible vector if any.
534528
*
535529
* @pre this function should be called after vpic_init()
536530
* @return None
537531
*/
538-
void vpic_pending_intr(struct acrn_vm *vm, uint32_t *vecptr)
532+
void vpic_pending_intr(struct acrn_vpic *vpic, uint32_t *vecptr)
539533
{
540-
struct acrn_vpic *vpic;
541534
struct i8259_reg_state *i8259;
542535
uint32_t pin;
543536

544-
vpic = vm_pic(vm);
545-
546537
i8259 = &vpic->i8259[0];
547538

548539
spinlock_obtain(&(vpic->lock));
@@ -597,13 +588,10 @@ static void vpic_pin_accepted(struct i8259_reg_state *i8259, uint32_t pin)
597588
* @pre vm != NULL
598589
* @pre this function should be called after vpic_init()
599590
*/
600-
void vpic_intr_accepted(struct acrn_vm *vm, uint32_t vector)
591+
void vpic_intr_accepted(struct acrn_vpic *vpic, uint32_t vector)
601592
{
602-
struct acrn_vpic *vpic;
603593
uint32_t pin;
604594

605-
vpic = vm_pic(vm);
606-
607595
spinlock_obtain(&(vpic->lock));
608596

609597
pin = (vector & 0x7U);
@@ -709,14 +697,12 @@ static int32_t vpic_write(struct acrn_vpic *vpic, struct i8259_reg_state *i8259,
709697
return error;
710698
}
711699

712-
static int32_t vpic_master_handler(struct acrn_vm *vm, bool in, uint16_t port,
700+
static int32_t vpic_master_handler(struct acrn_vpic *vpic, bool in, uint16_t port,
713701
size_t bytes, uint32_t *eax)
714702
{
715-
struct acrn_vpic *vpic;
716703
struct i8259_reg_state *i8259;
717704
int32_t ret;
718705

719-
vpic = vm_pic(vm);
720706
i8259 = &vpic->i8259[0];
721707

722708
if (bytes != 1U) {
@@ -734,7 +720,7 @@ static bool vpic_master_io_read(struct acrn_vm *vm, struct acrn_vcpu *vcpu, uint
734720
{
735721
struct pio_request *pio_req = &vcpu->req.reqs.pio;
736722

737-
if (vpic_master_handler(vm, true, addr, width, &pio_req->value) < 0) {
723+
if (vpic_master_handler(vm_pic(vm), true, addr, width, &pio_req->value) < 0) {
738724
pr_err("pic master read port 0x%x width=%d failed\n",
739725
addr, width);
740726
}
@@ -747,22 +733,20 @@ static bool vpic_master_io_write(struct acrn_vm *vm, uint16_t addr, size_t width
747733
{
748734
uint32_t val = v;
749735

750-
if (vpic_master_handler(vm, false, addr, width, &val) < 0) {
736+
if (vpic_master_handler(vm_pic(vm), false, addr, width, &val) < 0) {
751737
pr_err("%s: write port 0x%x width=%d value 0x%x failed\n",
752738
__func__, addr, width, val);
753739
}
754740

755741
return true;
756742
}
757743

758-
static int32_t vpic_slave_handler(struct acrn_vm *vm, bool in, uint16_t port,
744+
static int32_t vpic_slave_handler(struct acrn_vpic *vpic, bool in, uint16_t port,
759745
size_t bytes, uint32_t *eax)
760746
{
761-
struct acrn_vpic *vpic;
762747
struct i8259_reg_state *i8259;
763748
int32_t ret;
764749

765-
vpic = vm_pic(vm);
766750
i8259 = &vpic->i8259[1];
767751

768752
if (bytes != 1U) {
@@ -780,7 +764,7 @@ static bool vpic_slave_io_read(struct acrn_vm *vm, struct acrn_vcpu *vcpu, uint1
780764
{
781765
struct pio_request *pio_req = &vcpu->req.reqs.pio;
782766

783-
if (vpic_slave_handler(vm, true, addr, width, &pio_req->value) < 0) {
767+
if (vpic_slave_handler(vm_pic(vm), true, addr, width, &pio_req->value) < 0) {
784768
pr_err("pic slave read port 0x%x width=%d failed\n",
785769
addr, width);
786770
}
@@ -792,22 +776,20 @@ static bool vpic_slave_io_write(struct acrn_vm *vm, uint16_t addr, size_t width,
792776
{
793777
uint32_t val = v;
794778

795-
if (vpic_slave_handler(vm, false, addr, width, &val) < 0) {
779+
if (vpic_slave_handler(vm_pic(vm), false, addr, width, &val) < 0) {
796780
pr_err("%s: write port 0x%x width=%d value 0x%x failed\n",
797781
__func__, addr, width, val);
798782
}
799783

800784
return true;
801785
}
802786

803-
static int32_t vpic_elc_handler(struct acrn_vm *vm, bool in, uint16_t port, size_t bytes,
787+
static int32_t vpic_elc_handler(struct acrn_vpic *vpic, bool in, uint16_t port, size_t bytes,
804788
uint32_t *eax)
805789
{
806-
struct acrn_vpic *vpic;
807790
bool is_master;
808791
int32_t ret;
809792

810-
vpic = vm_pic(vm);
811793
is_master = (port == IO_ELCR1);
812794

813795
if (bytes == 1U) {
@@ -850,7 +832,7 @@ static bool vpic_elc_io_read(struct acrn_vm *vm, struct acrn_vcpu *vcpu, uint16_
850832
{
851833
struct pio_request *pio_req = &vcpu->req.reqs.pio;
852834

853-
if (vpic_elc_handler(vm, true, addr, width, &pio_req->value) < 0) {
835+
if (vpic_elc_handler(vm_pic(vm), true, addr, width, &pio_req->value) < 0) {
854836
pr_err("pic elc read port 0x%x width=%d failed", addr, width);
855837
}
856838

@@ -862,7 +844,7 @@ static bool vpic_elc_io_write(struct acrn_vm *vm, uint16_t addr, size_t width,
862844
{
863845
uint32_t val = v;
864846

865-
if (vpic_elc_handler(vm, false, addr, width, &val) < 0) {
847+
if (vpic_elc_handler(vm_pic(vm), false, addr, width, &val) < 0) {
866848
pr_err("%s: write port 0x%x width=%d value 0x%x failed\n",
867849
__func__, addr, width, val);
868850
}
@@ -900,9 +882,9 @@ void vpic_init(struct acrn_vm *vm)
900882
{
901883
struct acrn_vpic *vpic = vm_pic(vm);
902884
vpic_register_io_handler(vm);
903-
vm->arch_vm.vpic.vm = vm;
904-
vm->arch_vm.vpic.i8259[0].mask = 0xffU;
905-
vm->arch_vm.vpic.i8259[1].mask = 0xffU;
885+
vpic->vm = vm;
886+
vpic->i8259[0].mask = 0xffU;
887+
vpic->i8259[1].mask = 0xffU;
906888

907889
spinlock_init(&(vpic->lock));
908890
}

hypervisor/dm/vuart.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ void vuart_toggle_intr(const struct acrn_vuart *vu)
171171
operation = (intr_reason != IIR_NOPEND) ? GSI_SET_HIGH : GSI_SET_LOW;
172172
}
173173

174-
vpic_set_irqline(vu->vm, vu->irq, operation);
174+
vpic_set_irqline(vm_pic(vu->vm), vu->irq, operation);
175175
vioapic_set_irqline_lock(vu->vm, vu->irq, operation);
176176
}
177177

hypervisor/include/dm/vpic.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,39 +149,40 @@ void vpic_init(struct acrn_vm *vm);
149149
/**
150150
* @brief Set vPIC IRQ line status.
151151
*
152-
* @param[in] vm Pointer to target VM
152+
* @param[in] vpic Pointer to target VM's vpic table
153153
* @param[in] irqline Target IRQ number
154154
* @param[in] operation action options:GSI_SET_HIGH/GSI_SET_LOW/
155155
* GSI_RAISING_PULSE/GSI_FALLING_PULSE
156156
*
157157
* @return None
158158
*/
159-
void vpic_set_irqline(const struct acrn_vm *vm, uint32_t irqline, uint32_t operation);
159+
void vpic_set_irqline(struct acrn_vpic *vpic, uint32_t irqline, uint32_t operation);
160160

161161
/**
162162
* @brief Get pending virtual interrupts for vPIC.
163163
*
164-
* @param[in] vm Pointer to target VM
164+
* @param[in] vpic Pointer to target VM's vpic table
165165
* @param[inout] vecptr Pointer to vector buffer and will be filled
166166
* with eligible vector if any.
167167
*
168168
* @return None
169169
*/
170-
void vpic_pending_intr(struct acrn_vm *vm, uint32_t *vecptr);
170+
void vpic_pending_intr(struct acrn_vpic *vpic, uint32_t *vecptr);
171171

172172
/**
173173
* @brief Accept virtual interrupt for vPIC.
174174
*
175-
* @param[in] vm Pointer to target VM
175+
* @param[in] vpic Pointer to target VM's vpic table
176176
* @param[in] vector Target virtual interrupt vector
177177
*
178178
* @return None
179179
*
180180
* @pre vm != NULL
181181
*/
182-
void vpic_intr_accepted(struct acrn_vm *vm, uint32_t vector);
183-
void vpic_get_irqline_trigger_mode(const struct acrn_vm *vm, uint32_t irqline, enum vpic_trigger *trigger);
182+
void vpic_intr_accepted(struct acrn_vpic *vpic, uint32_t vector);
183+
void vpic_get_irqline_trigger_mode(const struct acrn_vpic *vpic, uint32_t irqline, enum vpic_trigger *trigger);
184184
uint32_t vpic_pincount(void);
185+
struct acrn_vpic *vm_pic(const struct acrn_vm *vm);
185186

186187
/**
187188
* @}

0 commit comments

Comments
 (0)