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

[PATCH] xen/arm: XEN_DOMCTL_get_address_size hypercall support


  • To: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Milan Djokic <milan_djokic@xxxxxxxx>
  • Date: Wed, 1 Oct 2025 20:01:19 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
  • 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=5OZ4W9JY6oIr64owyu6CLBdDMrcxrC31dr4eXTBG2Q8=; b=w2fF0PmeYpL111iEJQOYuyikAFEw6+lmkIc5rlmE0u5oTUP9ImWX6CUzSi5zPlRALnVbZzNDzlzzVOCSKg9D6hnp0r7gJywtBX4lsxRGsG/dNPSKa0o8wC5KpMRUw+ai1i3MZpgvAuvRxpEEyYF1dWqEja2wFqLnZkrPDbMFkjE88Z1s64lFrz+7SyTny0pmIbuD8SGpJ3+fEb48Ec2Zmd+GtawbrhkPOWBwLOfMXrnIk7LAHuwjjptUkdIjPThqxXoUOzES249ckGAeqL7noIU77NCMEw6LH913uNl574G72u33nqsTUQDxFnOHiVBi2SweUIIrVxhN4aCrqMf6Gg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CN0LaXOdsf5u0m57SflZN30SmSVDgVtNdoaaNZrWpwcm6kqQfzmIBzeX1fVSgqcRBCy0mOinSXN2xQ4uKIj+0k8zK7/W9z91CHZKxBHIVV+BdCKo6aByDK6NI5K7xon0+pxo5tJHI/i0976JivwTKMjLV+JHT2qUmqWZyverWkwIwv5njwDhcFsEYpgcfldcMu/q1ZFdFbjOHKijp4dw5G1egwDu2j+gFLKarNJEcJOsFMfroAPHKMlo04TPrvWyAwwdhAzIwgUi/sG/boSYGyCD24Q4xlkeGCH7a45h2ajHuRGhQGu1BcZRHOWgZai6c6Fooe2VhSo+xRDWMft88g==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=epam.com;
  • Cc: Milan Djokic <milan_djokic@xxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Wed, 01 Oct 2025 20:01:38 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHcMw4nGtW4BrEr00ihicoKFqTpuw==
  • Thread-topic: [PATCH] xen/arm: XEN_DOMCTL_get_address_size hypercall support

Signed-off-by: Milan Djokic <milan_djokic@xxxxxxxx>

---
XEN_DOMCTL_get_address_size hypercall is not implemented for arm (only for x86)
It would be useful to have this hypercall supported for arm64, in order to get
current guest addressing mode and also to verify that 
XEN_DOMCTL_set_address_size
performs switch to target addressing mode (instead of relying on its returned 
error code only).
---
 xen/arch/arm/arm64/domctl.c       | 46 +++++++++++++++++++++++++++++--
 xen/arch/arm/domain.c             |  5 ++++
 xen/arch/arm/include/asm/domain.h |  1 +
 3 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/xen/arch/arm/arm64/domctl.c b/xen/arch/arm/arm64/domctl.c
index 8720d126c9..f227309e06 100644
--- a/xen/arch/arm/arm64/domctl.c
+++ b/xen/arch/arm/arm64/domctl.c
@@ -12,6 +12,7 @@
 #include <public/domctl.h>
 #include <asm/arm64/sve.h>
 #include <asm/cpufeature.h>
+#include <xen/guest_access.h>
 
 static long switch_mode(struct domain *d, enum domain_type type)
 {
@@ -33,6 +34,37 @@ static long switch_mode(struct domain *d, enum domain_type 
type)
     return 0;
 }
 
+static long get_address_size(struct domain *d, uint32_t *address_size)
+{
+    long rc = 0;
+    struct vcpu *v;
+    /* Check invalid arguments */
+    if ( d == NULL || address_size == NULL) {
+        rc = -EINVAL;
+    }
+    /* Domain structure type field and actual vcpu mode must be aligned */
+    if(rc == 0) {
+        for_each_vcpu(d, v) {
+            if(vcpu_get_mode(v) != d->arch.type) {
+                rc = -EFAULT;
+            }
+        }
+    }
+
+    if(rc == 0) {
+        if(d->arch.type == DOMAIN_32BIT) {
+            *address_size = 32U;
+        }
+        else if(d->arch.type == DOMAIN_64BIT) {
+            *address_size = 64U;
+        }
+        else {
+            rc = -EFAULT;
+        }
+    }
+    return rc;
+}
+
 static long set_address_size(struct domain *d, uint32_t address_size)
 {
     switch ( address_size )
@@ -54,14 +86,22 @@ static long set_address_size(struct domain *d, uint32_t 
address_size)
 long subarch_do_domctl(struct xen_domctl *domctl, struct domain *d,
                        XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
 {
+    long rc = 0;
     switch ( domctl->cmd )
     {
     case XEN_DOMCTL_set_address_size:
-        return set_address_size(d, domctl->u.address_size.size);
-
+        rc = set_address_size(d, domctl->u.address_size.size);
+        break;
+    case XEN_DOMCTL_get_address_size:
+        rc = get_address_size(d, &domctl->u.address_size.size);
+        if(__copy_to_guest(u_domctl, domctl, 1)) {
+            rc = -EFAULT;
+        }
+        break;
     default:
-        return -ENOSYS;
+        rc = -ENOSYS;
     }
+    return rc;
 }
 
 /*
diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index 1a8585d02b..9096dc7411 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -608,6 +608,11 @@ void vcpu_switch_to_aarch64_mode(struct vcpu *v)
     v->arch.hcr_el2 |= HCR_RW;
 }
 
+unsigned int vcpu_get_mode(struct vcpu *v)
+{
+    return v->arch.hcr_el2 & HCR_RW ? DOMAIN_64BIT : DOMAIN_32BIT;
+}
+
 int arch_sanitise_domain_config(struct xen_domctl_createdomain *config)
 {
     unsigned int max_vcpus;
diff --git a/xen/arch/arm/include/asm/domain.h 
b/xen/arch/arm/include/asm/domain.h
index af3e168374..e64402a67d 100644
--- a/xen/arch/arm/include/asm/domain.h
+++ b/xen/arch/arm/include/asm/domain.h
@@ -252,6 +252,7 @@ struct arch_vcpu
 
 void vcpu_show_registers(struct vcpu *v);
 void vcpu_switch_to_aarch64_mode(struct vcpu *v);
+unsigned int vcpu_get_mode(struct vcpu *v);
 
 /*
  * Due to the restriction of GICv3, the number of vCPUs in AFF0 is
-- 
2.43.0



 


Rackspace

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