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

[Xen-devel] [PATCH v2 RFC] xen/console: Add domain ID to output if VERBOSE



This patch adds a domain ID prefix for the PV domain serial console
output (which includes mini-os console, dom0, and Linux domUs with
earlyprintk=xen).  This is similar to the output of an HVM guest's 0xE9
I/O port, but uses "(%d) " instead of "(XEN) HVM%d: " as the prefix.

This brings up some cosmetic issues that may need discussion:
 * Do we want to allow nonprintable characters from the PV guests?
   They are currently allowed, and are used by dom0 if booting with
   console=hvc0 on distros whose init scripts use color terminal
   escape sequences.  HVM output doesn't allow them.
 * HVM guests currently use a different prefix. Should this be changed?
 * Should the console-to-ring output also contain a prefix?
 * Should this prefixing only be enabled #ifdef VERBOSE?
 * There is currently no indication that one domain's output line is
   incomplete when another domain interrupts it (although the
   interrupting text is placed on a new line).  Buffering the lines as
   is done for HVM will break interactive use of the console in dom0.

---------------------------->8-----------------------------------------

When compiling with VERBOSE or when permitted using XSM, any domain can
output to the serial console; add a domain ID prefix similar to the
(XEN) prefix used by the hypervisor to make it possible to distinguish
the source of each message. This is especially useful for debugging stub
domains.

Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
---
 xen/drivers/char/console.c | 52 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 51 insertions(+), 1 deletion(-)

diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c
index ff360fe..8396040 100644
--- a/xen/drivers/char/console.c
+++ b/xen/drivers/char/console.c
@@ -365,8 +365,13 @@ static 
DECLARE_SOFTIRQ_TASKLET(notify_dom0_con_ring_tasklet,
 
 static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count)
 {
-    char kbuf[128], *kptr;
+    char kbuf[128], *kptr, *kout;
     int kcount;
+#ifdef VERBOSE
+    static domid_t active = DOMID_IDLE;
+    domid_t self = current->domain->domain_id;
+    char pbuf[10];
+#endif
 
     while ( count > 0 )
     {
@@ -382,8 +387,53 @@ static long 
guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count)
 
         spin_lock_irq(&console_lock);
 
+#ifdef VERBOSE
+        kout = kbuf;
+        if (active != self)
+        {
+            snprintf(pbuf, sizeof(pbuf), "%s(%d) ",
+                     (active == DOMID_IDLE) ? "" : "\n", self);
+            sercon_puts(pbuf);
+            vga_puts(pbuf);
+        }
+        for ( ; ; )
+        {
+            char save;
+            kptr = strchr(kout, '\n');
+            if ( kptr )
+            {
+                save = kptr[1];
+                kptr[1] = '\0';
+            }
+            sercon_puts(kout);
+            vga_puts(kout);
+
+            if ( !kptr )
+            {
+                /* buffer ends before newline */
+                active = self;
+                break;
+            }
+
+            kptr[1] = save;
+            kout = kptr + 1;
+            if ( save )
+            {
+                snprintf(pbuf, sizeof(pbuf), "(%d) ", self);
+                sercon_puts(pbuf);
+                vga_puts(pbuf);
+            }
+            else
+            {
+                /* buffer ends at end of line */
+                active = DOMID_IDLE;
+                break;
+            }
+        }
+#else
         sercon_puts(kbuf);
         vga_puts(kbuf);
+#endif
 
         if ( opt_console_to_ring )
         {
-- 
1.7.11.7


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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