# HG changeset patch
# User Hollis Blanchard <hollisb@xxxxxxxxxx>
# Node ID 9a758f814f60166dcf4a386bb9835f58c8f68502
# Parent dbc74db14a4b39d359365fcf8257216d968fa269
# Parent 6af601c5ebe192a0de72430cdd94da5ba46ff287
[POWERPC] merge
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>
---
xen/arch/powerpc/boot_of.c | 7 ++++---
xen/arch/powerpc/exceptions.c | 19 +++++++++++++++++--
xen/arch/powerpc/time.c | 2 +-
xen/include/asm-powerpc/time.h | 2 +-
4 files changed, 23 insertions(+), 7 deletions(-)
diff -r dbc74db14a4b -r 9a758f814f60 xen/arch/powerpc/boot_of.c
--- a/xen/arch/powerpc/boot_of.c Tue Dec 12 14:35:07 2006 -0600
+++ b/xen/arch/powerpc/boot_of.c Fri Dec 15 13:37:38 2006 -0600
@@ -1167,6 +1167,7 @@ static int __init boot_of_cpus(void)
s32 cpuid;
u32 cpu_clock[2];
extern uint cpu_hard_id[NR_CPUS];
+ u32 tbf;
/* Look up which CPU we are running on right now and get all info
* from there */
@@ -1181,12 +1182,12 @@ static int __init boot_of_cpus(void)
cpu_node = bootcpu_node;
- result = of_getprop(cpu_node, "timebase-frequency", &timebase_freq,
- sizeof(timebase_freq));
+ result = of_getprop(cpu_node, "timebase-frequency", &tbf, sizeof(tbf));
+ timebase_freq = tbf;
if (result == OF_FAILURE) {
of_panic("Couldn't get timebase frequency!\n");
}
- of_printf("OF: timebase-frequency = %d Hz\n", timebase_freq);
+ of_printf("OF: timebase-frequency = %ld Hz\n", timebase_freq);
result = of_getprop(cpu_node, "clock-frequency",
&cpu_clock, sizeof(cpu_clock));
diff -r dbc74db14a4b -r 9a758f814f60 xen/arch/powerpc/exceptions.c
--- a/xen/arch/powerpc/exceptions.c Tue Dec 12 14:35:07 2006 -0600
+++ b/xen/arch/powerpc/exceptions.c Fri Dec 15 13:37:38 2006 -0600
@@ -35,7 +35,9 @@ extern ulong ppc_do_softirq(ulong orig_m
extern ulong ppc_do_softirq(ulong orig_msr);
extern void do_timer(struct cpu_user_regs *regs);
extern void do_dec(struct cpu_user_regs *regs);
-extern void program_exception(struct cpu_user_regs *regs, unsigned long
cookie);
+extern void program_exception(struct cpu_user_regs *regs,
+ unsigned long cookie);
+extern int reprogram_timer(s_time_t timeout);
int hdec_sample = 0;
@@ -43,7 +45,20 @@ void do_timer(struct cpu_user_regs *regs
{
/* Set HDEC high so it stops firing and can be reprogrammed by
* set_preempt() */
- mthdec(INT_MAX);
+ /* FIXME! HACK ALERT!
+ *
+ * We have a bug in that if we switch domains in schedule() we
+ * switch right away regardless of whatever else is pending. This
+ * means that if the timer goes off while in schedule(), the next
+ * domain will be preempted by the interval defined below. So
+ * until we fix our cotnext_switch(), the follow workaround will
+ * make sure that the domain we switch to does not run for to long
+ * so we can continue to service the other timers in the timer
+ * queue and that the value is long enough to escape this
+ * particular timer event.
+ */
+ reprogram_timer(NOW() + MILLISECS(1));
+
raise_softirq(TIMER_SOFTIRQ);
}
diff -r dbc74db14a4b -r 9a758f814f60 xen/arch/powerpc/time.c
--- a/xen/arch/powerpc/time.c Tue Dec 12 14:35:07 2006 -0600
+++ b/xen/arch/powerpc/time.c Fri Dec 15 13:37:38 2006 -0600
@@ -32,7 +32,7 @@ static int cpu_has_hdec = 1;
static int cpu_has_hdec = 1;
ulong ticks_per_usec;
unsigned long cpu_khz;
-unsigned int timebase_freq;
+s64 timebase_freq;
s_time_t get_s_time(void)
{
diff -r dbc74db14a4b -r 9a758f814f60 xen/include/asm-powerpc/time.h
--- a/xen/include/asm-powerpc/time.h Tue Dec 12 14:35:07 2006 -0600
+++ b/xen/include/asm-powerpc/time.h Fri Dec 15 13:37:38 2006 -0600
@@ -27,7 +27,7 @@
#include <xen/percpu.h>
#include <asm/processor.h>
-extern unsigned int timebase_freq;
+extern s64 timebase_freq;
#define CLOCK_TICK_RATE timebase_freq
#define watchdog_disable() ((void)0)
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|