This patch adds emulation support for the rlwinm instruction. Signed-off-by: Alexander Graf <agraf@xxxxxxx> --- arch/powerpc/include/asm/ppc-opcode.h | 1 + arch/powerpc/kvm/emulate.c | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h index 569b518..fac38a8 100644 --- a/arch/powerpc/include/asm/ppc-opcode.h +++ b/arch/powerpc/include/asm/ppc-opcode.h @@ -120,6 +120,7 @@ #define OP_ADDIS 15 #define OP_BC 16 #define OP_RLWIMI 20 +#define OP_RLWINM 21 #define OP_ORI 24 #define OP_ORIS 25 #define OP_ANDI 28 diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c index c40f255..1da6691 100644 --- a/arch/powerpc/kvm/emulate.c +++ b/arch/powerpc/kvm/emulate.c @@ -601,7 +601,7 @@ int kvmppc_emulate_rld(struct kvm_vcpu *vcpu, u32 inst) return EMULATE_DONE; } -int kvmppc_emulate_rlwimi(struct kvm_vcpu *vcpu, u32 inst) +int kvmppc_emulate_rlwi(struct kvm_vcpu *vcpu, u32 inst) { int sh = (inst >> 11) & 0x1f; int mb = (inst >> 6) & 0x1f; @@ -623,7 +623,8 @@ int kvmppc_emulate_rlwimi(struct kvm_vcpu *vcpu, u32 inst) mask = ~mask; } dest &= mask; - dest |= kvmppc_get_gpr(vcpu, get_ra(inst)) & ~mask; + if (get_op(inst) == OP_RLWIMI) + dest |= kvmppc_get_gpr(vcpu, get_ra(inst)) & ~mask; kvmppc_set_gpr(vcpu, get_ra(inst), dest); if (get_rc(inst)) @@ -707,7 +708,10 @@ int kvmppc_emulate_any_instruction(struct kvm_vcpu *vcpu) emulated = kvmppc_emulate_rld(vcpu, inst); break; case OP_RLWIMI: - emulated = kvmppc_emulate_rlwimi(vcpu, inst); + emulated = kvmppc_emulate_rlwi(vcpu, inst); + break; + case OP_RLWINM: + emulated = kvmppc_emulate_rlwi(vcpu, inst); break; case 31: switch (get_xop(inst)) { -- 1.8.1.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html