Index: boot/arch/mips32/_link.ld.in
===================================================================
--- boot/arch/mips32/_link.ld.in	(revision 232cd4f80cf97c780667bf57b298508cd538ea7b)
+++ boot/arch/mips32/_link.ld.in	(revision 295732b939193c726eec72dc703411ec78b675ff)
@@ -2,5 +2,9 @@
 
 SECTIONS {
+#if defined(MACHINE_msim)
 	. = 0xbfc00000;
+#elif defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
+	. = 0x80004000;
+#endif
 	.text : {
 		*(BOOTSTRAP);
Index: boot/arch/mips32/include/arch.h
===================================================================
--- boot/arch/mips32/include/arch.h	(revision 232cd4f80cf97c780667bf57b298508cd538ea7b)
+++ boot/arch/mips32/include/arch.h	(revision 295732b939193c726eec72dc703411ec78b675ff)
@@ -37,11 +37,24 @@
 #define BOOTINFO_OFFSET  0x00003000
 #define BOOT_OFFSET      0x00100000
+
+#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
+#endif
+
+#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
+#define MALTA_SERIAL     0xb80003f8
+#endif
 
 #ifndef __ASM__
 	#define PA2KA(addr)    (((uintptr_t) (addr)) + 0x80000000)
+	#define PA2KSEG(addr)  (((uintptr_t) (addr)) + 0xa0000000)
+	#define KA2PA(addr)    (((uintptr_t) (addr)) - 0x80000000)
 	#define KSEG2PA(addr)  (((uintptr_t) (addr)) - 0xa0000000)
 #else
Index: boot/arch/mips32/src/main.c
===================================================================
--- boot/arch/mips32/src/main.c	(revision 232cd4f80cf97c780667bf57b298508cd538ea7b)
+++ boot/arch/mips32/src/main.c	(revision 295732b939193c726eec72dc703411ec78b675ff)
@@ -65,6 +65,9 @@
 	for (i = 0; i < COMPONENTS; i++)
 		printf(" %p|%p: %s image (%zu/%zu bytes)\n", components[i].start,
-		    (void *) KSEG2PA(components[i].start), components[i].name,
-		    components[i].inflated, components[i].size);
+		    (uintptr_t) components[i].start >= PA2KSEG(0) ?
+		    (void *) KSEG2PA(components[i].start) :
+		    (void *) KA2PA(components[i].start),
+		    components[i].name, components[i].inflated,
+		    components[i].size);
 	
 	void *dest[COMPONENTS];
@@ -93,4 +96,5 @@
 	
 	for (i = cnt; i > 0; i--) {
+#ifdef MACHINE_msim
 		void *tail = dest[i - 1] + components[i].inflated;
 		if (tail >= ((void *) PA2KA(LOADER_OFFSET))) {
@@ -99,4 +103,5 @@
 			halt();
 		}
+#endif
 		
 		printf("%s ", components[i - 1].name);
Index: boot/arch/mips32/src/putchar.c
===================================================================
--- boot/arch/mips32/src/putchar.c	(revision 232cd4f80cf97c780667bf57b298508cd538ea7b)
+++ boot/arch/mips32/src/putchar.c	(revision 295732b939193c726eec72dc703411ec78b675ff)
@@ -32,9 +32,22 @@
 #include <str.h>
 
+#ifdef PUTCHAR_ADDRESS
+#undef PUTCHAR_ADDRESS
+#endif
+
+#if defined(MACHINE_msim)
+#define PUTCHAR_ADDRESS MSIM_VIDEORAM_ADDRESS
+#endif
+
+#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
+#define PUTCHAR_ADDRESS MALTA_SERIAL
+#endif
+
 void putchar(const wchar_t ch)
 {
 	if (ascii_check(ch))
-		*((char *) MSIM_VIDEORAM_ADDRESS) = ch;
+		*((char *) PUTCHAR_ADDRESS) = ch;
 	else
-		*((char *) MSIM_VIDEORAM_ADDRESS) = U_SPECIAL;
+		*((char *) PUTCHAR_ADDRESS) = U_SPECIAL;
 }
+
