hv: vlapic: correct wrong use of vector

Correct wrong use of vector where lvt_index should be used.

Tracked-On: #1842
Signed-off-by: Min He <min.he@intel.com>
Signed-off-by: Li, Fei1 <fei1.li@intel.com>
This commit is contained in:
Li, Fei1 2019-02-28 23:28:33 +08:00 committed by wenlingz
parent 0943a836bd
commit 3d0d8609cc
2 changed files with 15 additions and 13 deletions

View File

@ -957,12 +957,12 @@ vlapic_set_error(struct acrn_vlapic *vlapic, uint32_t mask)
} }
} }
/* /*
* @pre vector <= 255 * @pre APIC_LVT_TIMER <= lvt_index <= APIC_LVT_MAX
*/ */
static int32_t static int32_t
vlapic_trigger_lvt(struct acrn_vlapic *vlapic, uint32_t vector) vlapic_trigger_lvt(struct acrn_vlapic *vlapic, uint32_t lvt_index)
{ {
uint32_t lvt; uint32_t lvt, vec, mode;
int32_t ret = 0; int32_t ret = 0;
struct acrn_vcpu *vcpu = vlapic->vcpu; struct acrn_vcpu *vcpu = vlapic->vcpu;
@ -972,7 +972,7 @@ vlapic_trigger_lvt(struct acrn_vlapic *vlapic, uint32_t vector)
* LINT[1:0] pins are configured as INTR and NMI pins, * LINT[1:0] pins are configured as INTR and NMI pins,
* respectively. * respectively.
*/ */
switch (vector) { switch (lvt_index) {
case APIC_LVT_LINT0: case APIC_LVT_LINT0:
vcpu_inject_extint(vcpu); vcpu_inject_extint(vcpu);
break; break;
@ -989,7 +989,7 @@ vlapic_trigger_lvt(struct acrn_vlapic *vlapic, uint32_t vector)
} }
} else { } else {
switch (vector) { switch (lvt_index) {
case APIC_LVT_LINT0: case APIC_LVT_LINT0:
lvt = vlapic_get_lvt(vlapic, APIC_OFFSET_LINT0_LVT); lvt = vlapic_get_lvt(vlapic, APIC_OFFSET_LINT0_LVT);
break; break;
@ -1020,7 +1020,9 @@ vlapic_trigger_lvt(struct acrn_vlapic *vlapic, uint32_t vector)
} }
if (ret == 0) { if (ret == 0) {
if (vector < 16U) { vec = lvt & APIC_LVT_VECTOR;
mode = lvt & APIC_LVT_DM;
if ((mode == APIC_LVT_DM_FIXED) && (vec < 16U)) {
vlapic_set_error(vlapic, APIC_ESR_RECEIVE_ILLEGAL_VECTOR); vlapic_set_error(vlapic, APIC_ESR_RECEIVE_ILLEGAL_VECTOR);
} else { } else {
vlapic_fire_lvt(vlapic, lvt); vlapic_fire_lvt(vlapic, lvt);
@ -1922,15 +1924,15 @@ vlapic_set_intr(struct acrn_vcpu *vcpu, uint32_t vector, bool level)
* @param[in] vm Pointer to VM data structure * @param[in] vm Pointer to VM data structure
* @param[in] vcpu_id_arg ID of vCPU, BROADCAST_CPU_ID means triggering * @param[in] vcpu_id_arg ID of vCPU, BROADCAST_CPU_ID means triggering
* interrupt to all vCPUs. * interrupt to all vCPUs.
* @param[in] vector Vector to be fired. * @param[in] lvt_index The index which LVT would be to be fired.
* *
* @retval 0 on success. * @retval 0 on success.
* @retval -EINVAL on error that vcpu_id_arg or vector is invalid. * @retval -EINVAL on error that vcpu_id_arg or vector of the LVT is invalid.
* *
* @pre vm != NULL * @pre vm != NULL
*/ */
int32_t int32_t
vlapic_set_local_intr(struct acrn_vm *vm, uint16_t vcpu_id_arg, uint32_t vector) vlapic_set_local_intr(struct acrn_vm *vm, uint16_t vcpu_id_arg, uint32_t lvt_index)
{ {
struct acrn_vlapic *vlapic; struct acrn_vlapic *vlapic;
uint64_t dmask = 0UL; uint64_t dmask = 0UL;
@ -1949,7 +1951,7 @@ vlapic_set_local_intr(struct acrn_vm *vm, uint16_t vcpu_id_arg, uint32_t vector)
for (vcpu_id = 0U; vcpu_id < vm->hw.created_vcpus; vcpu_id++) { for (vcpu_id = 0U; vcpu_id < vm->hw.created_vcpus; vcpu_id++) {
if ((dmask & (1UL << vcpu_id)) != 0UL) { if ((dmask & (1UL << vcpu_id)) != 0UL) {
vlapic = vm_lapic_from_vcpu_id(vm, vcpu_id); vlapic = vm_lapic_from_vcpu_id(vm, vcpu_id);
error = vlapic_trigger_lvt(vlapic, vector); error = vlapic_trigger_lvt(vlapic, lvt_index);
if (error != 0) { if (error != 0) {
break; break;
} }

View File

@ -189,14 +189,14 @@ void vlapic_set_intr(struct acrn_vcpu *vcpu, uint32_t vector, bool level);
* @param[in] vm Pointer to VM data structure * @param[in] vm Pointer to VM data structure
* @param[in] vcpu_id_arg ID of vCPU, BROADCAST_CPU_ID means triggering * @param[in] vcpu_id_arg ID of vCPU, BROADCAST_CPU_ID means triggering
* interrupt to all vCPUs. * interrupt to all vCPUs.
* @param[in] vector Vector to be fired. * @param[in] lvt_index The index which LVT would to be fired.
* *
* @retval 0 on success. * @retval 0 on success.
* @retval -EINVAL on error that vcpu_id_arg or vector is invalid. * @retval -EINVAL on error that vcpu_id_arg or vector of the LVT is invalid.
* *
* @pre vm != NULL * @pre vm != NULL
*/ */
int32_t vlapic_set_local_intr(struct acrn_vm *vm, uint16_t vcpu_id_arg, uint32_t vector); int32_t vlapic_set_local_intr(struct acrn_vm *vm, uint16_t vcpu_id_arg, uint32_t lvt_index);
/** /**
* @brief Inject MSI to target VM. * @brief Inject MSI to target VM.