Index: boot/arch/mips32/_link.ld.in
===================================================================
--- boot/arch/mips32/_link.ld.in	(revision cf538e7f8a69e2cbf42fd5283c5ad34ba51d135f)
+++ boot/arch/mips32/_link.ld.in	(revision 14febed99d983f8eb0e743677bbec7ee7df1e157)
@@ -5,5 +5,5 @@
 	. = 0xbfc00000;
 #elif defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
-	. = 0x80004000;
+	. = 0x80103000;
 #endif
 	.text : {
Index: boot/arch/mips32/include/arch.h
===================================================================
--- boot/arch/mips32/include/arch.h	(revision cf538e7f8a69e2cbf42fd5283c5ad34ba51d135f)
+++ boot/arch/mips32/include/arch.h	(revision 14febed99d983f8eb0e743677bbec7ee7df1e157)
@@ -33,16 +33,11 @@
 #define PAGE_SIZE   (1 << PAGE_WIDTH)
 
+#if defined(MACHINE_msim)
 #define CPUMAP_OFFSET    0x00001000
 #define STACK_OFFSET     0x00002000
 #define BOOTINFO_OFFSET  0x00003000
 #define BOOT_OFFSET      0x00100000
+#define LOADER_OFFSET    0x1fc00000
 
-#if defined(MACHINE_msim)
-#define LOADER_OFFSET    0x1fc00000
-#elif defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
-#define LOADER_OFFSET    0x00004000
-#endif
-
-#if defined(MACHINE_msim)
 #define MSIM_VIDEORAM_ADDRESS  0xb0000000
 #define MSIM_DORDER_ADDRESS    0xb0000100
@@ -50,4 +45,10 @@
 
 #if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
+#define CPUMAP_OFFSET    0x00100000
+#define STACK_OFFSET     0x00101000
+#define BOOTINFO_OFFSET  0x00102000
+#define BOOT_OFFSET      0x00200000
+#define LOADER_OFFSET    0x00103000
+
 #define MALTA_SERIAL     0xb80003f8
 #endif
Index: kernel/arch/mips32/_link.ld.in
===================================================================
--- kernel/arch/mips32/_link.ld.in	(revision cf538e7f8a69e2cbf42fd5283c5ad34ba51d135f)
+++ kernel/arch/mips32/_link.ld.in	(revision 14febed99d983f8eb0e743677bbec7ee7df1e157)
@@ -10,5 +10,11 @@
 #define mips mips
 
+#if defined(MACHINE_msim)
 #define KERNEL_LOAD_ADDRESS 0x80100000
+#endif
+
+#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
+#define KERNEL_LOAD_ADDRESS 0x80200000
+#endif
 
 OUTPUT_ARCH(mips)
Index: kernel/arch/mips32/src/mm/frame.c
===================================================================
--- kernel/arch/mips32/src/mm/frame.c	(revision cf538e7f8a69e2cbf42fd5283c5ad34ba51d135f)
+++ kernel/arch/mips32/src/mm/frame.c	(revision 14febed99d983f8eb0e743677bbec7ee7df1e157)
@@ -239,4 +239,30 @@
 	/* Blacklist interrupt vector frame */
 	frame_mark_unavailable(0, 1);
+
+#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
+	/* Blacklist memory regions used by YAMON.
+	 *
+	 * The YAMON User's Manual vaguely says the following physical addresses
+	 * are taken by YAMON:
+	 *
+	 * 0x1000	YAMON functions
+	 * 0x5000	YAMON code
+	 *
+	 * These addresses overlap with the beginning of the SDRAM so we need to
+	 * make sure they cannot be allocated.
+	 *
+	 * The User's Manual unfortunately does not say where does the SDRAM
+	 * portion used by YAMON end.
+	 *
+	 * Looking into the YAMON 02.21 sources, it looks like the first free
+	 * address is computed dynamically and depends on the size of the YAMON
+	 * image. From the YAMON binary, it appears to be 0xc0d50 or roughly
+	 * 772 KiB for that particular version.
+	 *
+	 * Linux is linked to 1MiB which seems to be a safe bet and a reasonable
+	 * upper bound for memory taken by YAMON. We will use it too.
+	 */
+	frame_mark_unavailable(0, 1024 * 1024 / FRAME_SIZE);
+#endif
 	
 	/* Cleanup */
