arch/sparc64/kernel/time.c |   20 ++++++++++++++++++--
 1 files changed, 18 insertions(+), 2 deletions(-)

diff -puN arch/sparc64/kernel/time.c~sparc64_sched_clock arch/sparc64/kernel/time.c
--- 25/arch/sparc64/kernel/time.c~sparc64_sched_clock	2003-08-10 01:24:25.000000000 -0700
+++ 25-akpm/arch/sparc64/kernel/time.c	2003-08-10 01:24:25.000000000 -0700
@@ -415,6 +415,7 @@ unsigned long timer_tick_offset;
 unsigned long timer_tick_compare;
 
 static unsigned long timer_ticks_per_usec_quotient;
+static unsigned long timer_ticks_per_nsec_quotient;
 
 #define TICK_SIZE (tick_nsec / 1000)
 
@@ -1067,12 +1068,18 @@ static struct notifier_block sparc64_cpu
 #endif
 
 /* The quotient formula is taken from the IA64 port. */
+#define SPARC64_USEC_PER_CYC_SHIFT	30UL
+#define SPARC64_NSEC_PER_CYC_SHIFT	30UL
 void __init time_init(void)
 {
 	unsigned long clock = sparc64_init_timers(timer_interrupt);
 
 	timer_ticks_per_usec_quotient =
-		(((1000000UL << 30) +
+		(((1000000UL << SPARC64_USEC_PER_CYC_SHIFT) +
+		  (clock / 2)) / clock);
+
+	timer_ticks_per_nsec_quotient =
+		(((NSEC_PER_SEC << SPARC64_NSEC_PER_CYC_SHIFT) +
 		  (clock / 2)) / clock);
 
 #ifdef CONFIG_CPU_FREQ
@@ -1088,7 +1095,16 @@ static __inline__ unsigned long do_getti
 	ticks += timer_tick_offset;
 	ticks -= timer_tick_compare;
 
-	return (ticks * timer_ticks_per_usec_quotient) >> 30UL;
+	return (ticks * timer_ticks_per_usec_quotient)
+		>> SPARC64_USEC_PER_CYC_SHIFT;
+}
+
+unsigned long long sched_clock(void)
+{
+	unsigned long ticks = tick_ops->get_tick();
+
+	return (ticks * timer_ticks_per_nsec_quotient)
+		>> SPARC64_NSEC_PER_CYC_SHIFT;
 }
 
 int do_settimeofday(struct timespec *tv)

_