Index: kernel/arch/ia64/src/drivers/it.c
===================================================================
--- kernel/arch/ia64/src/drivers/it.c	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/ia64/src/drivers/it.c	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -27,5 +27,5 @@
  */
 
- /** @addtogroup ia64	
+/** @addtogroup ia64	
  * @{
  */
@@ -77,18 +77,15 @@
 	eoi_write(EOI);
 	
-	m=itm_read();
+	m = itm_read();
 	
-	while(1)
-	{
-	
-		c=itc_read();
-		c+=IT_SERVICE_CLOCKS;
+	while (1) {
+		c = itc_read();
+		c += IT_SERVICE_CLOCKS;
 
-		m+=IT_DELTA;
-		if(m-c<0)
-		{
+		m += IT_DELTA;
+		if (m-c<0)
 			CPU->missed_clock_ticks++;
-		}
-		else break;
+		else
+			break;
 	}
 	
@@ -96,11 +93,8 @@
 	srlz_d();				/* propagate changes */
 	
-	
-	
 	clock();
 	poll_keyboard();
 }
 
- /** @}
+/** @}
  */
-
Index: kernel/arch/mips32/include/asm.h
===================================================================
--- kernel/arch/mips32/include/asm.h	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/mips32/include/asm.h	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -67,4 +67,9 @@
 			  uintptr_t entry);
 
+extern ipl_t interrupts_disable(void);
+extern ipl_t interrupts_enable(void);
+extern void interrupts_restore(ipl_t ipl);
+extern ipl_t interrupts_read(void);
+
 #endif
 
Index: kernel/arch/mips32/src/interrupt.c
===================================================================
--- kernel/arch/mips32/src/interrupt.c	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/mips32/src/interrupt.c	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -27,5 +27,5 @@
  */
 
- /** @addtogroup mips32interrupt
+/** @addtogroup mips32interrupt
  * @{
  */
@@ -142,5 +142,5 @@
 }
 
- /** @}
+/** @}
  */
 
Index: kernel/arch/sparc64/include/asm.h
===================================================================
--- kernel/arch/sparc64/include/asm.h	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/sparc64/include/asm.h	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -36,8 +36,10 @@
 #define KERN_sparc64_ASM_H_
 
+#include <arch.h>
 #include <typedefs.h>
 #include <arch/types.h>
 #include <arch/register.h>
 #include <config.h>
+#include <time/clock.h>
 
 /** Read Processor State register.
@@ -336,5 +338,5 @@
 extern void cpu_halt(void);
 extern void cpu_sleep(void);
-extern void asm_delay_loop(uint32_t t);
+extern void asm_delay_loop(const uint32_t usec);
 
 extern uint64_t read_from_ag_g7(void);
Index: kernel/arch/sparc64/include/boot/boot.h
===================================================================
--- kernel/arch/sparc64/include/boot/boot.h	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/sparc64/include/boot/boot.h	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -84,8 +84,13 @@
 
 typedef struct {
+	uint32_t clock_frequency;
+} processor_t;
+
+typedef struct {
 	taskmap_t taskmap;
 	memmap_t memmap;
 	screen_t screen;
 	keyboard_t keyboard;
+	processor_t processor;
 } bootinfo_t;
 
Index: kernel/arch/sparc64/include/cpu.h
===================================================================
--- kernel/arch/sparc64/include/cpu.h	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/sparc64/include/cpu.h	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -53,4 +53,5 @@
 struct cpu_arch {
 	ver_reg_t ver;
+	uint32_t clock_frequency;
 };
 	
Index: kernel/arch/sparc64/include/drivers/tick.h
===================================================================
--- kernel/arch/sparc64/include/drivers/tick.h	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/sparc64/include/drivers/tick.h	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -38,6 +38,4 @@
 #include <typedefs.h>
 
-#define TICK_DELTA        500000
-
 extern void tick_init(void);
 extern void tick_interrupt(int n, istate_t *istate);
Index: kernel/arch/sparc64/src/cpu/cpu.c
===================================================================
--- kernel/arch/sparc64/src/cpu/cpu.c	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/sparc64/src/cpu/cpu.c	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -33,12 +33,14 @@
  */
 
