On 31.01.2013, at 20:05, Alexander Graf wrote:

> 
> On 31.01.2013, at 19:54, Scott Wood wrote:
> 
>> On 01/31/2013 12:52:41 PM, Alexander Graf wrote:
>>> On 31.01.2013, at 19:43, Scott Wood wrote:
>>>> On 01/31/2013 12:21:07 PM, Alexander Graf wrote:
>>>>> How about something like this? Then both targets at least suck as much :).
>>>> 
>>>> I'm not sure that should be the goal...
>>>> 
>>>>> Thanks to e500mc's awful hardware design, we don't know who sets the 
>>>>> MSR_DE bit. Once we forced it onto the guest, we have no change to know 
>>>>> whether the guest also set it or not. We could only guess.
>>>> 
>>>> MSRP[DEP] can prevent the guest from modifying MSR[DE] -- but we still 
>>>> need to set it in the first place.
>>>> 
>>>> According to ISA V2.06B, the hypervisor should set DBCR0[EDM] to let the 
>>>> guest know that the debug resources are not available, and that "the value 
>>>> of MSR[DE] is not specified and not modifiable".
>>> So what would the guest do then to tell the hypervisor that it actually 
>>> wants to know about debug events?
>> 
>> The guest is out of luck, just as if a JTAG were in use.
> 
> Hrm.
> 
> Can we somehow generalize this "out of luck" behavior?
> 
> Every time we would set or clear an MSR bit in shadow_msr on e500v2, we would 
> instead set or clear it in the real MSR. That way only e500mc is out of luck, 
> but the code would still be shared.


Something like this. We could also define a SHADOW_MSR(vcpu) macro to hide the 
glorious details, but I think this way it's easier to understand what's going 
on.


Alex

diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 38a62ef..9bdb845 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -133,6 +133,29 @@ static void kvmppc_vcpu_sync_fpu(struct kvm_vcpu *vcpu)
 #endif
 }
 
+static void kvmppc_vcpu_sync_debug(struct kvm_vcpu *vcpu)
+{
+       u32 is_debug = vcpu->arch.shared->msr & MSR_DE;
+
+       /* Force debug to on in guest space when user space wants to debug */
+       if (vcpu->guest_debug)
+               is_debug = MSR_DE;
+
+#ifdef CONFIG_KVM_BOOKE_HV
+       /*
+        * Since there is no shadow MSR, sync MSR_DE into the guest
+        * visible MSR.
+        */
+       vcpu->arch.shared->msr &= ~MSR_DE;
+       vcpu->arch.shared->msr |= is_debug;
+#endif
+
+#ifndef CONFIG_KVM_BOOKE_HV
+       vcpu->arch.shadow_msr &= ~MSR_DE;
+       vcpu->arch.shadow_msr |= is_debug;
+#endif
+}
+
 /*
  * Helper function for "full" MSR writes.  No need to call this if only
  * EE/CE/ME/DE/RI are changing.
@@ -150,6 +173,7 @@ void kvmppc_set_msr(struct kvm_vcpu *vcpu, u32 new_msr)
        kvmppc_mmu_msr_notify(vcpu, old_msr);
        kvmppc_vcpu_sync_spe(vcpu);
        kvmppc_vcpu_sync_fpu(vcpu);
+       kvmppc_vcpu_sync_debug(vcpu);
 }
 
 static void kvmppc_booke_queue_irqprio(struct kvm_vcpu *vcpu,--
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