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-3.4-testing] x86: Generalise BUGFRAME_dump mechanis

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-3.4-testing] x86: Generalise BUGFRAME_dump mechanism to allow polled UART irq to
From: "Xen patchbot-3.4-testing" <patchbot-3.4-testing@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 24 Feb 2010 03:20:51 -0800
Delivery-date: Wed, 24 Feb 2010 03:22:22 -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 1267009865 0
# Node ID 3ccf3e993d5ddc4e5dff15e464dc63d5485e984c
# Parent  cddd503fb25401fdaabe1344fdf5e060ca158e7a
x86: Generalise BUGFRAME_dump mechanism to allow polled UART irq to
get proper regs argument.

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
xen-unstable changeset:   20969:8cb6e7eff2ba
xen-unstable date:        Wed Feb 24 10:44:30 2010 +0000
---
 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 cddd503fb254 -r 3ccf3e993d5d xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      Wed Feb 24 11:10:09 2010 +0000
+++ b/xen/arch/x86/traps.c      Wed Feb 24 11:11:05 2010 +0000
@@ -840,6 +840,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;
@@ -860,26 +861,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 cddd503fb254 -r 3ccf3e993d5d xen/drivers/acpi/utilities/utglobal.c
--- a/xen/drivers/acpi/utilities/utglobal.c     Wed Feb 24 11:10:09 2010 +0000
+++ b/xen/drivers/acpi/utilities/utglobal.c     Wed Feb 24 11:11:05 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 cddd503fb254 -r 3ccf3e993d5d xen/drivers/char/ns16550.c
--- a/xen/drivers/char/ns16550.c        Wed Feb 24 11:10:09 2010 +0000
+++ b/xen/drivers/char/ns16550.c        Wed Feb 24 11:11:05 2010 +0000
@@ -144,11 +144,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 */
@@ -166,6 +168,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 cddd503fb254 -r 3ccf3e993d5d xen/include/asm-x86/bug.h
--- a/xen/include/asm-x86/bug.h Wed Feb 24 11:10:09 2010 +0000
+++ b/xen/include/asm-x86/bug.h Wed Feb 24 11:11:05 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 cddd503fb254 -r 3ccf3e993d5d xen/include/asm-x86/processor.h
--- a/xen/include/asm-x86/processor.h   Wed Feb 24 11:10:09 2010 +0000
+++ b/xen/include/asm-x86/processor.h   Wed Feb 24 11:11:05 2010 +0000
@@ -532,6 +532,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-3.4-testing] x86: Generalise BUGFRAME_dump mechanism to allow polled UART irq to, Xen patchbot-3.4-testing <=