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

[PATCH v8 13/26] emul/ns16550: implement dump_state() hook


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: dmukhin@xxxxxxxx
  • Date: Wed, 11 Nov 2026 11:47:47 -0800
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 148.163.138.245) 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=IuYtrBG0TgdjodeSGWL8GatbuyHctAwD1pKZ3hfg90A=; b=negsPSK30J+k2uln1NJFIyqo5n6k3E1/c3LQwLduDFy0Ex9+m31yxu64+mmPPjQGV4Jq1nqo3gMQ+HEHI5AYImJzAi8nr1lVchL6fFdubN7ojckH5yFoIE5s59NVKWZLXTMbmCqxOdJIdpU/EPuq1qMWuKFIu8kGjJeS9giAJhxQeQztFxn7xNOAB1lhjh80cKQUt6qUQTFC57Bh2cXKUZX+EJbYBBurIrIhFtk5r7JMElMgA3lN8Oz5LRl5sE/a5dTs+GJExMZH+xEH8YYecl10tin9HRVGjCyfTVh+736nSjkmo9i5mVuIpPOFLe14CB2SaXzYbuUexgwRDsLgww==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=yp+dbLeB/w/IquWXj9j37Fa3d8abbfQVB0ywxeTGprhK1rJICEzu/rq8RxjUKQQWMPvznxGnuh7kPEkElJzuVWi/mqsXhMz3Mx8rdYyVZWhYEvyZXXryg62p2OwUNMRLlRy4OVjVRqAFWEUB+ibxNYR49/TP8OC4lEve2iycGmSCJ4gXNYbAtdU9CJ+6+tS31zYI50mqgSw6DbolKgiafhOTOE+0pNi2eLCrhbl7GnHpmtK7SDWabmnaVjtx6bZtgn2TpmOA4z1xXLQ0W0gdsavMKcHFSe0giD5odTG9OpRGcxb9uU/h9DIHI3j33i2+r9oBWnPDpyQPAx5s5ETmTw==
  • 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:06 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Pser-m365-app: SER-APP

From: Denis Mukhin <dmukhin@xxxxxxxx>

Implement dump_state() vUART hook for debugging UART state machine over
Xen console. dump_state() prints state of all emulated registers
(including state-less IIR) and state of RX/TX FIFOs.

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

diff --git a/xen/common/emul/vuart/ns16x50.c b/xen/common/emul/vuart/ns16x50.c
index 404e12311090..cda21c15cf78 100644
--- a/xen/common/emul/vuart/ns16x50.c
+++ b/xen/common/emul/vuart/ns16x50.c
@@ -728,6 +728,62 @@ static int ns16x50_io_read(
     return rc;
 }
 
+static void cf_check ns16x50_dump_state(void *arg)
+{
+#ifdef CONFIG_VUART_NS16X50_DEBUG
+    struct vuart_ns16x50 *vdev = arg;
+    const struct domain *d;
+    const struct vuart_info *info;
+    const struct xencons_interface *cons;
+    const uint8_t *regs;
+    const char *as = (info->base_type & IORESOURCE_IO) ? "ioport":
+                                                         "iomem";
+    unsigned long flags;
+
+    ASSERT(vdev);
+
+    /* Allow printing state in case of a deadlock. */
+    if ( !ns16x50_trylock(vdev, &flags) )
+        return;
+
+    d = vdev->owner;
+    info = vdev->info;
+    cons = &vdev->cons;
+    regs = &vdev->regs[0];
+
+    printk("Virtual " pr_prefix " (%s) %s %#"PRIx64" IRQ#%d owner %pd\n",
+            vdev->name, as, info->base_addr, info->irq, d);
+
+    printk("  RX FIFO size %ld in_prod %d in_cons %d used %d\n",
+            ARRAY_SIZE(cons->in), cons->in_prod, cons->in_cons,
+            cons->in_prod - cons->in_cons);
+
+    printk("  TX FIFO size %ld out_prod %d out_cons %d used %d\n",
+            ARRAY_SIZE(cons->out), cons->out_prod, cons->out_cons,
+            cons->out_prod - cons->out_cons);
+
+    printk("  %02"PRIx8" RBR %02"PRIx8" THR %02"PRIx8" DLL %02"PRIx8" DLM 
%02"PRIx8"\n",
+            UART_RBR,
+            cons->in[MASK_XENCONS_IDX(cons->in_prod, cons->in)],
+            cons->out[MASK_XENCONS_IDX(cons->out_prod, cons->out)],
+            regs[NS16X50_REGS_NUM + UART_DLL],
+            regs[NS16X50_REGS_NUM + UART_DLM]);
+
+    printk("  %02"PRIx8" IER %02"PRIx8"\n", UART_IER, regs[UART_IER]);
+
+    printk("  %02"PRIx8" FCR %02"PRIx8" IIR %02"PRIx8"\n",
+            UART_FCR, regs[UART_FCR], ns16x50_iir_get(vdev));
+
+    printk("  %02"PRIx8" LCR %02"PRIx8"\n", UART_LCR, regs[UART_LCR]);
+    printk("  %02"PRIx8" MCR %02"PRIx8"\n", UART_MCR, regs[UART_MCR]);
+    printk("  %02"PRIx8" LSR %02"PRIx8"\n", UART_LSR, regs[UART_LSR]);
+    printk("  %02"PRIx8" MSR %02"PRIx8"\n", UART_MSR, regs[UART_MSR]);
+    printk("  %02"PRIx8" SCR %02"PRIx8"\n", UART_SCR, regs[UART_SCR]);
+
+    ns16x50_unlock(vdev, &flags);
+#endif /* CONFIG_VUART_NS16X50_DEBUG */
+}
+
 static void ns16x50_access(int dir, unsigned int type,
                            unsigned long addr, unsigned int size,
                            uint32_t *data)
@@ -794,6 +850,9 @@ static void ns16x50_access(int dir, unsigned int type,
         rc = ns16x50_io_read(vdev, reg, size, data);
 
 
+    if ( ns16x50_log_level >= 3 )
+        ns16x50_dump_state(vdev);
+
     if ( rc == 0 )
         ns16x50_debug(vdev, "%c %s %#"PRIx64" %d: LCR=%#02x %#02x %#08x\n",
                       op, as, addr, size, vdev->regs[UART_LCR], reg, *data);
@@ -971,6 +1030,9 @@ static int cf_check ns16x50_put_rx(void *arg, char ch)
 
     ns16x50_unlock(vdev, &flags);
 
+    if ( ns16x50_log_level >= 3 )
+        ns16x50_dump_state(vdev);
+
     return rc;
 }
 
@@ -979,7 +1041,7 @@ static int cf_check ns16x50_put_rx(void *arg, char ch)
     .compatible = "ns16550",            \
     .alloc      = ns16x50_alloc,        \
     .free       = ns16x50_free,         \
-    .dump_state = NULL,                 \
+    .dump_state = ns16x50_dump_state,   \
     .put_rx     = ns16x50_put_rx,       \
 }
 
-- 
2.56.0




 


Rackspace

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