Index: kernel/arch/ppc32/include/arch/interrupt.h
===================================================================
--- kernel/arch/ppc32/include/arch/interrupt.h	(revision 17af882f644f6d312e05f3965cef1fececb99062)
+++ kernel/arch/ppc32/include/arch/interrupt.h	(revision 0c91cff933f97a7076e264d09bcbd815027707cd)
@@ -49,5 +49,6 @@
 #define VECTOR_DTLB_MISS_STORE      15
 
-extern void start_decrementer(void);
+extern void decrementer_start(uint32_t);
+extern void decrementer_restart(void);
 extern void interrupt_init(void);
 extern void extint_handler(unsigned int, istate_t *);
Index: kernel/arch/ppc32/src/interrupt.c
===================================================================
--- kernel/arch/ppc32/src/interrupt.c	(revision 17af882f644f6d312e05f3965cef1fececb99062)
+++ kernel/arch/ppc32/src/interrupt.c	(revision 0c91cff933f97a7076e264d09bcbd815027707cd)
@@ -38,5 +38,4 @@
 #include <typedefs.h>
 #include <arch.h>
-#include <time/clock.h>
 #include <ipc/sysipc.h>
 #include <arch/drivers/pic.h>
@@ -46,9 +45,17 @@
 #include <log.h>
 
-void start_decrementer(void)
+static uint32_t decrementer_value;
+
+void decrementer_start(uint32_t val)
+{
+	decrementer_value = val;
+	decrementer_restart();
+}
+
+void decrementer_restart(void)
 {
 	asm volatile (
 		"mtdec %[dec]\n"
-		:: [dec] "r" (1000)
+		:: [dec] "r" (decrementer_value)
 	);
 }
@@ -140,5 +147,5 @@
 static void exception_decrementer(unsigned int n, istate_t *istate)
 {
-	start_decrementer();
+	decrementer_restart();
 	clock();
 }
Index: kernel/arch/ppc32/src/ppc32.c
===================================================================
--- kernel/arch/ppc32/src/ppc32.c	(revision 17af882f644f6d312e05f3965cef1fececb99062)
+++ kernel/arch/ppc32/src/ppc32.c	(revision 0c91cff933f97a7076e264d09bcbd815027707cd)
@@ -47,4 +47,5 @@
 #include <mm/page.h>
 #include <mm/km.h>
+#include <time/clock.h>
 #include <abi/proc/uarg.h>
 #include <console/console.h>
@@ -99,6 +100,25 @@
 	interrupt_init();
 	
+	ofw_tree_node_t *cpus_node;
+	ofw_tree_node_t *cpu_node;
+	ofw_tree_property_t *freq_prop;
+
+	cpus_node = ofw_tree_lookup("/cpus");
+	if (!cpus_node)
+		panic("Could not find cpus node.");
+
+	cpu_node = cpus_node->child;
+	if (!cpu_node)
+		panic("Could not find first cpu.");	
+
+	freq_prop = ofw_tree_getprop(cpu_node, "clock-frequency");
+	if (!freq_prop)
+		panic("Could not get frequency property.");
+
+	uint32_t freq;
+	freq = *((uint32_t *) freq_prop->value);
+
 	/* Start decrementer */
-	start_decrementer();
+	decrementer_start(freq / HZ);
 }
 
