Hi Alex,

There is below comment in arch/powerpc/kvm/booke_emulate.c

/*
 * NOTE: some of these registers are not emulated on BOOKE_HV (GS-mode).
 * Their backing store is in real registers, and these functions
 * will return the wrong result if called for them in another context
 * (such as debugging).
 */

"some of these registers are not emulated on BOOKE_HV (GS-mode)" 
 1) Is not that mtspr()/mfspr() for "not emulated" registers should follow 
EMULATE_FAIL path? So should be ifdef out for BOOKE_HV? Otherwise the emulation 
code execute.
 2) Or These are not emulated because the GS mode have direct access to these 
registers, Right? So no trap?


"and these functions will return the wrong result if called for them in another 
context (such as debugging)."
 1) So do you mean that guest is not supposed to access these registers in 
normal scenario but the debugger (some command on gdb in guest) can access 
these register? then does it make sense to treat mtspr() as nop and mfspr 
returns 0/undefined?

In our local repository Scott Wood removed this comment by ifdef out those 
registers for BOOKE_HV.
Below is the change (extracted - not the exact patch which does this)

diff --git a/arch/powerpc/kvm/booke_emulate.c b/arch/powerpc/kvm/booke_emulate.c
index 83c3796..6d78906 100644
--- a/arch/powerpc/kvm/booke_emulate.c
+++ b/arch/powerpc/kvm/booke_emulate.c
@@ -46,18 +46,21 @@ int kvmppc_booke_emulate_op(struct kvm_run *run, struct 
kvm_vcpu *vcpu,
        switch (get_op(inst)) {
        case 19:
                switch (get_xop(inst)) {
+#ifndef CONFIG_KVM_BOOKE_HV
                case OP_19_XOP_RFI:
                        kvmppc_emul_rfi(vcpu);
                        kvmppc_set_exit_type(vcpu, EMULATED_RFI_EXITS);
                        *advance = 0;
                        break;

+#endif
                default:
                        emulated = EMULATE_FAIL;
                        break;
                }
                break;

+#ifndef CONFIG_KVM_BOOKE_HV
        case 31:
                switch (get_xop(inst)) {

@@ -89,6 +92,7 @@ int kvmppc_booke_emulate_op(struct kvm_run *run, struct 
kvm_vcpu *vcpu,

                break;

+#endif
        default:
                emulated = EMULATE_FAIL;
        }
@@ -96,23 +100,19 @@ int kvmppc_booke_emulate_op(struct kvm_run *run, struct 
kvm_vcpu *vcpu,
        return emulated;
 }

-/*
- * NOTE: some of these registers are not emulated on BOOKE_HV (GS-mode).
- * Their backing store is in real registers, and these functions
- * will return the wrong result if called for them in another context
- * (such as debugging).
- */
 int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
 {
        int emulated = EMULATE_DONE;

        switch (sprn) {
+#ifndef CONFIG_KVM_BOOKE_HV
        case SPRN_DEAR:
                vcpu->arch.shared->dar = spr_val;
                break;
        case SPRN_ESR:
                vcpu->arch.shared->esr = spr_val;
                break;
+#endif
        case SPRN_DBCR0:
                vcpu->arch.dbcr0 = spr_val;
                break;
@@ -223,6 +223,7 @@ int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int 
sprn, ulong *spr_val)
        int emulated = EMULATE_DONE;

        switch (sprn) {
+#ifndef CONFIG_KVM_BOOKE_HV
        case SPRN_IVPR:
                *spr_val = vcpu->arch.ivpr;
                break;
@@ -232,6 +233,7 @@ int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int 
sprn, ulong *spr_val)
        case SPRN_ESR:
                *spr_val = vcpu->arch.shared->esr;
                break;
+#endif
        case SPRN_DBCR0:
                *spr_val = vcpu->arch.dbcr0;
                break;
-- 
1.7.0.4


Thanks
-Bharat

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to