@@ -73,6 +73,8 @@ static void restore_guest_debug_regs(struct kvm_vcpu *vcpu)
73
73
*/
74
74
static void kvm_arm_setup_mdcr_el2 (struct kvm_vcpu * vcpu )
75
75
{
76
+ preempt_disable ();
77
+
76
78
/*
77
79
* This also clears MDCR_EL2_E2PB_MASK and MDCR_EL2_E2TB_MASK
78
80
* to disable guest access to the profiling and trace buffers
@@ -103,6 +105,12 @@ static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu)
103
105
kvm_vcpu_os_lock_enabled (vcpu ))
104
106
vcpu -> arch .mdcr_el2 |= MDCR_EL2_TDA ;
105
107
108
+ /* Write MDCR_EL2 directly if we're already at EL2 */
109
+ if (has_vhe ())
110
+ write_sysreg (vcpu -> arch .mdcr_el2 , mdcr_el2 );
111
+
112
+ preempt_enable ();
113
+
106
114
trace_kvm_arm_set_dreg32 ("MDCR_EL2" , vcpu -> arch .mdcr_el2 );
107
115
}
108
116
@@ -148,7 +156,7 @@ void kvm_arm_reset_debug_ptr(struct kvm_vcpu *vcpu)
148
156
149
157
void kvm_arm_setup_debug (struct kvm_vcpu * vcpu )
150
158
{
151
- unsigned long mdscr , orig_mdcr_el2 = vcpu -> arch . mdcr_el2 ;
159
+ unsigned long mdscr ;
152
160
153
161
trace_kvm_arm_setup_debug (vcpu , vcpu -> guest_debug );
154
162
@@ -250,10 +258,6 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu)
250
258
if (vcpu_read_sys_reg (vcpu , MDSCR_EL1 ) & (DBG_MDSCR_KDE | DBG_MDSCR_MDE ))
251
259
vcpu_set_flag (vcpu , DEBUG_DIRTY );
252
260
253
- /* Write mdcr_el2 changes since vcpu_load on VHE systems */
254
- if (has_vhe () && orig_mdcr_el2 != vcpu -> arch .mdcr_el2 )
255
- write_sysreg (vcpu -> arch .mdcr_el2 , mdcr_el2 );
256
-
257
261
trace_kvm_arm_set_dreg32 ("MDSCR_EL1" , vcpu_read_sys_reg (vcpu , MDSCR_EL1 ));
258
262
}
259
263
0 commit comments