Hi Alex, On 27/10/2020 17:26, Alexandru Elisei wrote: > When a VCPU is created, the kvm_vcpu struct is initialized to zero in > kvm_vm_ioctl_create_vcpu(). On VHE systems, the first time > vcpu.arch.mdcr_el2 is loaded on hardware is in vcpu_load(), before it is > set to a sensible value in kvm_arm_setup_debug() later in the run loop. The > result is that KVM executes for a short time with MDCR_EL2 set to zero. > > This is mostly harmless as we don't need to trap debug and SPE register > accesses from EL1 (we're still running in the host at EL2), but we do set > MDCR_EL2.HPMN to 0 which is constrained unpredictable according to ARM DDI > 0487F.b, page D13-3620; the required behavior from the hardware in this > case is to reserve an unkown number of registers for EL2 and EL3 exclusive > use. > > Initialize mdcr_el2 in kvm_vcpu_vcpu_first_run_init(), so we can avoid the > constrained unpredictable behavior and to ensure that the MDCR_EL2 register > has the same value after each vcpu_load(), including the first time the > VCPU is run. > diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c > index 7a7e425616b5..22ee448aee2b 100644 > --- a/arch/arm64/kvm/debug.c > +++ b/arch/arm64/kvm/debug.c > @@ -68,6 +68,59 @@ void kvm_arm_init_debug(void) > +static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu, u32 host_mdcr) > +{ > + bool trap_debug = !(vcpu->arch.flags & KVM_ARM64_DEBUG_DIRTY); > + > + /* > + * This also clears MDCR_EL2_E2PB_MASK to disable guest access > + * to the profiling buffer. > + */ > + vcpu->arch.mdcr_el2 = host_mdcr & MDCR_EL2_HPMN_MASK; > + vcpu->arch.mdcr_el2 |= (MDCR_EL2_TPM | > + MDCR_EL2_TPMS | > + MDCR_EL2_TPMCR | > + MDCR_EL2_TDRA | > + MDCR_EL2_TDOSA); > + if (vcpu->guest_debug) { > + /* Route all software debug exceptions to EL2 */ > + vcpu->arch.mdcr_el2 |= MDCR_EL2_TDE; > + if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW) > + trap_debug = true; > + } This had me confused for a while... could you hint that this is when the guest is being 'external' debugged by the VMM? (its clear-er before this change) Thanks, James > + /* Trap debug register access */ > + if (trap_debug) > + vcpu->arch.mdcr_el2 |= MDCR_EL2_TDA; > + > + trace_kvm_arm_set_dreg32("MDCR_EL2", vcpu->arch.mdcr_el2); > +} _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm