Index: kernel/arch/sparc64/src/cpu/cpu.c
===================================================================
--- kernel/arch/sparc64/src/cpu/cpu.c	(revision 6ff1f1e849d8a798e3ed34a6dcdd58b2f25b0055)
+++ kernel/arch/sparc64/src/cpu/cpu.c	(revision 45b26dad9e99feac8777a9787b017301df054794)
@@ -36,13 +36,40 @@
 #include <cpu.h>
 #include <arch.h>
+#include <print.h>
 #include <arch/register.h>
-#include <print.h>
-#include <arch/boot/boot.h>
+#include <genarch/ofw/ofw_tree.h>
+#include <arch/types.h>
+#include <arch/drivers/tick.h>
 
+/** Perform sparc64 specific initialization of the processor structure for the current processor. */
 void cpu_arch_init(void)
 {
-	CPU->arch.clock_frequency = bootinfo.processor.clock_frequency;
+	ofw_tree_node_t *node;
+	uint32_t mid;
+	uint32_t clock_frequency = 0;
+	upa_config_t upa_config;
+	
+	upa_config.value = upa_config_read();
+	node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/"), "cpu");
+	while (node) {
+		ofw_tree_property_t *prop;
+		
+		prop = ofw_tree_getprop(node, "upa-portid");
+		if (prop && prop->value) {
+			mid = *((uint32_t *) prop->value);
+			if (mid == upa_config.mid) {
+				prop = ofw_tree_getprop(node, "clock-frequency");
+				if (prop && prop->value)
+					clock_frequency = *((uint32_t *) prop->value);
+			}
+		}
+		node = ofw_tree_find_peer_by_device_type(node, "cpu");
+	}
+
+	CPU->arch.clock_frequency = clock_frequency;
+	tick_init();
 }
 
+/** Read version information from the current processor. */
 void cpu_identify(void)
 {
@@ -50,4 +77,8 @@
 }
 
+/** Print version information for a processor.
+ *
+ * @param m Processor structure of the CPU for which version information is to be printed.
+ */
 void cpu_print_report(cpu_t *m)
 {
Index: kernel/arch/sparc64/src/drivers/tick.c
===================================================================
--- kernel/arch/sparc64/src/drivers/tick.c	(revision 6ff1f1e849d8a798e3ed34a6dcdd58b2f25b0055)
+++ kernel/arch/sparc64/src/drivers/tick.c	(revision 45b26dad9e99feac8777a9787b017301df054794)
@@ -53,5 +53,5 @@
 	interrupt_register(14, "tick_int", tick_interrupt);
 	compare.int_dis = false;
-	compare.tick_cmpr = bootinfo.processor.clock_frequency/HZ;
+	compare.tick_cmpr = CPU->arch.clock_frequency/HZ;
 	tick_compare_write(compare.value);
 	tick_write(0);
Index: kernel/arch/sparc64/src/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sparc64.c	(revision 6ff1f1e849d8a798e3ed34a6dcdd58b2f25b0055)
+++ kernel/arch/sparc64/src/sparc64.c	(revision 45b26dad9e99feac8777a9787b017301df054794)
@@ -38,5 +38,4 @@
 #include <arch/trap/trap.h>
 #include <arch/console.h>
-#include <arch/drivers/tick.h>
 #include <proc/thread.h>
 #include <console/console.h>
@@ -73,5 +72,4 @@
 {
 	trap_init();
-	tick_init();
 }
 
Index: kernel/arch/sparc64/src/start.S
===================================================================
--- kernel/arch/sparc64/src/start.S	(revision 6ff1f1e849d8a798e3ed34a6dcdd58b2f25b0055)
+++ kernel/arch/sparc64/src/start.S	(revision 45b26dad9e99feac8777a9787b017301df054794)
@@ -44,6 +44,7 @@
  * 
  * The registers are expected to be in this state:
- * - %o0 bootinfo structure address
- * - %o1 bootinfo structure size
+ * - %o0 non-zero for the bootstrup processor, zero for application/secondary processors
+ * - %o1 bootinfo structure address
+ * - %o2 bootinfo structure size
  *
  * Moreover, we depend on boot having established the
@@ -56,4 +57,6 @@
 .global kernel_image_start
 kernel_image_start:
+	brz %o0, kernel_image_start		! block secondary processors
+	nop
 
 	/*
@@ -73,6 +76,4 @@
 	 * to the kernel bootinfo structure.
 	 */
-	mov %o1, %o2
-	mov %o0, %o1
 	sethi %hi(bootinfo), %o0
 	call memcpy
