Index: arch/sparc64/Makefile.inc
===================================================================
--- arch/sparc64/Makefile.inc	(revision b9b103d37b95962be0d0b96fa9f55fb8cceaca2a)
+++ arch/sparc64/Makefile.inc	(revision 39cb79a9368f38b7f9b04ba422b5d771243ffc17)
@@ -20,3 +20,5 @@
 arch_sources= \
 	src/arch/dummy.s \
-	src/arch/start.S
+	src/arch/start.S \
+	src/arch/sparc64.c
+
Index: arch/sparc64/_link.ld
===================================================================
--- arch/sparc64/_link.ld	(revision b9b103d37b95962be0d0b96fa9f55fb8cceaca2a)
+++ arch/sparc64/_link.ld	(revision 39cb79a9368f38b7f9b04ba422b5d771243ffc17)
@@ -12,5 +12,5 @@
 
 SECTIONS {
-	.image 0x80000000: AT (0x80000000) { 
+	.image 0x4000: AT (0x4000) { 
 		ktext_start = .;
 		*(K_TEXT_START)
@@ -31,5 +31,5 @@
 		LONG(kdata_end - kdata_start);
 		hardcoded_load_address = .;
-		LONG(0x80000000);
+		LONG(0x4000);
 		*(.bss);		/* uninitialized static variables */	
 		*(COMMON); 		/* global variables */
Index: arch/sparc64/src/dummy.s
===================================================================
--- arch/sparc64/src/dummy.s	(revision b9b103d37b95962be0d0b96fa9f55fb8cceaca2a)
+++ arch/sparc64/src/dummy.s	(revision 39cb79a9368f38b7f9b04ba422b5d771243ffc17)
@@ -29,10 +29,6 @@
 .text
 
-.global arch_late_init
-.global arch_post_mm_init
-.global arch_pre_mm_init
 .global asm_delay_loop
 .global before_thread_runs_arch
-.global calibrate_delay_loop
 .global context_restore_arch
 .global context_save_arch
@@ -60,10 +56,6 @@
 .global dummy
 
-arch_late_init:
-arch_post_mm_init:
-arch_pre_mm_init:
 asm_delay_loop:
 before_thread_runs_arch:
-calibrate_delay_loop:
 context_restore_arch:
 context_save_arch:
Index: arch/sparc64/src/sparc64.c
===================================================================
--- arch/sparc64/src/sparc64.c	(revision 39cb79a9368f38b7f9b04ba422b5d771243ffc17)
+++ arch/sparc64/src/sparc64.c	(revision 39cb79a9368f38b7f9b04ba422b5d771243ffc17)
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2005 Jakub Jermar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <arch.h>
+
+void arch_pre_mm_init(void)
+{
+}
+
+void arch_post_mm_init(void)
+{
+}
+
+void arch_late_init(void)
+{
+}
+
+void calibrate_delay_loop(void)
+{
+}
Index: arch/sparc64/src/start.S
===================================================================
--- arch/sparc64/src/start.S	(revision b9b103d37b95962be0d0b96fa9f55fb8cceaca2a)
+++ arch/sparc64/src/start.S	(revision 39cb79a9368f38b7f9b04ba422b5d771243ffc17)
@@ -32,4 +32,26 @@
 kernel_image_start:
 0:
-	b 0b
+	b 1f
 	nop
+
+#
+# This header forces SILO to load the kernel at 0x4000.
+# More precisely, SILO will think this is an old version of Linux.
+#
+.ascii "HdrS"
+.word 0
+.half 0
+
+.align 8
+
+1:
+	set ofw, %l0
+	stx %o4, [%l0]
+
+	call ofw_init
+	nop
+
+2:
+	b 2b
+	nop
+
Index: genarch/include/firmware/ofw/ofw.h
===================================================================
--- genarch/include/firmware/ofw/ofw.h	(revision b9b103d37b95962be0d0b96fa9f55fb8cceaca2a)
+++ genarch/include/firmware/ofw/ofw.h	(revision 39cb79a9368f38b7f9b04ba422b5d771243ffc17)
@@ -34,7 +34,7 @@
 #define MAX_OFW_ARGS	10
 
-typedef __u32 ofw_arg_t;
-typedef __u32 ihandle;
-typedef __u32 phandle;
+typedef __native ofw_arg_t;
+typedef int ihandle;
+typedef int phandle;
 
 /** OpenFirmware command structure
@@ -43,6 +43,6 @@
 typedef struct {
 	const char *service;          /**< Command name */
-	__u32 nargs;                  /**< Number of in arguments */
-	__u32 nret;                   /**< Number of out arguments */
+	__native nargs;               /**< Number of in arguments */
+	__native nret;                /**< Number of out arguments */
 	ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */
 } ofw_args_t;
@@ -54,5 +54,5 @@
 extern void ofw_init(void);
 extern void ofw_done(void);
-extern __address ofw_call(const char *service, const int nargs, const int nret, ...);
+extern __native ofw_call(const char *service, const int nargs, const int nret, ...);
 extern void ofw_putchar(const char ch);
 extern phandle ofw_find_device(const char *name);
Index: genarch/src/firmware/ofw/ofw.c
===================================================================
--- genarch/src/firmware/ofw/ofw.c	(revision b9b103d37b95962be0d0b96fa9f55fb8cceaca2a)
+++ genarch/src/firmware/ofw/ofw.c	(revision 39cb79a9368f38b7f9b04ba422b5d771243ffc17)
@@ -50,9 +50,9 @@
 void ofw_done(void)
 {
-	ofw_call("exit", 0, 0);
+	(void) ofw_call("exit", 0, 0);
 	cpu_halt();
 }
 
-__address ofw_call(const char *service, const int nargs, const int nret, ...)
+__native ofw_call(const char *service, const int nargs, const int nret, ...)
 {
 	va_list list;
@@ -82,15 +82,15 @@
 		return;
 	
-	ofw_call("write", 3, 1, ofw_stdout, &ch, 1);
+	(void) ofw_call("write", 3, 1, ofw_stdout, &ch, 1);
 }
 
 phandle ofw_find_device(const char *name)
 {
-	return ofw_call("finddevice", 1, 1, name);
+	return (phandle) ofw_call("finddevice", 1, 1, name);
 }
 
 int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen)
 {
-	return ofw_call("getprop", 4, 1, device, name, buf, buflen);
+	return (int) ofw_call("getprop", 4, 1, device, name, buf, buflen);
 }
 
