rename vm_lock/vlapic_state in VM structure
rename: vlapic_state-->vlapic_mode vm_lock --> vlapic_mode_lock check_vm_vlapic_state --> check_vm_vlapic_mode Tracked-On: #4958 Signed-off-by: Mingqiang Chi <mingqiang.chi@intel.com>
This commit is contained in:
parent
0bd6555cab
commit
1b84741a56
|
@ -589,21 +589,21 @@ int32_t ptirq_prepare_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, uint16_t
|
||||||
|
|
||||||
/* build physical config MSI, update to info->pmsi_xxx */
|
/* build physical config MSI, update to info->pmsi_xxx */
|
||||||
if (is_lapic_pt_configured(vm)) {
|
if (is_lapic_pt_configured(vm)) {
|
||||||
enum vm_vlapic_state vlapic_state = check_vm_vlapic_state(vm);
|
enum vm_vlapic_mode vlapic_mode = check_vm_vlapic_mode(vm);
|
||||||
|
|
||||||
if (vlapic_state == VM_VLAPIC_X2APIC) {
|
if (vlapic_mode == VM_VLAPIC_X2APIC) {
|
||||||
/*
|
/*
|
||||||
* All the vCPUs are in x2APIC mode and LAPIC is Pass-through
|
* All the vCPUs are in x2APIC mode and LAPIC is Pass-through
|
||||||
* Use guest vector to program the interrupt source
|
* Use guest vector to program the interrupt source
|
||||||
*/
|
*/
|
||||||
ptirq_build_physical_msi(vm, entry, (uint32_t)info->data.bits.vector, 0UL, irte_idx);
|
ptirq_build_physical_msi(vm, entry, (uint32_t)info->data.bits.vector, 0UL, irte_idx);
|
||||||
} else if (vlapic_state == VM_VLAPIC_XAPIC) {
|
} else if (vlapic_mode == VM_VLAPIC_XAPIC) {
|
||||||
/*
|
/*
|
||||||
* All the vCPUs are in xAPIC mode and LAPIC is emulated
|
* All the vCPUs are in xAPIC mode and LAPIC is emulated
|
||||||
* Use host vector to program the interrupt source
|
* Use host vector to program the interrupt source
|
||||||
*/
|
*/
|
||||||
ptirq_build_physical_msi(vm, entry, irq_to_vector(entry->allocated_pirq), 0UL, irte_idx);
|
ptirq_build_physical_msi(vm, entry, irq_to_vector(entry->allocated_pirq), 0UL, irte_idx);
|
||||||
} else if (vlapic_state == VM_VLAPIC_TRANSITION) {
|
} else if (vlapic_mode == VM_VLAPIC_TRANSITION) {
|
||||||
/*
|
/*
|
||||||
* vCPUs are in middle of transition, so do not program interrupt source
|
* vCPUs are in middle of transition, so do not program interrupt source
|
||||||
* TODO: Devices programmed during transistion do not work after transition
|
* TODO: Devices programmed during transistion do not work after transition
|
||||||
|
|
|
@ -438,11 +438,11 @@ int32_t create_vm(uint16_t vm_id, uint64_t pcpu_bitmap, struct acrn_vm_config *v
|
||||||
if (status == 0) {
|
if (status == 0) {
|
||||||
prepare_epc_vm_memmap(vm);
|
prepare_epc_vm_memmap(vm);
|
||||||
|
|
||||||
spinlock_init(&vm->vm_lock);
|
spinlock_init(&vm->vlapic_mode_lock);
|
||||||
spinlock_init(&vm->ept_lock);
|
spinlock_init(&vm->ept_lock);
|
||||||
spinlock_init(&vm->emul_mmio_lock);
|
spinlock_init(&vm->emul_mmio_lock);
|
||||||
|
|
||||||
vm->arch_vm.vlapic_state = VM_VLAPIC_XAPIC;
|
vm->arch_vm.vlapic_mode = VM_VLAPIC_XAPIC;
|
||||||
vm->intr_inject_delay_delta = 0UL;
|
vm->intr_inject_delay_delta = 0UL;
|
||||||
|
|
||||||
/* Set up IO bit-mask such that VM exit occurs on
|
/* Set up IO bit-mask such that VM exit occurs on
|
||||||
|
@ -660,7 +660,7 @@ int32_t reset_vm(struct acrn_vm *vm)
|
||||||
/*
|
/*
|
||||||
* Set VM vLAPIC state to VM_VLAPIC_XAPIC
|
* Set VM vLAPIC state to VM_VLAPIC_XAPIC
|
||||||
*/
|
*/
|
||||||
vm->arch_vm.vlapic_state = VM_VLAPIC_XAPIC;
|
vm->arch_vm.vlapic_mode = VM_VLAPIC_XAPIC;
|
||||||
|
|
||||||
if (is_sos_vm(vm)) {
|
if (is_sos_vm(vm)) {
|
||||||
(void)vm_sw_loader(vm);
|
(void)vm_sw_loader(vm);
|
||||||
|
@ -798,11 +798,11 @@ void update_vm_vlapic_state(struct acrn_vm *vm)
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
struct acrn_vcpu *vcpu;
|
struct acrn_vcpu *vcpu;
|
||||||
uint16_t vcpus_in_x2apic, vcpus_in_xapic;
|
uint16_t vcpus_in_x2apic, vcpus_in_xapic;
|
||||||
enum vm_vlapic_state vlapic_state = VM_VLAPIC_XAPIC;
|
enum vm_vlapic_mode vlapic_mode = VM_VLAPIC_XAPIC;
|
||||||
|
|
||||||
vcpus_in_x2apic = 0U;
|
vcpus_in_x2apic = 0U;
|
||||||
vcpus_in_xapic = 0U;
|
vcpus_in_xapic = 0U;
|
||||||
spinlock_obtain(&vm->vm_lock);
|
spinlock_obtain(&vm->vlapic_mode_lock);
|
||||||
foreach_vcpu(i, vm, vcpu) {
|
foreach_vcpu(i, vm, vcpu) {
|
||||||
/* Skip vCPU in state outside of VCPU_RUNNING as it may be offline. */
|
/* Skip vCPU in state outside of VCPU_RUNNING as it may be offline. */
|
||||||
if (vcpu->state == VCPU_RUNNING) {
|
if (vcpu->state == VCPU_RUNNING) {
|
||||||
|
@ -823,42 +823,42 @@ void update_vm_vlapic_state(struct acrn_vm *vm)
|
||||||
* Check if the counts vcpus_in_x2apic and vcpus_in_xapic are zero
|
* Check if the counts vcpus_in_x2apic and vcpus_in_xapic are zero
|
||||||
* VM_VLAPIC_DISABLED
|
* VM_VLAPIC_DISABLED
|
||||||
*/
|
*/
|
||||||
vlapic_state = VM_VLAPIC_DISABLED;
|
vlapic_mode = VM_VLAPIC_DISABLED;
|
||||||
} else if ((vcpus_in_x2apic != 0U) && (vcpus_in_xapic != 0U)) {
|
} else if ((vcpus_in_x2apic != 0U) && (vcpus_in_xapic != 0U)) {
|
||||||
/*
|
/*
|
||||||
* Check if the counts vcpus_in_x2apic and vcpus_in_xapic are non-zero
|
* Check if the counts vcpus_in_x2apic and vcpus_in_xapic are non-zero
|
||||||
* VM_VLAPIC_TRANSITION
|
* VM_VLAPIC_TRANSITION
|
||||||
*/
|
*/
|
||||||
vlapic_state = VM_VLAPIC_TRANSITION;
|
vlapic_mode = VM_VLAPIC_TRANSITION;
|
||||||
} else if (vcpus_in_x2apic != 0U) {
|
} else if (vcpus_in_x2apic != 0U) {
|
||||||
/*
|
/*
|
||||||
* Check if the counts vcpus_in_x2apic is non-zero
|
* Check if the counts vcpus_in_x2apic is non-zero
|
||||||
* VM_VLAPIC_X2APIC
|
* VM_VLAPIC_X2APIC
|
||||||
*/
|
*/
|
||||||
vlapic_state = VM_VLAPIC_X2APIC;
|
vlapic_mode = VM_VLAPIC_X2APIC;
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Count vcpus_in_xapic is non-zero
|
* Count vcpus_in_xapic is non-zero
|
||||||
* VM_VLAPIC_XAPIC
|
* VM_VLAPIC_XAPIC
|
||||||
*/
|
*/
|
||||||
vlapic_state = VM_VLAPIC_XAPIC;
|
vlapic_mode = VM_VLAPIC_XAPIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
vm->arch_vm.vlapic_state = vlapic_state;
|
vm->arch_vm.vlapic_mode = vlapic_mode;
|
||||||
spinlock_release(&vm->vm_lock);
|
spinlock_release(&vm->vlapic_mode_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @brief Check state of vLAPICs of a VM
|
* @brief Check mode of vLAPICs of a VM
|
||||||
*
|
*
|
||||||
* @pre vm != NULL
|
* @pre vm != NULL
|
||||||
*/
|
*/
|
||||||
enum vm_vlapic_state check_vm_vlapic_state(const struct acrn_vm *vm)
|
enum vm_vlapic_mode check_vm_vlapic_mode(const struct acrn_vm *vm)
|
||||||
{
|
{
|
||||||
enum vm_vlapic_state vlapic_state;
|
enum vm_vlapic_mode vlapic_mode;
|
||||||
|
|
||||||
vlapic_state = vm->arch_vm.vlapic_state;
|
vlapic_mode = vm->arch_vm.vlapic_mode;
|
||||||
return vlapic_state;
|
return vlapic_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -457,15 +457,16 @@ int32_t hcall_inject_msi(struct acrn_vm *vm, uint16_t vmid, uint64_t param)
|
||||||
if (copy_from_gpa(vm, &msi, param, sizeof(msi)) == 0) {
|
if (copy_from_gpa(vm, &msi, param, sizeof(msi)) == 0) {
|
||||||
/* For target cpu with lapic pt, send ipi instead of injection via vlapic */
|
/* For target cpu with lapic pt, send ipi instead of injection via vlapic */
|
||||||
if (is_lapic_pt_configured(target_vm)) {
|
if (is_lapic_pt_configured(target_vm)) {
|
||||||
enum vm_vlapic_state vlapic_state = check_vm_vlapic_state(target_vm);
|
enum vm_vlapic_mode vlapic_mode = check_vm_vlapic_mode(target_vm);
|
||||||
if (vlapic_state == VM_VLAPIC_X2APIC) {
|
|
||||||
|
if (vlapic_mode == VM_VLAPIC_X2APIC) {
|
||||||
/*
|
/*
|
||||||
* All the vCPUs of VM are in x2APIC mode and LAPIC is PT
|
* All the vCPUs of VM are in x2APIC mode and LAPIC is PT
|
||||||
* Inject the vMSI as an IPI directly to VM
|
* Inject the vMSI as an IPI directly to VM
|
||||||
*/
|
*/
|
||||||
inject_msi_lapic_pt(target_vm, &msi);
|
inject_msi_lapic_pt(target_vm, &msi);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
} else if (vlapic_state == VM_VLAPIC_XAPIC) {
|
} else if (vlapic_mode == VM_VLAPIC_XAPIC) {
|
||||||
/*
|
/*
|
||||||
* All the vCPUs of VM are in xAPIC and use vLAPIC
|
* All the vCPUs of VM are in xAPIC and use vLAPIC
|
||||||
* Inject using vLAPIC
|
* Inject using vLAPIC
|
||||||
|
|
|
@ -88,7 +88,7 @@ enum vm_state {
|
||||||
VM_PAUSED, /* VM paused */
|
VM_PAUSED, /* VM paused */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum vm_vlapic_state {
|
enum vm_vlapic_mode {
|
||||||
VM_VLAPIC_DISABLED = 0U,
|
VM_VLAPIC_DISABLED = 0U,
|
||||||
VM_VLAPIC_XAPIC,
|
VM_VLAPIC_XAPIC,
|
||||||
VM_VLAPIC_X2APIC,
|
VM_VLAPIC_X2APIC,
|
||||||
|
@ -113,7 +113,7 @@ struct vm_arch {
|
||||||
#ifdef CONFIG_HYPERV_ENABLED
|
#ifdef CONFIG_HYPERV_ENABLED
|
||||||
struct acrn_hyperv hyperv;
|
struct acrn_hyperv hyperv;
|
||||||
#endif
|
#endif
|
||||||
enum vm_vlapic_state vlapic_state; /* Represents vLAPIC state across vCPUs*/
|
enum vm_vlapic_mode vlapic_mode; /* Represents vLAPIC mode across vCPUs*/
|
||||||
|
|
||||||
/* reference to virtual platform to come here (as needed) */
|
/* reference to virtual platform to come here (as needed) */
|
||||||
} __aligned(PAGE_SIZE);
|
} __aligned(PAGE_SIZE);
|
||||||
|
@ -130,7 +130,7 @@ struct acrn_vm {
|
||||||
struct acrn_vuart vuart[MAX_VUART_NUM_PER_VM]; /* Virtual UART */
|
struct acrn_vuart vuart[MAX_VUART_NUM_PER_VM]; /* Virtual UART */
|
||||||
enum vpic_wire_mode wire_mode;
|
enum vpic_wire_mode wire_mode;
|
||||||
struct iommu_domain *iommu; /* iommu domain of this VM */
|
struct iommu_domain *iommu; /* iommu domain of this VM */
|
||||||
spinlock_t vm_lock; /* Spin-lock used to protect vlapic_state modifications for a VM */
|
spinlock_t vlapic_mode_lock; /* Spin-lock used to protect vlapic_mode modifications for a VM */
|
||||||
spinlock_t ept_lock; /* Spin-lock used to protect ept add/modify/remove for a VM */
|
spinlock_t ept_lock; /* Spin-lock used to protect ept add/modify/remove for a VM */
|
||||||
|
|
||||||
spinlock_t emul_mmio_lock; /* Used to protect emulation mmio_node concurrent access for a VM */
|
spinlock_t emul_mmio_lock; /* Used to protect emulation mmio_node concurrent access for a VM */
|
||||||
|
@ -257,7 +257,7 @@ bool has_rt_vm(void);
|
||||||
struct acrn_vm *get_highest_severity_vm(bool runtime);
|
struct acrn_vm *get_highest_severity_vm(bool runtime);
|
||||||
bool vm_hide_mtrr(const struct acrn_vm *vm);
|
bool vm_hide_mtrr(const struct acrn_vm *vm);
|
||||||
void update_vm_vlapic_state(struct acrn_vm *vm);
|
void update_vm_vlapic_state(struct acrn_vm *vm);
|
||||||
enum vm_vlapic_state check_vm_vlapic_state(const struct acrn_vm *vm);
|
enum vm_vlapic_mode check_vm_vlapic_mode(const struct acrn_vm *vm);
|
||||||
#endif /* !ASSEMBLER */
|
#endif /* !ASSEMBLER */
|
||||||
|
|
||||||
#endif /* VM_H_ */
|
#endif /* VM_H_ */
|
||||||
|
|
Loading…
Reference in New Issue