Message ID | 20201208215707.31149-1-leobras.c@gmail.com (mailing list archive) |
---|---|
State | Accepted, archived |
Commit | 87fb4978ef8f7e3d6f51ea8e259638c4e96f2fc0 |
Headers | show |
Series | [v2,1/1] powerpc/kvm: Fix mask size for emulated msgsndp | expand |
On Tue, Dec 08, 2020 at 06:57:08PM -0300, Leonardo Bras wrote: > According to ISAv3.1 and ISAv3.0b, the msgsndp is described to split RB in: > msgtype <- (RB) 32:36 > payload <- (RB) 37:63 > t <- (RB) 57:63 > > The current way of getting 'msgtype', and 't' is missing their MSB: > msgtype: ((arg >> 27) & 0xf) : Gets (RB) 33:36, missing bit 32 > t: (arg &= 0x3f) : Gets (RB) 58:63, missing bit 57 > > Fixes this by applying the correct mask. > > Signed-off-by: Leonardo Bras <leobras.c@gmail.com> Acked-by: Paul Mackerras <paulus@ozlabs.org>
On Tue, 8 Dec 2020 18:57:08 -0300, Leonardo Bras wrote: > According to ISAv3.1 and ISAv3.0b, the msgsndp is described to split RB in: > msgtype <- (RB) 32:36 > payload <- (RB) 37:63 > t <- (RB) 57:63 > > The current way of getting 'msgtype', and 't' is missing their MSB: > msgtype: ((arg >> 27) & 0xf) : Gets (RB) 33:36, missing bit 32 > t: (arg &= 0x3f) : Gets (RB) 58:63, missing bit 57 > > [...] Applied to powerpc/next. [1/1] KVM: PPC: Book3S HV: Fix mask size for emulated msgsndp https://git.kernel.org/powerpc/c/87fb4978ef8f7e3d6f51ea8e259638c4e96f2fc0 cheers
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index e3b1839fc251..5af0a429cee8 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -1241,9 +1241,9 @@ static int kvmppc_emulate_doorbell_instr(struct kvm_vcpu *vcpu) switch (get_xop(inst)) { case OP_31_XOP_MSGSNDP: arg = kvmppc_get_gpr(vcpu, rb); - if (((arg >> 27) & 0xf) != PPC_DBELL_SERVER) + if (((arg >> 27) & 0x1f) != PPC_DBELL_SERVER) break; - arg &= 0x3f; + arg &= 0x7f; if (arg >= kvm->arch.emul_smt_mode) break; tvcpu = kvmppc_find_vcpu(kvm, vcpu->vcpu_id - thr + arg); @@ -1256,7 +1256,7 @@ static int kvmppc_emulate_doorbell_instr(struct kvm_vcpu *vcpu) break; case OP_31_XOP_MSGCLRP: arg = kvmppc_get_gpr(vcpu, rb); - if (((arg >> 27) & 0xf) != PPC_DBELL_SERVER) + if (((arg >> 27) & 0x1f) != PPC_DBELL_SERVER) break; vcpu->arch.vcore->dpdes = 0; vcpu->arch.doorbell_request = 0;
According to ISAv3.1 and ISAv3.0b, the msgsndp is described to split RB in: msgtype <- (RB) 32:36 payload <- (RB) 37:63 t <- (RB) 57:63 The current way of getting 'msgtype', and 't' is missing their MSB: msgtype: ((arg >> 27) & 0xf) : Gets (RB) 33:36, missing bit 32 t: (arg &= 0x3f) : Gets (RB) 58:63, missing bit 57 Fixes this by applying the correct mask. Signed-off-by: Leonardo Bras <leobras.c@gmail.com> --- Changes since v1: - Commit message 's/LSB/MSB/', because ISA ordering is big-endian. arch/powerpc/kvm/book3s_hv.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)