|
@@ -317,6 +317,11 @@ static int xive_select_target(struct kvm *kvm, u32 *server, u8 prio)
|
|
|
return -EBUSY;
|
|
|
}
|
|
|
|
|
|
+static u32 xive_vp(struct kvmppc_xive *xive, u32 server)
|
|
|
+{
|
|
|
+ return xive->vp_base + kvmppc_pack_vcpu_id(xive->kvm, server);
|
|
|
+}
|
|
|
+
|
|
|
static u8 xive_lock_and_mask(struct kvmppc_xive *xive,
|
|
|
struct kvmppc_xive_src_block *sb,
|
|
|
struct kvmppc_xive_irq_state *state)
|
|
@@ -362,7 +367,7 @@ static u8 xive_lock_and_mask(struct kvmppc_xive *xive,
|
|
|
*/
|
|
|
if (xd->flags & OPAL_XIVE_IRQ_MASK_VIA_FW) {
|
|
|
xive_native_configure_irq(hw_num,
|
|
|
- xive->vp_base + state->act_server,
|
|
|
+ xive_vp(xive, state->act_server),
|
|
|
MASKED, state->number);
|
|
|
/* set old_p so we can track if an H_EOI was done */
|
|
|
state->old_p = true;
|
|
@@ -418,7 +423,7 @@ static void xive_finish_unmask(struct kvmppc_xive *xive,
|
|
|
*/
|
|
|
if (xd->flags & OPAL_XIVE_IRQ_MASK_VIA_FW) {
|
|
|
xive_native_configure_irq(hw_num,
|
|
|
- xive->vp_base + state->act_server,
|
|
|
+ xive_vp(xive, state->act_server),
|
|
|
state->act_priority, state->number);
|
|
|
/* If an EOI is needed, do it here */
|
|
|
if (!state->old_p)
|
|
@@ -495,7 +500,7 @@ static int xive_target_interrupt(struct kvm *kvm,
|
|
|
kvmppc_xive_select_irq(state, &hw_num, NULL);
|
|
|
|
|
|
return xive_native_configure_irq(hw_num,
|
|
|
- xive->vp_base + server,
|
|
|
+ xive_vp(xive, server),
|
|
|
prio, state->number);
|
|
|
}
|
|
|
|
|
@@ -883,7 +888,7 @@ int kvmppc_xive_set_mapped(struct kvm *kvm, unsigned long guest_irq,
|
|
|
* which is fine for a never started interrupt.
|
|
|
*/
|
|
|
xive_native_configure_irq(hw_irq,
|
|
|
- xive->vp_base + state->act_server,
|
|
|
+ xive_vp(xive, state->act_server),
|
|
|
state->act_priority, state->number);
|
|
|
|
|
|
/*
|
|
@@ -959,7 +964,7 @@ int kvmppc_xive_clr_mapped(struct kvm *kvm, unsigned long guest_irq,
|
|
|
|
|
|
/* Reconfigure the IPI */
|
|
|
xive_native_configure_irq(state->ipi_number,
|
|
|
- xive->vp_base + state->act_server,
|
|
|
+ xive_vp(xive, state->act_server),
|
|
|
state->act_priority, state->number);
|
|
|
|
|
|
/*
|
|
@@ -1084,7 +1089,7 @@ int kvmppc_xive_connect_vcpu(struct kvm_device *dev,
|
|
|
pr_devel("Duplicate !\n");
|
|
|
return -EEXIST;
|
|
|
}
|
|
|
- if (cpu >= KVM_MAX_VCPUS) {
|
|
|
+ if (cpu >= (KVM_MAX_VCPUS * vcpu->kvm->arch.emul_smt_mode)) {
|
|
|
pr_devel("Out of bounds !\n");
|
|
|
return -EINVAL;
|
|
|
}
|
|
@@ -1098,7 +1103,7 @@ int kvmppc_xive_connect_vcpu(struct kvm_device *dev,
|
|
|
xc->xive = xive;
|
|
|
xc->vcpu = vcpu;
|
|
|
xc->server_num = cpu;
|
|
|
- xc->vp_id = xive->vp_base + cpu;
|
|
|
+ xc->vp_id = xive_vp(xive, cpu);
|
|
|
xc->mfrr = 0xff;
|
|
|
xc->valid = true;
|
|
|
|