Index: kernel/arch/mips32/src/mm/frame.c
===================================================================
--- kernel/arch/mips32/src/mm/frame.c	(revision c32a6f3758119c901cf9433296754930e7398907)
+++ kernel/arch/mips32/src/mm/frame.c	(revision 2a513972e478d8d6c6d501f4bc21fa22fbde43f6)
@@ -45,5 +45,5 @@
 
 #define ZERO_PAGE_MASK		TLB_PAGE_MASK_256K
-#define ZERO_FRAMES			16384
+#define ZERO_FRAMES			2048
 #define ZERO_PAGE_WIDTH		18  /* 256K */
 #define ZERO_PAGE_SIZE		(1 << ZERO_PAGE_WIDTH)
@@ -54,4 +54,6 @@
 #define ZERO_PAGE_VALUE		(((volatile uint32_t *) ZERO_PAGE_ADDR)[ZERO_PAGE_OFFSET])
 
+#define ZERO_PAGE_VALUE_KSEG1(frame) (((volatile uint32_t *) (0xa0000000 + (frame << ZERO_PAGE_WIDTH)))[ZERO_PAGE_OFFSET])
+
 #define MAX_REGIONS			32
 
@@ -74,4 +76,5 @@
 static bool frame_available(pfn_t frame)
 {
+#if MACHINE == msim
 	/* MSIM device (dprinter) */
 	if (frame == (KA2PA(MSIM_VIDEORAM) >> ZERO_PAGE_WIDTH))
@@ -81,8 +84,18 @@
 	if (frame == (KA2PA(MSIM_KBD_ADDRESS) >> ZERO_PAGE_WIDTH))
 		return false;
-	
+#endif
+
+#if MACHINE == simics
 	/* Simics device (serial line) */
 	if (frame == (KA2PA(SERIAL_ADDRESS) >> ZERO_PAGE_WIDTH))
 		return false;
+#endif
+
+#if (MACHINE == lgxemul) || (MACHINE == bgxemul)
+	/* gxemul devices */
+	if (overlaps(frame << ZERO_PAGE_WIDTH, ZERO_PAGE_SIZE,
+	    0x10000000, MB2SIZE(256)))
+		return false;
+#endif
 	
 	return true;
@@ -206,4 +219,11 @@
 					if (ZERO_PAGE_VALUE != 0xdeadbeef)
 						avail = false;
+#if (MACHINE == lgxemul) || (MACHINE == bgxemul)
+					else {
+						ZERO_PAGE_VALUE_KSEG1(frame) = 0xaabbccdd;
+						if (ZERO_PAGE_VALUE_KSEG1(frame) != 0xaabbccdd)
+							avail = false;
+					}
+#endif
 				}
 			}