+#include <arch/asm.h>
 #include <cpu.h>
 #include <arch.h>
 #include <arch/register.h>
-#include <arch/asm.h>
 #include <print.h>
+#include <arch/boot/boot.h>
 
 void cpu_arch_init(void)
 {
+	CPU->arch.clock_frequency = bootinfo.processor.clock_frequency;
 }
 
@@ -94,5 +96,6 @@
 	}
 
-	printf("cpu%d: manuf=%s, impl=%s, mask=%d\n", CPU->id, manuf, impl, CPU->arch.ver.mask);
+	printf("cpu%d: manuf=%s, impl=%s, mask=%d (%dMHz)\n",
+		CPU->id, manuf, impl, CPU->arch.ver.mask, CPU->arch.clock_frequency/1000000);
 }
 
Index: kernel/arch/sparc64/src/drivers/tick.c
===================================================================
--- kernel/arch/sparc64/src/drivers/tick.c	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/sparc64/src/drivers/tick.c	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -37,7 +37,12 @@
 #include <arch/asm.h>
 #include <arch/register.h>
+#include <typedefs.h>
+#include <arch/cpu.h>
+#include <arch/boot/boot.h>
+#include <time/clock.h>
+#include <arch.h>
 #include <debug.h>
-#include <time/clock.h>
-#include <typedefs.h>
+
+#define TICK_RESTART_TIME	50	/* Worst case estimate. */
 
 /** Initialize tick interrupt. */
@@ -48,5 +53,5 @@
 	interrupt_register(14, "tick_int", tick_interrupt);
 	compare.int_dis = false;
-	compare.tick_cmpr = TICK_DELTA;
+	compare.tick_cmpr = bootinfo.processor.clock_frequency/HZ;
 	tick_compare_write(compare.value);
 	tick_write(0);
@@ -61,4 +66,5 @@
 {
 	softint_reg_t softint, clear;
+	uint64_t next, compare, start, stop;
 	
 	softint.value = softint_read();
@@ -84,5 +90,13 @@
 	 * Restart counter.
 	 */
-	tick_write(0);
+	compare = CPU->arch.clock_frequency/HZ;
+	start = tick_read();
+	next = start - compare;
+	while (next >= compare - TICK_RESTART_TIME) {
+		next -= compare;
+		CPU->missed_clock_ticks++;
+	}
+	stop = tick_read();
+	tick_write(next + (stop - start));
 	
 	clock();
Index: kernel/arch/sparc64/src/dummy.s
===================================================================
--- kernel/arch/sparc64/src/dummy.s	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/sparc64/src/dummy.s	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -29,5 +29,4 @@
 .text
 
-.global asm_delay_loop
 .global cpu_sleep
 .global fpu_context_restore
@@ -39,5 +38,4 @@
 .global dummy
 
-asm_delay_loop:
 cpu_sleep:
 fpu_context_restore:
Index: kernel/arch/sparc64/src/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sparc64.c	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/sparc64/src/sparc64.c	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -43,4 +43,5 @@
 #include <arch/boot/boot.h>
 #include <arch/arch.h>
+#include <arch/asm.h>
 #include <arch/mm/page.h>
 #include <arch/stack.h>
@@ -90,6 +91,28 @@
 }
 
+/** Calibrate delay loop.
+ *
+ * On sparc64, we implement delay() by waiting for the TICK register to
+ * reach a pre-computed value, as opposed to performing some pre-computed
+ * amount of instructions of known duration. We set the delay_loop_const
+ * to 1 in order to neutralize the multiplication done by delay().
+ */
 void calibrate_delay_loop(void)
 {
+	CPU->delay_loop_const = 1;
+}
+
+/** Wait several microseconds.
+ *
+ * We assume that interrupts are already disabled.
+ *
+ * @param t Microseconds to wait.
+ */
+void asm_delay_loop(const uint32_t usec)
+{
+	uint64_t stop = tick_read() + (uint64_t) usec * (uint64_t) CPU->arch.clock_frequency / 1000000;
+
+	while (tick_read() < stop)
+		;
 }
 
