WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] x86: Generalise BUGFRAME_dump mechanism t

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86: Generalise BUGFRAME_dump mechanism to allow polled UART irq to
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 24 Feb 2010 03:20:22 -0800
Delivery-date: Wed, 24 Feb 2010 03:20:36 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1267008270 0
# Node ID 8cb6e7eff2ba154afa2d1c29cca05989023ab7fe
# Parent  351a34c2fd48a362dc5339db44916c4478c2564d
x86: Generalise BUGFRAME_dump mechanism to allow polled UART irq to
get proper regs argument.

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/traps.c                  |   32 ++++++++++++++++++--------------
 xen/drivers/acpi/utilities/utglobal.c |    1 +
 xen/drivers/char/ns16550.c            |   22 +++++++++++++++++-----
 xen/include/asm-x86/bug.h             |    9 +++++----
 xen/include/asm-x86/processor.h       |    1 +
 5 files changed, 42 insertions(+), 23 deletions(-)

diff -r 351a34c2fd48 -r 8cb6e7eff2ba xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      Wed Feb 24 09:38:35 2010 +0000
+++ b/xen/arch/x86/traps.c      Wed Feb 24 10:44:30 2010 +0000
@@ -892,6 +892,7 @@ asmlinkage void do_invalid_op(struct cpu
 {
     struct bug_frame bug;
     struct bug_frame_str bug_str;
+    const void *p;
     const char *filename, *predicate, *eip = (char *)regs->eip;
     unsigned long fixup;
     int id, lineno;
@@ -913,26 +914,29 @@ asmlinkage void do_invalid_op(struct cpu
         goto die;
     eip += sizeof(bug);
 
-    id = bug.id & 3;
-
-    if ( id == BUGFRAME_dump )
-    {
-        show_execution_state(regs);
-        regs->eip = (unsigned long)eip;
-        return;
-    }
-
-    /* WARN, BUG or ASSERT: decode the filename pointer and line number. */
+    /* Decode first pointer argument. */
     if ( !is_kernel(eip) ||
          __copy_from_user(&bug_str, eip, sizeof(bug_str)) ||
          (bug_str.mov != 0xbc) )
         goto die;
-    filename = bug_str(bug_str, eip);
+    p = bug_str(bug_str, eip);
+    if ( !is_kernel(p) )
+        goto die;
     eip += sizeof(bug_str);
 
-    if ( !is_kernel(filename) )
-        filename = "<unknown>";
-    lineno   = bug.id >> 2;
+    id = bug.id & 3;
+
+    if ( id == BUGFRAME_run_fn )
+    {
+        const void (*fn)(struct cpu_user_regs *) = p;
+        (*fn)(regs);
+        regs->eip = (unsigned long)eip;
+        return;
+    }
+
+    /* WARN, BUG or ASSERT: decode the filename pointer and line number. */
+    filename = p;
+    lineno = bug.id >> 2;
 
     if ( id == BUGFRAME_warn )
     {
diff -r 351a34c2fd48 -r 8cb6e7eff2ba xen/drivers/acpi/utilities/utglobal.c
--- a/xen/drivers/acpi/utilities/utglobal.c     Wed Feb 24 09:38:35 2010 +0000
+++ b/xen/drivers/acpi/utilities/utglobal.c     Wed Feb 24 10:44:30 2010 +0000
@@ -45,6 +45,7 @@
 
 #include <xen/config.h>
 #include <xen/lib.h>
+#include <asm/processor.h>
 #include <acpi/acpi.h>
 #include <acpi/acnamesp.h>
 
diff -r 351a34c2fd48 -r 8cb6e7eff2ba xen/drivers/char/ns16550.c
--- a/xen/drivers/char/ns16550.c        Wed Feb 24 09:38:35 2010 +0000
+++ b/xen/drivers/char/ns16550.c        Wed Feb 24 10:44:30 2010 +0000
@@ -145,11 +145,13 @@ static void ns16550_interrupt(
     }
 }
 
-static void ns16550_poll(void *data)
-{
-    struct serial_port *port = data;
-    struct ns16550 *uart = port->uart;
-    struct cpu_user_regs *regs = guest_cpu_user_regs();
+/* Safe: ns16550_poll() runs in softirq context so not reentrant on a given 
CPU. */
+static DEFINE_PER_CPU(struct serial_port *, poll_port);
+
+static void __ns16550_poll(struct cpu_user_regs *regs)
+{
+    struct serial_port *port = this_cpu(poll_port);
+    struct ns16550 *uart = port->uart;
 
     if ( uart->intr_works )
         return;     /* Interrupts work - no more polling */
@@ -167,6 +169,16 @@ static void ns16550_poll(void *data)
         serial_tx_interrupt(port, regs);
 
     set_timer(&uart->timer, NOW() + MILLISECS(uart->timeout_ms));
+}
+
+static void ns16550_poll(void *data)
+{
+    this_cpu(poll_port) = data;
+#ifdef run_in_exception_handler
+    run_in_exception_handler(__ns16550_poll);
+#else
+    __ns16550_poll(guest_cpu_user_regs());
+#endif
 }
 
 static int ns16550_tx_empty(struct serial_port *port)
diff -r 351a34c2fd48 -r 8cb6e7eff2ba xen/include/asm-x86/bug.h
--- a/xen/include/asm-x86/bug.h Wed Feb 24 09:38:35 2010 +0000
+++ b/xen/include/asm-x86/bug.h Wed Feb 24 10:44:30 2010 +0000
@@ -13,15 +13,16 @@ struct bug_frame {
     unsigned short id; /* BUGFRAME_??? */
 } __attribute__((packed));
 
-#define BUGFRAME_dump   0
+#define BUGFRAME_run_fn 0
 #define BUGFRAME_warn   1
 #define BUGFRAME_bug    2
 #define BUGFRAME_assert 3
 
-#define dump_execution_state()                     \
+#define run_in_exception_handler(fn)               \
     asm volatile (                                 \
-        "ud2 ; ret $0"                             \
-        : : "i" (BUGFRAME_dump) )
+        "ud2 ; ret %0" BUG_STR(1)                  \
+        : : "i" (BUGFRAME_run_fn),                 \
+            "i" (fn) )
 
 #define WARN()                                     \
     asm volatile (                                 \
diff -r 351a34c2fd48 -r 8cb6e7eff2ba xen/include/asm-x86/processor.h
--- a/xen/include/asm-x86/processor.h   Wed Feb 24 09:38:35 2010 +0000
+++ b/xen/include/asm-x86/processor.h   Wed Feb 24 10:44:30 2010 +0000
@@ -535,6 +535,7 @@ void show_stack_overflow(unsigned int cp
 void show_stack_overflow(unsigned int cpu, unsigned long esp);
 void show_registers(struct cpu_user_regs *regs);
 void show_execution_state(struct cpu_user_regs *regs);
+#define dump_execution_state() run_in_exception_handler(show_execution_state)
 void show_page_walk(unsigned long addr);
 asmlinkage void fatal_trap(int trapnr, struct cpu_user_regs *regs);
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] x86: Generalise BUGFRAME_dump mechanism to allow polled UART irq to, Xen patchbot-unstable <=