[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
|