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

[PATCH v1 20/28] x86/hvm: rework XEN_DOMCTL_debug_op


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: dmukhin@xxxxxxxx
  • Date: Wed, 4 Nov 2026 17:33:37 -0800
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 205.220.161.53) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=ford.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=ford.com; dkim=pass (signature was verified) header.d=saarlouis.ford.com; dkim=pass (signature was verified) header.d=ford.com; arc=none (0)
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=mHbY2cEQEvRPTVjvhml188mlseK3hau22WWwZyaMhvo=; b=AQ+1IHT2IXjoq/3EWRZGguePDr2T6sfzp6e1H9Ctv5J2lz8k1UELcPsUF//asmOgvi4cDmpYvEj/58rFP1KvmEHKIMTobdC96lF/UQg9wN4H4KGy94L8/8sbhPGpo0ACBamfO/Rtnl7Fd5o1x5c3aMV4TGB7UKUV01Od25wTjn49orRwKoOvqRZRSlM5V63KkrxFG4F5r4YlixLAuZgLJMuz8/VkUVnr3Q6EG0eCJemoKgByNHQ88pxAxOTwHkXUyD7vdn8LGxl3VUYtV1W4UP/YdhOhO8rdDHpOL+xgMZ+DU/nhWMJRV65bIMwtHisx5OXhzoDdVa4KmpQCk5Mwew==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=twPlspMbv48vtMQFVIWr+FCnSHNS8xWQi+rKSPs85j3Tl9WV6n1IDfrWFifybrbOUvxV2kdwC96eKam0EVjfuJJ51oEjXlLyekXt2LDArpvTokILshh0KipQZCa9xx+y/i0X3woT4VAVo2J1YkJ+6pgcVoRI1ZzS83e+5giw3UxdTRGOhB8olO2u34c7OA3kI5zwCd3Z1OG3X8ZMmTaSH7W62snIsy0J+YD8s0LMo42L8APZmDtBK8y5G0inJwtwi3PWsHK4tYviUnO4b5TOqUCTJ8Cairjl3cZAaQPVUUNthEyPsaUx/RX8CkgKLLY/BK6IIkL+6vefT8M/ZyTeEA==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=ppford header.d=ford.com header.i="@ford.com" header.h="Cc:Content-Transfer-Encoding:Content-Type:Date:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To"; dkim=pass header.s=selector2-azureford-onmicrosoft-com header.d=azureford.onmicrosoft.com header.i="@azureford.onmicrosoft.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"; dkim=pass header.s=ppserprodsaar header.d=saarlouis.ford.com header.i="@saarlouis.ford.com" header.h="Cc:Content-Transfer-Encoding:Date:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To"; dkim=pass header.s=ppfserpocford header.d=ford.com header.i="@ford.com" header.h="Cc:Content-Transfer-Encoding:Date:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To"
  • Cc: andrew.cooper3@xxxxxxxxxx, jason.andryuk@xxxxxxx, jbeulich@xxxxxxxx, roger@xxxxxxxxxxxxxx, teddy.astie@xxxxxxxxxx, dmukhin@xxxxxxx, Denis Mukhin <dmukhin@xxxxxxxx>
  • Delivery-date: Thu, 05 Nov 2026 01:35:07 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Pser-m365-app: SER-APP

From: Denis Mukhin <dmukhin@xxxxxxxx>

Currently, XEN_DOMCTL_debug_op assumes operations on VCPUs only
and only for Intel VMX-supported HVM domains. This limits its
usability in the test infrastructure.

Generalize XEN_DOMCTL_debug_op to allow operations on any x86 HVM
domain.

Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx>
---
 xen/arch/x86/domctl.c              | 24 ++++--------
 xen/arch/x86/hvm/hvm.c             | 59 ++++++++++++++++++++----------
 xen/arch/x86/include/asm/hvm/hvm.h |  3 +-
 xen/include/public/domctl.h        |  1 +
 4 files changed, 49 insertions(+), 38 deletions(-)

diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index 12c14bb3f514..7a52aff71620 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -912,23 +912,13 @@ long arch_do_domctl(
 
     case XEN_DOMCTL_debug_op:
     {
-        struct vcpu *v;
-
-        ret = -EOPNOTSUPP;
-        if ( !IS_ENABLED(CONFIG_HVM) )
-            break;
-
-        ret = -EINVAL;
-        if ( (domctl->u.debug_op.vcpu >= d->max_vcpus) ||
-             ((v = d->vcpu[domctl->u.debug_op.vcpu]) == NULL) )
-            break;
-
-        ret = -EINVAL;
-        if ( (v == curr) || /* no vcpu_pause() */
-             !is_hvm_domain(d) )
-            break;
-
-        ret = hvm_debug_op(v, domctl->u.debug_op.op);
+        if ( IS_ENABLED(CONFIG_HVM) )
+            ret = hvm_debug_op(d,
+                               domctl->u.debug_op.op,
+                               domctl->u.debug_op.vcpu,
+                               domctl->u.debug_op.arg);
+        else
+            ret = -EOPNOTSUPP;
         break;
     }
 
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index ef9c7cd05777..42139837904a 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -5200,32 +5200,52 @@ long do_hvm_op(unsigned long op, 
XEN_GUEST_HANDLE_PARAM(void) arg)
     return rc;
 }
 
-int hvm_debug_op(struct vcpu *v, int32_t op)
+static int hvm_debug_op_single_step_allowed(const struct domain *d,
+                                            unsigned int vcpu)
 {
+    if ( (vcpu >= d->max_vcpus) || (d->vcpu[vcpu] == NULL) )
+        return -EINVAL;
+
+    if ( (d->vcpu[vcpu] == current) || /* no vcpu_pause() */
+         !is_hvm_domain(d) )
+        return -EINVAL;
+
+    if ( !IS_ENABLED(CONFIG_INTEL_VMX) || !cpu_has_monitor_trap_flag )
+        return -EOPNOTSUPP;
+
+    return 0;
+}
+
+int hvm_debug_op(struct domain *d, unsigned int op, unsigned int vcpu,
+                 unsigned int arg)
+{
+    struct vcpu *v;
     int rc = 0;
 
-    switch ( op )
-    {
-        case XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON:
-        case XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF:
-            if ( !cpu_has_monitor_trap_flag )
-                return -EOPNOTSUPP;
-            break;
-        default:
-            return -ENOSYS;
-    }
-
-    BUILD_ERROR_IF_NOT(CONFIG_INTEL_VMX);
-
-    vcpu_pause(v);
-
     switch ( op )
     {
     case XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_ON:
+        rc = hvm_debug_op_single_step_allowed(d, vcpu);
+        if ( rc )
+            break;
+
+        v = d->vcpu[vcpu];
+
+        vcpu_pause(v);
         v->arch.hvm.single_step = true;
+        vcpu_unpause(v); /* guest will latch new state */
+
         break;
 
     case XEN_DOMCTL_DEBUG_OP_SINGLE_STEP_OFF:
+        rc = hvm_debug_op_single_step_allowed(d, vcpu);
+        if ( rc )
+            break;
+
+        v = d->vcpu[vcpu];
+
+        vcpu_pause(v);
+
         v->arch.hvm.single_step = false;
 
 #ifdef CONFIG_ALTP2M
@@ -5233,15 +5253,14 @@ int hvm_debug_op(struct vcpu *v, int32_t op)
         v->arch.hvm.fast_single_step.p2midx = 0;
 #endif
 
+        vcpu_unpause(v); /* guest will latch new state */
+
         break;
 
-    default: /* Excluded above */
-        ASSERT_UNREACHABLE();
+    default:
         return -ENOSYS;
     }
 
-    vcpu_unpause(v); /* guest will latch new state */
-
     return rc;
 }
 
diff --git a/xen/arch/x86/include/asm/hvm/hvm.h 
b/xen/arch/x86/include/asm/hvm/hvm.h
index 1f0f7749b579..6efc533b35df 100644
--- a/xen/arch/x86/include/asm/hvm/hvm.h
+++ b/xen/arch/x86/include/asm/hvm/hvm.h
@@ -369,7 +369,8 @@ void *hvm_map_guest_frame_ro(unsigned long gfn, bool 
permanent);
 void hvm_unmap_guest_frame(void *p, bool permanent);
 void hvm_mapped_guest_frames_mark_dirty(struct domain *d);
 
-int hvm_debug_op(struct vcpu *v, int32_t op);
+int hvm_debug_op(struct domain *d, unsigned int op, unsigned int vcpu,
+                 unsigned int arg);
 
 /* Caller should pause vcpu before calling this function */
 void hvm_toggle_singlestep(struct vcpu *v);
diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
index 4ca8a2d7ca65..546d9a8ac9c0 100644
--- a/xen/include/public/domctl.h
+++ b/xen/include/public/domctl.h
@@ -768,6 +768,7 @@ struct xen_domctl_subscribe {
 struct xen_domctl_debug_op {
     uint32_t op;   /* IN */
     uint32_t vcpu; /* IN */
+    uint32_t arg;  /* IN */
 };
 
 /*
-- 
2.55.0




 


Rackspace

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