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

[PATCH v8 18/26] emul/ns16x50: resolve physical I/O port sharing


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: dmukhin@xxxxxxxx
  • Date: Wed, 11 Nov 2026 11:47:52 -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=EvtsBGfZ4UWgIlG0zoPivirSgR6EtrRdn5fkJmtIoOY=; b=j/e+GFuog5SDCqFGtBXl7DnQfP0kevPI83KzJfYYcSSThbHJY/u1QWiT1okomuR464TOnIgubZZrXRWpLgEUDDh73ZIH5LYSkw64vcLli2EFrZPqUF2DPBm+dbiDGPX+Y4DTeQwW/nrrIb4fs3ivsKONNhAXASkNSEpoKnZoEWfqucSTzFwBrZ+ksHLFFvuiJv5HBbYpEsRv+F0YOdKrDPw7zJWaOfHXYCyngp/RXHT5PrtF9M0vdKnUAWqxOq/jVAw6qRk9Smuz2qJjnoBcAvWHXyixJqY+SeD7u446G7J6vrpDCSfCg+kn7Idn715t22XZChlTmXsuLdiYVWaltg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PqeMgyCPqi8GF4i7O9VDyvoUfCGWcZMPLu6Ah4aeIo2/sMmdEXH0tKhCB4XqZvk7W7+AERxgc1h47fTqakdlQv+wgoLtN4e+NtfC7Rx20yjCXDFwVeBnAaX9m5JG3ftvNE+V5KUxQwbfNEeNr6J8tpBuvec0azcf7LL5hYSnzG4Kf1n35QH+rzwTpji9pAXO8/qL+Aq2o0Avu+fRF/xYFtFGe66BEbzUqj7w/wjEKde/ROC71zqZ+mCEtZHfAVjVHEJsvHjMLHBMbHMIz93R2f4hpD6WRSk6BoVYQiNnVaU2gZOIJQ2D62kAyjpGdfjFGP57pokaFqStEKRHFbMBSQ==
  • 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, anthony.perard@xxxxxxxxxx, jbeulich@xxxxxxxx, julien@xxxxxxx, michal.orzel@xxxxxxx, roger@xxxxxxxxxxxxxx, sstabellini@xxxxxxxxxx, xakep.amatop@xxxxxxxxx, dmukhin@xxxxxxx, Denis Mukhin <dmukhin@xxxxxxxx>
  • Delivery-date: Wed, 11 Nov 2026 19:49:10 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Pser-m365-app: SER-APP

From: Denis Mukhin <dmukhin@xxxxxxxx>

Ensure NS16550 emulator does not share I/O ports with the physical I/O
ports, which is essential for emulation in PVH hwdom case (dom0).

Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx>
---
 xen/common/emul/vuart/ns16x50.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/xen/common/emul/vuart/ns16x50.c b/xen/common/emul/vuart/ns16x50.c
index cda21c15cf78..97e12a99368a 100644
--- a/xen/common/emul/vuart/ns16x50.c
+++ b/xen/common/emul/vuart/ns16x50.c
@@ -901,14 +901,27 @@ static int ns16x50_init(void *arg)
     struct vuart_ns16x50 *vdev = arg;
     const struct vuart_info *info;
     struct domain *d;
+    const char *as;
+    int rc;
 
     ASSERT(vdev);
 
     d = vdev->owner;
     info = vdev->info;
+    as = (info->base_type & IORESOURCE_IO) ? "ioport": "iomem";
 
     if ( info->base_type & IORESOURCE_IO )
     {
+        /* Disallow sharing physical I/O port */
+        rc = ioports_deny_access(d, info->base_addr,
+                                 info->base_addr + info->size - 1);
+        if ( rc )
+        {
+            ns16x50_err(info, "virtual %s range [%#"PRIx64"..%#"PRIx64"]: 
conflict w/ physical range\n",
+                        as, info->base_addr, info->base_addr + info->size - 1);
+            return rc;
+        }
+
         register_portio_handler(d, info->base_addr, info->size, 
ns16x50_io_handle);
     }
     else if ( info->base_type & IORESOURCE_MEM )
@@ -928,13 +941,20 @@ static int ns16x50_init(void *arg)
 static void cf_check ns16x50_deinit(void *arg)
 {
     struct vuart_ns16x50 *vdev = arg;
+    const struct vuart_info *info;
     unsigned long flags;
 
     ASSERT(vdev);
 
+    info = vdev->info;
+
     ns16x50_lock(vdev, &flags);
     ns16x50_fifo_tx_flush(vdev);
     ns16x50_unlock(vdev, &flags);
+
+    if ( info->base_type & IORESOURCE_IO )
+        ioports_permit_access(d, info->base_addr,
+                              info->base_addr + info->size - 1);
 }
 
 static void * cf_check ns16x50_alloc(struct domain *d, const struct vuart_info 
*info)
-- 
2.56.0




 


Rackspace

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