hv:Replace vpic pointer with instance in structure vm

-- update 'vpic' field in 'struct vm' from pointer
  to instance, and move it from 'struct vm' to 'struct arch_vm'
-- replace MACRO with inline function for vm_pic, and move it
   to vm.h
-- changed vpic_init to void type
-- removed vpic_cleanup
-- move struct acrn_vpic/i8259_reg_state from vpic.c to vpic.h

Signed-off-by: Mingqiang Chi <mingqiang.chi@intel.com>
Reviewed-by: Anthony Xu <anthony.xu@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
Mingqiang Chi
2018-08-22 14:41:39 +08:00
committed by lijinxia
parent de53964c05
commit 0b54946bac
7 changed files with 48 additions and 69 deletions

View File

@@ -99,6 +99,7 @@ struct vm_arch {
void *iobitmap[2];/* IO bitmap page array base address for this VM */
void *msr_bitmap; /* MSR bitmap page base address for this VM */
void *virt_ioapic; /* Virtual IOAPIC base address */
struct acrn_vpic vpic; /* Virtual PIC */
/**
* A link to the IO handler of this VM.
* We only register io handle to this link
@@ -125,7 +126,6 @@ struct vcpuid_entry {
uint32_t padding;
};
struct acrn_vpic;
struct vm {
uint16_t vm_id; /* Virtual machine identifier */
struct vm_hw_info hw; /* Reference to this VM's HW information */
@@ -134,7 +134,6 @@ struct vm {
struct vm_arch arch_vm; /* Reference to this VM's arch information */
enum vm_state state; /* VM state */
void *vuart; /* Virtual UART */
struct acrn_vpic *vpic; /* Virtual PIC */
enum vpic_wire_mode wire_mode;
struct iommu_domain *iommu; /* iommu domain of this VM */
struct list_head list; /* list of VM */
@@ -244,6 +243,12 @@ static inline struct vcpu *get_primary_vcpu(struct vm *vm)
return NULL;
}
static inline struct acrn_vpic *
vm_pic(struct vm *vm)
{
return (struct acrn_vpic *)&(vm->arch_vm.vpic);
}
int shutdown_vm(struct vm *vm);
void pause_vm(struct vm *vm);
void resume_vm(struct vm *vm);

View File

@@ -90,8 +90,36 @@ enum vpic_trigger {
LEVEL_TRIGGER
};
void *vpic_init(struct vm *vm);
void vpic_cleanup(struct vm *vm);
struct i8259_reg_state {
bool ready;
uint8_t icw_num;
uint8_t rd_cmd_reg;
bool aeoi;
bool poll;
bool rotate;
bool sfn; /* special fully-nested mode */
uint32_t irq_base;
uint8_t request; /* Interrupt Request Register (IIR) */
uint8_t service; /* Interrupt Service (ISR) */
uint8_t mask; /* Interrupt Mask Register (IMR) */
uint8_t smm; /* special mask mode */
int acnt[8]; /* sum of pin asserts and deasserts */
uint8_t lowprio; /* lowest priority irq */
bool intr_raised;
uint8_t elc;
};
struct acrn_vpic {
struct vm *vm;
spinlock_t lock;
struct i8259_reg_state i8259[2];
};
void vpic_init(struct vm *vm);
void vpic_assert_irq(struct vm *vm, uint32_t irq);
void vpic_deassert_irq(struct vm *vm, uint32_t irq);