# HG changeset patch
# User Jimi Xenidis <[EMAIL PROTECTED]>
# Node ID 5a609aa8489bcb45a7e22f90526c52278025c5bc
# Parent  4a1f58739bc25b80eae92af80b9ef309cb25468c
[POWERPC][XEN] should call HYPERVISOR_poll() not HYPERVISOR_block()

block will enable interrupts, this is a bad thing to do while in
udb/xmon, and yes had to implement HYPERVISOR_poll().

Signed-off-by: Jimi Xenidis <[EMAIL PROTECTED]>
---
 arch/powerpc/platforms/xen/hcall.c      |   40 +++++++++++++++-----
 arch/powerpc/platforms/xen/setup.c      |    5 --
 arch/powerpc/platforms/xen/setup.h      |    5 ++
 arch/powerpc/platforms/xen/udbg_xen.c   |   61 +++++++++++++-------------------
 include/asm-powerpc/xen/asm/hypercall.h |    5 +-
 5 files changed, 62 insertions(+), 54 deletions(-)

diff -r 4a1f58739bc2 -r 5a609aa8489b arch/powerpc/platforms/xen/hcall.c
--- a/arch/powerpc/platforms/xen/hcall.c        Tue Sep 12 15:53:01 2006 -0500
+++ b/arch/powerpc/platforms/xen/hcall.c        Thu Sep 14 22:35:58 2006 -0400
@@ -39,6 +39,7 @@
 #include <asm/page.h>
 #include <asm/uaccess.h>
 #include <asm/hvcall.h>
+#include "setup.h"
 
 #define xen_guest_handle(hnd)  ((hnd).p)
 
@@ -183,7 +184,6 @@ int HYPERVISOR_sched_op(int cmd, void *a
 int HYPERVISOR_sched_op(int cmd, void *arg)
 {
        struct xencomm_desc *desc;
-       ulong argsize;
 
        switch (cmd) {
        case SCHEDOP_yield:
@@ -192,17 +192,21 @@ int HYPERVISOR_sched_op(int cmd, void *a
                                          cmd, 0);
                break;
 
-       case SCHEDOP_shutdown: {
-               desc = xencomm_create_inline(arg);
-
-               return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_sched_op),
-                                       cmd, desc);
-       }
-       case SCHEDOP_poll:
-               argsize = sizeof(sched_poll_t);
-               break;
+       case SCHEDOP_poll: {
+               evtchn_port_t *ports;
+               struct sched_poll sched_poll;
+
+               memcpy(&sched_poll, arg, sizeof(sched_poll));
+
+               ports = xencomm_create_inline(
+                       xen_guest_handle(sched_poll.ports));
+               set_xen_guest_handle(sched_poll.ports, ports);
+               memcpy(arg, &sched_poll, sizeof(sched_poll));
+               
+       }
+               break;
+       case SCHEDOP_shutdown:
        case SCHEDOP_remote_shutdown:
-               argsize = sizeof(sched_remote_shutdown_t);
                break;
        default:
                printk(KERN_ERR "%s: unknown sched op %d\n", __func__, cmd);
@@ -215,6 +219,20 @@ int HYPERVISOR_sched_op(int cmd, void *a
                                cmd, desc);
 }
 EXPORT_SYMBOL(HYPERVISOR_sched_op);
+
+int
+HYPERVISOR_poll(
+       evtchn_port_t *ports, unsigned int nr_ports, u64 timeout)
+{
+       struct sched_poll sched_poll = {
+               .nr_ports = nr_ports,
+               .timeout = jiffies_to_ns(timeout)
+       };
+       set_xen_guest_handle(sched_poll.ports, ports);
+
+       return HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll);
+}
+EXPORT_SYMBOL(HYPERVISOR_poll);
 
 int HYPERVISOR_multicall(void *call_list, int nr_calls)
 {
diff -r 4a1f58739bc2 -r 5a609aa8489b arch/powerpc/platforms/xen/setup.c
--- a/arch/powerpc/platforms/xen/setup.c        Tue Sep 12 15:53:01 2006 -0500
+++ b/arch/powerpc/platforms/xen/setup.c        Thu Sep 14 22:35:58 2006 -0400
@@ -154,11 +154,6 @@ int is_running_on_xen(void)
        return running_on_xen;
 }
 
