[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen stable-4.18] x86/hvm: Fix fast singlestep state persistence



commit b51fd78aed865033413178f5953147effedc7ce0
Author:     Petr Beneš <w1benny@xxxxxxxxx>
AuthorDate: Tue Feb 27 13:55:25 2024 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Feb 27 13:55:25 2024 +0100

    x86/hvm: Fix fast singlestep state persistence
    
    This patch addresses an issue where the fast singlestep setting would 
persist
    despite xc_domain_debug_control being called with 
XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF.
    Specifically, if fast singlestep was enabled in a VMI session and that 
session
    stopped before the MTF trap occurred, the fast singlestep setting remained
    active even though MTF itself was disabled.  This led to a situation where, 
upon
    starting a new VMI session, the first event to trigger an EPT violation 
would
    cause the corresponding EPT event callback to be skipped due to the 
lingering
    fast singlestep setting.
    
    The fix ensures that the fast singlestep setting is properly reset when
    disabling single step debugging operations.
    
    Signed-off-by: Petr Beneš <w1benny@xxxxxxxxx>
    Reviewed-by: Tamas K Lengyel <tamas@xxxxxxxxxxxxx>
    master commit: 897def94b56175ce569673a05909d2f223e1e749
    master date: 2024-02-12 09:37:58 +0100
---
 xen/arch/x86/hvm/hvm.c | 34 ++++++++++++++++++++++++----------
 1 file changed, 24 insertions(+), 10 deletions(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 482eebbabf..a70b351373 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -5167,26 +5167,40 @@ long do_hvm_op(unsigned long op, 
XEN_GUEST_HANDLE_PARAM(void) arg)
 
 int hvm_debug_op(struct vcpu *v, int32_t op)
 {
-    int rc;
+    int rc = 0;
 
     switch ( op )
     {
         case XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON:
         case XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF:
-            rc = -EOPNOTSUPP;
             if ( !cpu_has_monitor_trap_flag )
-                break;
-            rc = 0;
-            vcpu_pause(v);
-            v->arch.hvm.single_step =
-                (op == XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON);
-            vcpu_unpause(v); /* guest will latch new state */
+                return -EOPNOTSUPP;
             break;
         default:
-            rc = -ENOSYS;
-            break;
+            return -ENOSYS;
+    }
+
+    vcpu_pause(v);
+
+    switch ( op )
+    {
+    case XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON:
+        v->arch.hvm.single_step = true;
+        break;
+
+    case XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF:
+        v->arch.hvm.single_step = false;
+        v->arch.hvm.fast_single_step.enabled = false;
+        v->arch.hvm.fast_single_step.p2midx = 0;
+        break;
+
+    default: /* Excluded above */
+        ASSERT_UNREACHABLE();
+        return -ENOSYS;
     }
 
+    vcpu_unpause(v); /* guest will latch new state */
+
     return rc;
 }
 
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.18



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.