Index: arch/mips32/include/drivers/arc.h
===================================================================
--- arch/mips32/include/drivers/arc.h	(revision b00fdde560b3ef069ecb5aed3e0f1e04f21fe28a)
+++ arch/mips32/include/drivers/arc.h	(revision 939dfd70a7a0f73670ee999422ddeae17ecdd0f0)
@@ -34,4 +34,6 @@
 #define ARC_BASE_ADDR 0x1000;
 #define ARC_MAGIC 0x53435241
+/* Frame size used by ARC */
+#define ARC_FRAME 4096
 
 typedef enum {
@@ -208,5 +210,5 @@
 }__attribute__ ((packed)) arc_sbp;
 
-extern int init_arc(void);
+extern int arc_init(void);
 extern void arc_print_memory_map(void);
 extern int arc_enabled(void);
@@ -214,3 +216,5 @@
 extern void arc_print_devices(void);
 extern int arc_getchar(void);
+void arc_frame_init(void);
+
 #endif
Index: arch/mips32/include/mm/memory_init.h
===================================================================
--- arch/mips32/include/mm/memory_init.h	(revision b00fdde560b3ef069ecb5aed3e0f1e04f21fe28a)
+++ arch/mips32/include/mm/memory_init.h	(revision 939dfd70a7a0f73670ee999422ddeae17ecdd0f0)
@@ -32,6 +32,8 @@
 #include <config.h>
 
+/* When this function is called, we do not have ARC initiated
+ * - provide some reasonable minimum and update it later
+ */
 #define get_memory_size()	CONFIG_MEMORY_SIZE
-//#define get_memory_size()	150*1024*1024
 
 #endif
Index: arch/mips32/src/drivers/arc.c
===================================================================
--- arch/mips32/src/drivers/arc.c	(revision b00fdde560b3ef069ecb5aed3e0f1e04f21fe28a)
+++ arch/mips32/src/drivers/arc.c	(revision 939dfd70a7a0f73670ee999422ddeae17ecdd0f0)
@@ -32,4 +32,6 @@
 #include <arch.h>
 #include <arch/byteorder.h>
+#include <arch/mm/frame.h>
+#include <mm/frame.h>
 
 /* This is a good joke, SGI HAS different types than NT bioses... */
@@ -102,5 +104,5 @@
  * @return 0 - ARC OK, -1 - ARC does not exist
  */
-int init_arc(void)
+int arc_init(void)
 {
 	if (sbp->signature != ARC_MAGIC) {
@@ -166,6 +168,6 @@
 	while (desc) {
 		printf("%s: %d (size: %dKB)\n",basetypes[desc->type],
-		       desc->basepage * 4096,
-		       desc->basecount*4);
+		       desc->basepage * ARC_FRAME,
+		       desc->basecount*ARC_FRAME/1024);
 		desc = arc_entry->getmemorydescriptor(desc);
 	}
@@ -203,2 +205,26 @@
 	return ch;
 }
+
+/* Initialize frame zones from ARC firmware. 
+ * In the future we may use even the FirmwareTemporary regions,
+ * currently we use the FreeMemory (what about the LoadedProgram?)
+ */
+void arc_frame_init(void)
+{
+	arc_memdescriptor_t *desc;
+	int total = 0;
+
+	desc = arc_entry->getmemorydescriptor(NULL);
+	while (desc) {
+		if (desc->type == FreeMemory ||
+		    desc->type == FreeContiguous) {
+			total += desc->basecount*ARC_FRAME;
+			zone_create_in_region(desc->basepage*ARC_FRAME,
+					      desc->basecount*ARC_FRAME);
+		}
+		desc = arc_entry->getmemorydescriptor(desc);
+	}
+
+	config.memory_size = total;
+}
+
Index: arch/mips32/src/mips32.c
===================================================================
--- arch/mips32/src/mips32.c	(revision b00fdde560b3ef069ecb5aed3e0f1e04f21fe28a)
+++ arch/mips32/src/mips32.c	(revision 939dfd70a7a0f73670ee999422ddeae17ecdd0f0)
@@ -56,5 +56,5 @@
 	interrupts_disable();
 
-	init_arc();
+	arc_init();
 
 	/* Copy the exception vectors to the right places */
Index: arch/mips32/src/mm/frame.c
===================================================================
--- arch/mips32/src/mm/frame.c	(revision b00fdde560b3ef069ecb5aed3e0f1e04f21fe28a)
+++ arch/mips32/src/mm/frame.c	(revision 939dfd70a7a0f73670ee999422ddeae17ecdd0f0)
@@ -34,7 +34,21 @@
 #include <panic.h>
 #include <print.h>
+#include <arch/drivers/arc.h>
 
+/** Create memory zones
+ *
+ * If ARC is known, read information from ARC, otherwise
+ * assume some defaults. 
+ * - blacklist first FRAME because there is an exception vector
+ */
 void frame_arch_init(void)
 {
-        zone_create_in_region(KA2PA(KERNEL_LOAD_ADDRESS), config.memory_size & ~(FRAME_SIZE-1));
+	/* Blacklist first 4KB, exception vector */
+	frame_region_not_free(0, FRAME_SIZE);
+
+	if (arc_enabled())
+		arc_frame_init();
+	else
+		zone_create_in_region(KA2PA(KERNEL_LOAD_ADDRESS),
+				      config.memory_size & ~(FRAME_SIZE-1));
 }
