# HG changeset patch
# User Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
# 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 <jimix@xxxxxxxxxxxxxx>
---
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@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|