Index: boot/arch/mips32/Makefile.inc
===================================================================
--- boot/arch/mips32/Makefile.inc	(revision 5c1b3cdf711ad251494bf421532d7e53ecd912ee)
+++ boot/arch/mips32/Makefile.inc	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
@@ -29,24 +29,25 @@
 BFD_ARCH = mips
 BITS = 32
-EXTRA_CFLAGS = -msoft-float -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mips3 -mabi=32
+EXTRA_CFLAGS = -msoft-float -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mabi=32
 
-RD_SRVS_NON_ESSENTIAL += \
-	$(USPACE_PATH)/srv/bd/gxe_bd/gxe_bd
-
-ifeq ($(MACHINE),lgxemul)
-	BFD_NAME = elf32-tradlittlemips
-	BFD_OUTPUT = ecoff-littlemips
-	ENDIANESS = LE
-endif
-ifeq ($(MACHINE),bgxemul)
-	BFD_NAME = elf32-tradbigmips
-	BFD_OUTPUT = ecoff-bigmips
-	ENDIANESS = BE
-endif
 ifeq ($(MACHINE),msim)
 	BFD_NAME = elf32-tradlittlemips
 	BFD_OUTPUT = binary
 	ENDIANESS = LE
+	EXTRA_CFLAGS += -march=r4000
 endif
+ifeq ($(MACHINE),lmalta)
+	BFD_NAME = elf32-tradlittlemips
+	BFD_OUTPUT = elf32-tradlittlemips 
+	ENDIANESS = LE
+	EXTRA_CFLAGS += -march=4kc
+endif
+ifeq ($(MACHINE),bmalta)
+	BFD_NAME = elf32-tradbigmips
+	BFD_OUTPUT = elf32-tradbigmips 
+	ENDIANESS = BE
+	EXTRA_CFLAGS += -march=4kc
+endif
+
 
 SOURCES = \
Index: boot/arch/mips32/_link.ld.in
===================================================================
--- boot/arch/mips32/_link.ld.in	(revision 5c1b3cdf711ad251494bf421532d7e53ecd912ee)
+++ boot/arch/mips32/_link.ld.in	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
@@ -2,5 +2,9 @@
 
 SECTIONS {
+#if defined(MACHINE_msim)
 	. = 0xbfc00000;
+#elif defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
+	. = 0x80103000;
+#endif
 	.text : {
 		*(BOOTSTRAP);
Index: boot/arch/mips32/include/arch.h
===================================================================
--- boot/arch/mips32/include/arch.h	(revision 5c1b3cdf711ad251494bf421532d7e53ecd912ee)
+++ boot/arch/mips32/include/arch.h	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
@@ -33,4 +33,5 @@
 #define PAGE_SIZE   (1 << PAGE_WIDTH)
 
+#if defined(MACHINE_msim)
 #define CPUMAP_OFFSET    0x00001000
 #define STACK_OFFSET     0x00002000
@@ -41,7 +42,21 @@
 #define MSIM_VIDEORAM_ADDRESS  0xb0000000
 #define MSIM_DORDER_ADDRESS    0xb0000100
+#endif
+
+#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 YAMON_SUBR_BASE		PA2KA(0x1fc00500)
+#define YAMON_SUBR_PRINT_COUNT	(YAMON_SUBR_BASE + 0x4)
+#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/include/types.h
===================================================================
--- boot/arch/mips32/include/types.h	(revision 5c1b3cdf711ad251494bf421532d7e53ecd912ee)
+++ boot/arch/mips32/include/types.h	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
@@ -47,4 +47,7 @@
 
 typedef struct {
+#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
+	uint32_t sdram_size;
+#endif
 	uint32_t cpumap;
 	size_t cnt;
Index: boot/arch/mips32/src/asm.S
===================================================================
--- boot/arch/mips32/src/asm.S	(revision 5c1b3cdf711ad251494bf421532d7e53ecd912ee)
+++ boot/arch/mips32/src/asm.S	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
@@ -51,4 +51,12 @@
 	and $a0, $a1, $a0
 	mtc0 $a0, $status
+
+#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
+	/*
+	 * Remember the size of the SDRAM in bootinfo.
+	 */
+	la $a0, PA2KA(BOOTINFO_OFFSET)
+	sw $a3, 0($a0)
+#endif
 	
 	/*
Index: boot/arch/mips32/src/main.c
===================================================================
--- boot/arch/mips32/src/main.c	(revision 5c1b3cdf711ad251494bf421532d7e53ecd912ee)
+++ boot/arch/mips32/src/main.c	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
@@ -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 5c1b3cdf711ad251494bf421532d7e53ecd912ee)
+++ boot/arch/mips32/src/putchar.c	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
@@ -32,9 +32,36 @@
 #include <str.h>
 
+#ifdef PUTCHAR_ADDRESS
+#undef PUTCHAR_ADDRESS
+#endif
+
+#if defined(MACHINE_msim)
+#define _putchar(ch)	msim_putchar((ch))
+static void msim_putchar(const wchar_t ch)
+{
+	*((char *) MSIM_VIDEORAM_ADDRESS) = ch;
+}
+#endif
+
+#if defined(MACHINE_lmalta) || defined(MACHINE_bmalta)
+#define _putchar(ch)	yamon_putchar((ch))
+typedef void (**yamon_print_count_ptr_t)(uint32_t, const char *, uint32_t);
+yamon_print_count_ptr_t yamon_print_count =
+    (yamon_print_count_ptr_t) YAMON_SUBR_PRINT_COUNT;
+
+static void yamon_putchar(const wchar_t wch)
+{
+	const char ch = (char) wch;
+
+	(*yamon_print_count)(0, &ch, 1);
+}
+#endif
+
 void putchar(const wchar_t ch)
 {
 	if (ascii_check(ch))
-		*((char *) MSIM_VIDEORAM_ADDRESS) = ch;
+		_putchar(ch);
 	else
-		*((char *) MSIM_VIDEORAM_ADDRESS) = U_SPECIAL;
+		_putchar(U_SPECIAL);
 }
+
