OSDN Git Service

KVM: PPC: Implement mtsr instruction emulation
authorAlexander Graf <agraf@suse.de>
Fri, 19 Feb 2010 10:00:37 +0000 (11:00 +0100)
committerAvi Kivity <avi@redhat.com>
Sun, 25 Apr 2010 09:35:06 +0000 (12:35 +0300)
The Book3S_32 specifications allows for two instructions to modify segment
registers: mtsrin and mtsr.

Most normal operating systems use mtsrin, because it allows to define which
segment it wants to change using a register. But since I was trying to run
an embedded guest, it turned out to be using mtsr with hardcoded values.

So let's also emulate mtsr. It's a valid instruction after all.

Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/powerpc/kvm/book3s_64_emulate.c

index bb4a7c1..e4e7ec3 100644 (file)
@@ -28,6 +28,7 @@
 #define OP_31_XOP_MFMSR                83
 #define OP_31_XOP_MTMSR                146
 #define OP_31_XOP_MTMSRD       178
+#define OP_31_XOP_MTSR         210
 #define OP_31_XOP_MTSRIN       242
 #define OP_31_XOP_TLBIEL       274
 #define OP_31_XOP_TLBIE                306
@@ -101,6 +102,11 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
                        }
                        break;
                }
+               case OP_31_XOP_MTSR:
+                       vcpu->arch.mmu.mtsrin(vcpu,
+                               (inst >> 16) & 0xf,
+                               kvmppc_get_gpr(vcpu, get_rs(inst)));
+                       break;
                case OP_31_XOP_MTSRIN:
                        vcpu->arch.mmu.mtsrin(vcpu,
                                (kvmppc_get_gpr(vcpu, get_rb(inst)) >> 28) & 0xf,