Index: boot/arch/arm32/Makefile.inc
===================================================================
--- boot/arch/arm32/Makefile.inc	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/arm32/Makefile.inc	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -107,3 +107,4 @@
 	generic/src/gzip.c \
 	generic/src/tar.c \
+	generic/src/kernel.c \
 	generic/src/payload.c
Index: boot/arch/arm32/src/main.c
===================================================================
--- boot/arch/arm32/src/main.c	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/arm32/src/main.c	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -50,4 +50,5 @@
 #include <arch/cp15.h>
 #include <payload.h>
+#include <kernel.h>
 
 static void clean_dcache_poc(void *address, size_t size)
@@ -104,6 +105,8 @@
 	clean_dcache_poc(boot_pt, PTL0_ENTRIES * PTL0_ENTRY_SIZE);
 
+	uintptr_t entry = check_kernel((void *) PA2KA(BOOT_OFFSET));
+
 	printf("Booting the kernel...\n");
-	jump_to_kernel((void *) PA2KA(BOOT_OFFSET), &bootinfo);
+	jump_to_kernel((void *) entry, &bootinfo);
 }
 
Index: boot/arch/ia64/Makefile.inc
===================================================================
--- boot/arch/ia64/Makefile.inc	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/ia64/Makefile.inc	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -61,4 +61,5 @@
 	generic/src/tar.c \
 	generic/src/gzip.c \
+	generic/src/kernel.c \
 	generic/src/payload.c
 
Index: boot/arch/ia64/include/arch/arch.h
===================================================================
--- boot/arch/ia64/include/arch/arch.h	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/ia64/include/arch/arch.h	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -36,4 +36,5 @@
 #define LOADER_ADDRESS  0x4400000
 #define KERNEL_ADDRESS  0x4800000
+#define KERNEL_VADDRESS 0xe000000004800000
 
 #define STACK_SIZE                   8192
Index: boot/arch/ia64/src/main.c
===================================================================
--- boot/arch/ia64/src/main.c	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/ia64/src/main.c	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -44,4 +44,5 @@
 #include <errno.h>
 #include <payload.h>
+#include <kernel.h>
 
 #define DEFAULT_MEMORY_BASE		0x4000000ULL
@@ -182,5 +183,11 @@
 	    (uintptr_t) kernel_start, NULL);
 
-	printf("Booting the kernel ...\n");
-	jump_to_kernel(&bootinfo, kernel_start);
+	uintptr_t entry = check_kernel(kernel_start);
+
+	// FIXME: kernel's entry point is linked at a different address than
+	//        where it is run from.
+	entry = entry - KERNEL_VADDRESS + KERNEL_ADDRESS;
+
+	printf("Booting the kernel at %p...\n", (void *) entry);
+	jump_to_kernel(&bootinfo, (void *) entry);
 }
Index: boot/arch/mips32/Makefile.inc
===================================================================
--- boot/arch/mips32/Makefile.inc	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/mips32/Makefile.inc	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -88,3 +88,4 @@
 	generic/src/gzip.c \
 	generic/src/tar.c \
+	generic/src/kernel.c \
 	generic/src/payload.c
Index: boot/arch/mips32/src/main.c
===================================================================
--- boot/arch/mips32/src/main.c	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/mips32/src/main.c	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -40,4 +40,5 @@
 #include <errno.h>
 #include <payload.h>
+#include <kernel.h>
 
 static bootinfo_t *bootinfo = (bootinfo_t *) PA2KA(BOOTINFO_OFFSET);
@@ -78,5 +79,7 @@
 	}
 
-	printf("Booting the kernel ... \n");
-	jump_to_kernel((void *) PA2KA(BOOT_OFFSET), bootinfo);
+	uintptr_t entry = check_kernel(kernel_start);
+
+	printf("Booting the kernel...\n");
+	jump_to_kernel((void *) entry, bootinfo);
 }
Index: boot/arch/ppc32/Makefile.inc
===================================================================
--- boot/arch/ppc32/Makefile.inc	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/ppc32/Makefile.inc	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -76,3 +76,4 @@
 	generic/src/gzip.c \
 	generic/src/tar.c \
+	generic/src/kernel.c \
 	generic/src/payload.c
Index: boot/arch/ppc32/_link.ld.in
===================================================================
--- boot/arch/ppc32/_link.ld.in	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/ppc32/_link.ld.in	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -6,5 +6,4 @@
 		loader_start = .;
 		*(BOOTSTRAP);
-		*(REALMODE);
 		*(.text);
 	}
Index: boot/arch/ppc32/src/asm.S
===================================================================
--- boot/arch/ppc32/src/asm.S	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/ppc32/src/asm.S	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -152,7 +152,4 @@
 FUNCTION_END(jump_to_kernel)
 