-static u64 jiffies_to_ns(unsigned long j) 
-{
-       return j * (1000000000UL / HZ);
-}
-
 static void xen_power_save(void)
 {
        /* SCHEDOP_yield could immediately return. Instead, we
diff -r 4a1f58739bc2 -r 5a609aa8489b arch/powerpc/platforms/xen/setup.h
--- a/arch/powerpc/platforms/xen/setup.h        Tue Sep 12 15:53:01 2006 -0500
+++ b/arch/powerpc/platforms/xen/setup.h        Thu Sep 14 22:35:58 2006 -0400
@@ -14,3 +14,8 @@ static inline u64 tb_to_ns(u64 tb)
        }
        return 0;
 }
+
+static inline u64 jiffies_to_ns(unsigned long j) 
+{
+       return j * (1000000000UL / HZ);
+}
diff -r 4a1f58739bc2 -r 5a609aa8489b arch/powerpc/platforms/xen/udbg_xen.c
--- a/arch/powerpc/platforms/xen/udbg_xen.c     Tue Sep 12 15:53:01 2006 -0500
+++ b/arch/powerpc/platforms/xen/udbg_xen.c     Thu Sep 14 22:35:58 2006 -0400
@@ -5,6 +5,30 @@
 #include <asm/udbg.h>
 #include <asm/hypervisor.h>
 #include "setup.h"
+
+static void udbg_xen_wait(void)
+{
+       evtchn_port_t port = 0;
+
+       if (xen_start_info) {
+               port = xen_start_info->console.domU.evtchn;
+               clear_evtchn(port);
+       }
+       HYPERVISOR_poll(&port, 1, 10);
+}
+
+static int udbg_getc_xen(void)
+{
+       int ch;
+       for (;;) {
+               ch = udbg_getc_poll();
+               if (ch == -1) {
+                       udbg_xen_wait();
+               } else {
+                       return ch;
+               }
+       }
+}
 
 static void udbg_putc_dom0_xen(char c)
 {
@@ -45,24 +69,6 @@ static int udbg_getc_poll_dom0_xen(void)
        inbuflen--;
 
        return ch;
-}
-
-static int udbg_getc_dom0_xen(void)
-{
-       int ch;
-       for (;;) {
-               ch = udbg_getc_poll_dom0_xen();
-               if (ch == -1) {
-                       u64 now_ns = tb_to_ns(get_tb());
-                       if (now_ns > 0) {
-                               u64 offset_ns = 100000000; /* 100ms */
-                               HYPERVISOR_set_timer_op(now_ns + offset_ns);
-                               HYPERVISOR_sched_op(SCHEDOP_block, NULL);
-                       }
-               } else {
-                       return ch;
-               }
-       }
 }
 
 static struct xencons_interface *intf;
@@ -111,22 +117,6 @@ static int udbg_getc_poll_domu_xen(void)
        return c;
 }
 
-static int udbg_getc_domu_xen(void)
-{
-       int ch;
-       for (;;) {
-               ch = udbg_getc_poll_domu_xen();
-               if (ch == -1) {
-                       /* This shouldn't be needed...but... */
-                       volatile unsigned long delay;
-                       for (delay=0; delay < 2000000; delay++)
-                               ;
-               } else {
-                       return ch;
-               }
-       }
-}
-
 void udbg_init_xen(void)
 {
        ulong __console_mfn = 0;
@@ -142,13 +132,12 @@ void udbg_init_xen(void)
 #endif
        }
 
+       udbg_getc = udbg_getc_xen;
        if (__console_mfn == 0) {
                udbg_putc = udbg_putc_dom0_xen;
-               udbg_getc = udbg_getc_dom0_xen;
                udbg_getc_poll = udbg_getc_poll_dom0_xen;
        } else {
                udbg_putc = udbg_putc_domu_xen;
-               udbg_getc = udbg_getc_domu_xen;
                udbg_getc_poll = udbg_getc_poll_domu_xen;
                intf = (struct xencons_interface *)mfn_to_virt(__console_mfn);
        }
diff -r 4a1f58739bc2 -r 5a609aa8489b include/asm-powerpc/xen/asm/hypercall.h
--- a/include/asm-powerpc/xen/asm/hypercall.h   Tue Sep 12 15:53:01 2006 -0500
+++ b/include/asm-powerpc/xen/asm/hypercall.h   Thu Sep 14 22:35:58 2006 -0400
@@ -48,6 +48,9 @@ extern int HYPERVISOR_multicall(void *ca
 extern int HYPERVISOR_multicall(void *call_list, int nr_calls);
 
 extern int HYPERVISOR_sched_op(int cmd, void *arg);
+extern int HYPERVISOR_poll(
+       evtchn_port_t *ports, unsigned int nr_ports, u64 timeout);
+
 static inline int HYPERVISOR_shutdown(unsigned int reason)
 {
        struct sched_shutdown sched_shutdown = {
@@ -61,6 +64,4 @@ static inline int HYPERVISOR_set_timer_o
 {
        return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_set_timer_op), arg);
 }
-
-
 #endif /*  __HYPERCALL_H__ */

_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@lists.xensource.com
http://lists.xensource.com/xen-ppc-devel

Reply via email to