Index: kernel/arch/sparc64/src/start.S
===================================================================
--- kernel/arch/sparc64/src/start.S	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/arch/sparc64/src/start.S	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -61,13 +61,11 @@
 	 */
 
-	flushw				! flush all but the active register window
-	wrpr %g0, 0, %tl		! TL = 0, primary context register is used
-
-	! Disable interrupts and disable 32-bit address masking.
-	rdpr %pstate, %g1
-	and %g1, ~(PSTATE_AM_BIT|PSTATE_IE_BIT), %g1
-	wrpr %g1, 0, %pstate
-
-	wrpr %g0, 0, %pil		! intialize %pil
+	flushw					! flush all but the active register window
+
+	wrpr %g0, 0, %tl			! TL = 0, primary context register is used
+
+	wrpr %g0, PSTATE_PRIV_BIT, %pstate	! Disable interrupts and disable 32-bit address masking.
+
+	wrpr %g0, 0, %pil			! intialize %pil
 
 	/*
Index: kernel/generic/include/arch.h
===================================================================
--- kernel/generic/include/arch.h	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/generic/include/arch.h	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -33,6 +33,6 @@
  */
 
-#ifndef __ARCH_H__
-#define __ARCH_H__
+#ifndef KERN_ARCH_H_
+#define KERN_ARCH_H_
 
 #include <arch/types.h>
@@ -80,9 +80,4 @@
 extern void calibrate_delay_loop(void);
 
-extern ipl_t interrupts_disable(void); 
-extern ipl_t interrupts_enable(void);
-extern void interrupts_restore(ipl_t ipl);
-extern ipl_t interrupts_read(void);
-
 #endif
 
Index: kernel/generic/include/cpu.h
===================================================================
--- kernel/generic/include/cpu.h	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/generic/include/cpu.h	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -33,6 +33,6 @@
  */
 
-#ifndef __CPU_H__
-#define __CPU_H__
+#ifndef KERN_CPU_H_
+#define KERN_CPU_H_
 
 #include <arch/cpu.h>
Index: kernel/generic/include/time/clock.h
===================================================================
--- kernel/generic/include/time/clock.h	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/generic/include/time/clock.h	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -33,6 +33,6 @@
  */
 
-#ifndef __CLOCK_H__
-#define __CLOCK_H__
+#ifndef KERN_CLOCK_H_
+#define KERN_CLOCK_H_
 
 #define HZ		100
Index: kernel/generic/include/time/delay.h
===================================================================
--- kernel/generic/include/time/delay.h	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/generic/include/time/delay.h	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -33,6 +33,6 @@
  */
 
-#ifndef __DELAY_H__
-#define __DELAY_H__
+#ifndef KERN_DELAY_H_
+#define KERN_DELAY_H_
 
 #include <arch/types.h>
Index: kernel/generic/include/time/timeout.h
===================================================================
--- kernel/generic/include/time/timeout.h	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/generic/include/time/timeout.h	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -33,6 +33,6 @@
  */
 
-#ifndef __TIMEOUT_H__
-#define __TIMEOUT_H__
+#ifndef KERN_TIMEOUT_H_
+#define KERN_TIMEOUT_H_
 
 #include <arch/types.h>
Index: kernel/generic/include/typedefs.h
===================================================================
--- kernel/generic/include/typedefs.h	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/generic/include/typedefs.h	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -33,6 +33,6 @@
  */
 
-#ifndef __TYPEDEFS_H__
-#define __TYPEDEFS_H__
+#ifndef KERN_TYPEDEFS_H_
+#define KERN_TYPEDEFS_H_
 
 #define false 0
Index: kernel/generic/src/cpu/cpu.c
===================================================================
--- kernel/generic/src/cpu/cpu.c	(revision 7bb6b065122bb8af8404a0355703e35ee8e56a37)
+++ kernel/generic/src/cpu/cpu.c	(revision 9a5b556abb26634c82cbd3954b0fdb4db62b828e)
@@ -110,5 +110,5 @@
 }
 
- /** @}
+/** @}
  */
 