-.section REALMODE, "ax"
-
-.align PAGE_WIDTH
 SYMBOL(real_mode)
 
Index: boot/arch/ppc32/src/main.c
===================================================================
--- boot/arch/ppc32/src/main.c	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/ppc32/src/main.c	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -42,4 +42,5 @@
 #include <errno.h>
 #include <payload.h>
+#include <kernel.h>
 
 #define BALLOC_MAX_SIZE  131072
@@ -68,6 +69,4 @@
 	printf(" %p|%p: real mode trampoline\n", &real_mode, real_mode_pa);
 	printf(" %p|%p: boot info structure\n", &bootinfo, bootinfo_pa);
-	printf(" %p|%p: kernel entry point\n",
-	    (void *) PA2KA(BOOT_OFFSET), (void *) BOOT_OFFSET);
 	printf(" %p|%p: loader entry point\n",
 	    (void *) LOADER_ADDRESS, loader_address_pa);
@@ -144,6 +143,7 @@
 	}
 
+	uintptr_t entry = check_kernel_translated(inflate_base, 0);
+
 	printf("Booting the kernel...\n");
-	jump_to_kernel(bootinfo_pa, transtable_pa, pages, real_mode_pa,
-	    PA2KA(BOOT_OFFSET));
+	jump_to_kernel(bootinfo_pa, transtable_pa, pages, real_mode_pa, entry);
 }
Index: boot/arch/riscv64/Makefile.inc
===================================================================
--- boot/arch/riscv64/Makefile.inc	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/riscv64/Makefile.inc	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -30,5 +30,4 @@
 BFD_OUTPUT = $(BFD_NAME)
 BFD_ARCH = riscv
-BFD = binary
 
 BITS = 64
@@ -51,3 +50,4 @@
 	generic/src/gzip.c \
 	generic/src/tar.c \
+	generic/src/kernel.c \
 	generic/src/payload.c
Index: boot/arch/riscv64/include/arch/asm.h
===================================================================
--- boot/arch/riscv64/include/arch/asm.h	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/riscv64/include/arch/asm.h	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -36,5 +36,5 @@
 extern char pt_page[];
 
-extern _Noreturn void jump_to_kernel(uintptr_t);
+extern _Noreturn void jump_to_kernel(uintptr_t, uintptr_t);
 
 #endif
Index: boot/arch/riscv64/src/asm.S
===================================================================
--- boot/arch/riscv64/src/asm.S	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/riscv64/src/asm.S	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -125,5 +125,6 @@
 	csrw mstatus, t0
 
-	li ra, PA2KA(BOOT_OFFSET)
+	/* Entry point address is in a1. */
+	mv ra, a1
 	csrw mepc, ra
 
Index: boot/arch/riscv64/src/main.c
===================================================================
--- boot/arch/riscv64/src/main.c	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/riscv64/src/main.c	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -42,4 +42,5 @@
 #include <halt.h>
 #include <payload.h>
+#include <kernel.h>
 
 static bootinfo_t bootinfo;
@@ -88,5 +89,7 @@
 	extract_payload(&bootinfo.taskmap, load_addr, end, kernel_addr, NULL);
 
+	uintptr_t entry = check_kernel(load_addr);
+
 	printf("Booting the kernel...\n");
-	jump_to_kernel(PA2KA(&bootinfo));
+	jump_to_kernel(PA2KA(&bootinfo), entry);
 }
Index: boot/arch/sparc64/Makefile.inc
===================================================================
--- boot/arch/sparc64/Makefile.inc	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/sparc64/Makefile.inc	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -72,3 +72,4 @@
 	generic/src/gzip.c \
 	generic/src/tar.c \
+	generic/src/kernel.c \
 	generic/src/payload.c
Index: boot/arch/sparc64/src/main.c
===================================================================
--- boot/arch/sparc64/src/main.c	(revision d59718e246e2f30ad97e0364fac7e75455fcb7d1)
+++ boot/arch/sparc64/src/main.c	(revision eec201dc0da41d601ba79f79b51c8f95f25d461e)
@@ -43,4 +43,5 @@
 #include <errno.h>
 #include <payload.h>
+#include <kernel.h>
 
 /* The lowest ID (read from the VER register) of some US3 CPU model */
@@ -257,6 +258,8 @@
 		sun4u_smp();
 
+	uintptr_t entry = check_kernel((void *) KERNEL_ADDRESS);
+
 	printf("Booting the kernel ...\n");
-	jump_to_kernel(bootinfo.physmem_start | BSP_PROCESSOR, &bootinfo, subarch,
-	    (void *) KERNEL_ADDRESS);
-}
+	jump_to_kernel(bootinfo.physmem_start | BSP_PROCESSOR, &bootinfo,
+	    subarch, (void *) entry);
+}
