Index: kernel/arch/amd64/include/mm/frame.h
===================================================================
--- kernel/arch/amd64/include/mm/frame.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/amd64/include/mm/frame.h	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup amd64mm	
+/** @addtogroup amd64mm
  * @{
  */
@@ -40,10 +40,9 @@
 #endif /* __ASM__ */
 
-#define FRAME_WIDTH		12	/* 4K */
-#define FRAME_SIZE		(1 << FRAME_WIDTH)
+#define FRAME_WIDTH  12  /* 4K */
+#define FRAME_SIZE   (1 << FRAME_WIDTH)
 
 #ifndef __ASM__
 extern uintptr_t last_frame;
-extern uintptr_t end_frame;
 extern void frame_arch_init(void);
 extern void physmem_print(void);
Index: kernel/arch/amd64/src/mm/page.c
===================================================================
--- kernel/arch/amd64/src/mm/page.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/amd64/src/mm/page.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -35,6 +35,4 @@
 #include <arch/mm/page.h>
 #include <genarch/mm/page_pt.h>
-#include <genarch/drivers/ega/ega.h>
-#include <genarch/drivers/legacy/ia32/io.h>
 #include <arch/mm/frame.h>
 #include <mm/page.h>
@@ -49,9 +47,4 @@
 #include <panic.h>
 #include <align.h>
-#include <ddi/ddi.h>
-
-/** Physical memory area for devices. */
-static parea_t dev_area;
-static parea_t ega_area;
 
 /* Definitions for identity page mapper */
@@ -222,15 +215,4 @@
 }
 
-void hw_area(void)
-{
-	dev_area.pbase = end_frame;
-	dev_area.frames = SIZE2FRAMES(0xfffffffffffff - end_frame);
-	ddi_parea_register(&dev_area);
-	
-	ega_area.pbase = EGA_VIDEORAM;
-	ega_area.frames = SIZE2FRAMES(EGA_VRAM_SIZE);
-	ddi_parea_register(&ega_area);
-}
-
 /** @}
  */
Index: kernel/arch/arm32/include/mm/frame.h
===================================================================
--- kernel/arch/arm32/include/mm/frame.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/arm32/include/mm/frame.h	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup arm32mm	
+/** @addtogroup arm32mm
  * @{
  */
@@ -37,6 +37,6 @@
 #define KERN_arm32_FRAME_H_
 
-#define FRAME_WIDTH		12 /* 4KB frames */
-#define FRAME_SIZE		(1 << FRAME_WIDTH)
+#define FRAME_WIDTH  12  /* 4KB frames */
+#define FRAME_SIZE   (1 << FRAME_WIDTH)
 
 #ifdef KERNEL
@@ -45,6 +45,6 @@
 #include <arch/types.h>
 
-#define BOOT_PAGE_TABLE_SIZE    0x4000
-#define BOOT_PAGE_TABLE_ADDRESS 0x4000
+#define BOOT_PAGE_TABLE_SIZE     0x4000
+#define BOOT_PAGE_TABLE_ADDRESS  0x4000
 
 #define BOOT_PAGE_TABLE_START_FRAME     (BOOT_PAGE_TABLE_ADDRESS >> FRAME_WIDTH)
@@ -52,5 +52,4 @@
 
 extern uintptr_t last_frame;
-extern uintptr_t end_frame;
 
 extern void frame_arch_init(void);
Index: kernel/arch/arm32/src/mm/frame.c
===================================================================
--- kernel/arch/arm32/src/mm/frame.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/arm32/src/mm/frame.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup arm32mm	
+/** @addtogroup arm32mm
  * @{
  */
@@ -42,5 +42,4 @@
 /** Address of the last frame in the memory. */
 uintptr_t last_frame = 0;
-uintptr_t end_frame = 0;
 
 /** Creates memory zones. */
@@ -51,5 +50,4 @@
 	    BOOT_PAGE_TABLE_START_FRAME + BOOT_PAGE_TABLE_SIZE_IN_FRAMES, 0);
 	last_frame = machine_get_memory_size();
-	end_frame = last_frame;
 	
 	/* blacklist boot page table */
Index: kernel/arch/arm32/src/mm/page.c
===================================================================
--- kernel/arch/arm32/src/mm/page.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/arm32/src/mm/page.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -44,8 +44,4 @@
 #include <interrupt.h>
 #include <arch/mm/frame.h>
-#include <ddi/ddi.h>
-
-/** Physical memory area for devices. */
-static parea_t dev_area;
 
 /** Initializes page tables.
@@ -111,11 +107,4 @@
 }
 
-void hw_area(void)
-{
-	dev_area.pbase = end_frame;
-	dev_area.frames = SIZE2FRAMES(0xffffffff - end_frame);
-	ddi_parea_register(&dev_area);
-}
-
 /** @}
  */
Index: kernel/arch/ia32/include/boot/memmap.h
===================================================================
--- kernel/arch/ia32/include/boot/memmap.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/ia32/include/boot/memmap.h	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ia32	
+/** @addtogroup ia32
  * @{
  */
@@ -36,21 +36,26 @@
 #define KERN_ia32_MEMMAP_H_
 
-/* E820h memory range types - other values*/
-	/* Free memory */
-#define MEMMAP_MEMORY_AVAILABLE	1
-	/* Not available for OS */
-#define MEMMAP_MEMORY_RESERVED	2 
-	/* OS may use it after reading ACPI table */
-#define MEMMAP_MEMORY_ACPI	3 
-	/* Unusable, required to be saved and restored across an NVS sleep */
-#define MEMMAP_MEMORY_NVS	4 
-	/* Corrupted memory */
-#define MEMMAP_MEMORY_UNUSABLE	5 
+/* E820h memory range types */
 
-	 /* size of one entry */
-#define MEMMAP_E820_RECORD_SIZE 20 
-	/* maximum entries */
-#define MEMMAP_E820_MAX_RECORDS 32 
+/* Free memory */
+#define MEMMAP_MEMORY_AVAILABLE  1
 
+/* Not available for OS */
+#define MEMMAP_MEMORY_RESERVED   2
+
+/* OS may use it after reading ACPI table */
+#define MEMMAP_MEMORY_ACPI       3
+
+/* Unusable, required to be saved and restored across an NVS sleep */
+#define MEMMAP_MEMORY_NVS        4
+
+/* Corrupted memory */
+#define MEMMAP_MEMORY_UNUSABLE   5
+
+/* Size of one entry */
+#define MEMMAP_E820_RECORD_SIZE  20
+
+/* Maximum entries */
+#define MEMMAP_E820_MAX_RECORDS  32
 
 #ifndef __ASM__
Index: kernel/arch/ia32/include/mm/frame.h
===================================================================
--- kernel/arch/ia32/include/mm/frame.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/ia32/include/mm/frame.h	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ia32mm	
+/** @addtogroup ia32mm
  * @{
  */
@@ -36,6 +36,6 @@
 #define KERN_ia32_FRAME_H_
 
-#define FRAME_WIDTH	12	/* 4K */
-#define FRAME_SIZE	(1 << FRAME_WIDTH)
+#define FRAME_WIDTH  12  /* 4K */
+#define FRAME_SIZE   (1 << FRAME_WIDTH)
 
 #ifdef KERNEL
@@ -45,5 +45,4 @@
 
 extern uintptr_t last_frame;
-extern uintptr_t end_frame;
 
 extern void frame_arch_init(void);
Index: kernel/arch/ia32/src/mm/frame.c
===================================================================
--- kernel/arch/ia32/src/mm/frame.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/ia32/src/mm/frame.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -51,32 +51,60 @@
 
 uintptr_t last_frame = 0;
-uintptr_t end_frame = 0;
 
 static void init_e820_memory(pfn_t minconf)
 {
 	unsigned int i;
-	pfn_t start, conf;
-	size_t size;
-	
 	for (i = 0; i < e820counter; i++) {
+		uint64_t base = e820table[i].base_address;
+		uint64_t size = e820table[i].size;
+		
+#ifdef __32_BITS__
+		
+		/* Ignore physical memory above 4 GB */
+		if ((base >> 32) != 0)
+			continue;
+		
+		/* Clip regions above 4 GB */
+		if (((base + size) >> 32) != 0)
+			size = 0xffffffff - base;
+		
+#endif
+		pfn_t pfn;
+		count_t count;
+		
 		if (e820table[i].type == MEMMAP_MEMORY_AVAILABLE) {
-			start = ADDR2PFN(ALIGN_UP(e820table[i].base_address, FRAME_SIZE));
-			size = SIZE2FRAMES(ALIGN_DOWN(e820table[i].size, FRAME_SIZE));
+			/* To be safe, make available zone possibly smaller */
+			pfn = ADDR2PFN(ALIGN_UP(base, FRAME_SIZE));
+			count = SIZE2FRAMES(ALIGN_DOWN(size, FRAME_SIZE));
 			
-			if ((minconf < start) || (minconf >= start + size))
-				conf = start;
+			pfn_t conf;
+			if ((minconf < pfn) || (minconf >= pfn + count))
+				conf = pfn;
 			else
 				conf = minconf;
 			
-			zone_create(start, size, conf, 0);
+			zone_create(pfn, count, conf, ZONE_AVAILABLE);
 			
-			if (last_frame < ALIGN_UP(e820table[i].base_address +
-			    e820table[i].size, FRAME_SIZE))
-				last_frame =
-				    ALIGN_UP(e820table[i].base_address + e820table[i].size, FRAME_SIZE);
+			// XXX this has to be removed
+			if (last_frame < ALIGN_UP(base + size, FRAME_SIZE))
+				last_frame = ALIGN_UP(base + size, FRAME_SIZE);
+		}
+		
+		if (e820table[i].type == MEMMAP_MEMORY_RESERVED) {
+			/* To be safe, make reserved zone possibly larger */
+			pfn = ADDR2PFN(ALIGN_DOWN(base, FRAME_SIZE));
+			count = SIZE2FRAMES(ALIGN_UP(size, FRAME_SIZE));
+			
+			zone_create(pfn, count, 0, ZONE_RESERVED);
+		}
+		
+		if (e820table[i].type == MEMMAP_MEMORY_ACPI) {
+			/* To be safe, make firmware zone possibly larger */
+			pfn = ADDR2PFN(ALIGN_DOWN(base, (uintptr_t) FRAME_SIZE));
+			count = SIZE2FRAMES(ALIGN_UP(size, (uintptr_t) FRAME_SIZE));
+			
+			zone_create(pfn, count, 0, ZONE_FIRMWARE);
 		}
 	}
-	
-	end_frame = last_frame;
 }
 
Index: kernel/arch/ia32/src/mm/page.c
===================================================================
--- kernel/arch/ia32/src/mm/page.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/ia32/src/mm/page.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -35,6 +35,4 @@
 #include <arch/mm/page.h>
 #include <genarch/mm/page_pt.h>
-#include <genarch/drivers/ega/ega.h>
-#include <genarch/drivers/legacy/ia32/io.h>
 #include <arch/mm/frame.h>
 #include <mm/frame.h>
@@ -51,9 +49,4 @@
 #include <print.h>
 #include <interrupt.h>
-#include <ddi/ddi.h>
-
-/** Physical memory area for devices. */
-static parea_t dev_area;
-static parea_t ega_area;
 
 void page_arch_init(void)
@@ -61,5 +54,5 @@
 	uintptr_t cur;
 	int flags;
-
+	
 	if (config.cpu_active == 1) {
 		page_mapping_operations = &pt_mapping_operations;
@@ -74,10 +67,10 @@
 			page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags);
 		}
-
+		
 		exc_register(14, "page_fault", (iroutine) page_fault);
 		write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
 	} else
 		write_cr3((uintptr_t) AS_KERNEL->genarch.page_table);
-
+	
 	paging_on();
 }
@@ -99,15 +92,4 @@
 	
 	return virtaddr;
-}
-
-void hw_area(void)
-{
-	dev_area.pbase = end_frame;
-	dev_area.frames = SIZE2FRAMES(0xffffffff - end_frame);
-	ddi_parea_register(&dev_area);
-	
-	ega_area.pbase = EGA_VIDEORAM;
-	ega_area.frames = SIZE2FRAMES(EGA_VRAM_SIZE);
-	ddi_parea_register(&ega_area);
 }
 
Index: kernel/arch/ia64/include/mm/frame.h
===================================================================
--- kernel/arch/ia64/include/mm/frame.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/ia64/include/mm/frame.h	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ia64mm	
+/** @addtogroup ia64mm
  * @{
  */
@@ -36,6 +36,6 @@
 #define KERN_ia64_FRAME_H_
 
-#define FRAME_WIDTH		14	/* 16K */
-#define FRAME_SIZE		(1 << FRAME_WIDTH)
+#define FRAME_WIDTH  14  /* 16K */
+#define FRAME_SIZE   (1 << FRAME_WIDTH)
 
 #ifdef KERNEL
@@ -45,5 +45,4 @@
 
 extern uintptr_t last_frame;
-extern uintptr_t end_frame;
 
 extern void frame_arch_init(void);
Index: kernel/arch/ia64/src/mm/frame.c
===================================================================
--- kernel/arch/ia64/src/mm/frame.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/ia64/src/mm/frame.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ia64mm	
+/** @addtogroup ia64mm
  * @{
  */
@@ -52,5 +52,4 @@
 
 uintptr_t last_frame = 0;
-uintptr_t end_frame = 0;
 
 void frame_arch_init(void)
Index: kernel/arch/ia64/src/mm/page.c
===================================================================
--- kernel/arch/ia64/src/mm/page.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/ia64/src/mm/page.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -49,8 +49,4 @@
 #include <memstr.h>
 #include <align.h>
-#include <ddi/ddi.h>
-
-/** Physical memory area for devices. */
-static parea_t dev_area;
 
 static void set_environment(void);
@@ -68,7 +64,7 @@
 {
 	region_register rr;
-	pta_register pta;	
+	pta_register pta;
 	int i;
-#ifdef CONFIG_VHPT	
+#ifdef CONFIG_VHPT
 	uintptr_t vhpt_base;
 #endif
@@ -279,11 +275,4 @@
 }
 
-void hw_area(void)
-{
-	dev_area.pbase = end_frame;
-	dev_area.frames = SIZE2FRAMES(0x7fffffffffffffffUL - end_frame);
-	ddi_parea_register(&dev_area);
-}
-
 /** @}
  */
Index: kernel/arch/mips32/include/mm/frame.h
===================================================================
--- kernel/arch/mips32/include/mm/frame.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/mips32/include/mm/frame.h	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup mips32mm	
+/** @addtogroup mips32mm
  * @{
  */
@@ -47,6 +47,4 @@
 extern void physmem_print(void);
 
-extern uintptr_t end_frame;
-
 #endif /* __ASM__ */
 #endif /* KERNEL */
Index: kernel/arch/mips32/src/mm/frame.c
===================================================================
--- kernel/arch/mips32/src/mm/frame.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/mips32/src/mm/frame.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -65,6 +65,4 @@
 static count_t phys_regions_count = 0;
 static phys_region_t phys_regions[MAX_REGIONS];
-
-uintptr_t end_frame = 0;
 
 
@@ -239,7 +237,5 @@
 	}
 	
-	end_frame = frame;
-	
-	frame_add_region(start_frame, end_frame);
+	frame_add_region(start_frame, frame);
 	
 	/* Blacklist interrupt vector frame */
Index: kernel/arch/mips32/src/mm/page.c
===================================================================
--- kernel/arch/mips32/src/mm/page.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/mips32/src/mm/page.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -37,8 +37,4 @@
 #include <mm/page.h>
 #include <mm/frame.h>
-#include <ddi/ddi.h>
-
-/** Physical memory area for devices. */
-static parea_t dev_area;
 
 void page_arch_init(void)
@@ -56,11 +52,4 @@
 }
 
-void hw_area(void)
-{
-	dev_area.pbase = end_frame;
-	dev_area.frames = SIZE2FRAMES(0xffffffff - end_frame);
-	ddi_parea_register(&dev_area);
-}
-
 /** @}
  */
Index: kernel/arch/ppc32/include/mm/frame.h
===================================================================
--- kernel/arch/ppc32/include/mm/frame.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/ppc32/include/mm/frame.h	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ppc32mm	
+/** @addtogroup ppc32mm
  * @{
  */
@@ -36,6 +36,6 @@
 #define KERN_ppc32_FRAME_H_
 
-#define FRAME_WIDTH		12	/* 4K */
-#define FRAME_SIZE		(1 << FRAME_WIDTH)
+#define FRAME_WIDTH  12  /* 4K */
+#define FRAME_SIZE   (1 << FRAME_WIDTH)
 
 #ifdef KERNEL
@@ -45,5 +45,4 @@
 
 extern uintptr_t last_frame;
-extern uintptr_t end_frame;
 
 extern void frame_arch_init(void);
Index: kernel/arch/ppc32/src/mm/frame.c
===================================================================
--- kernel/arch/ppc32/src/mm/frame.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/ppc32/src/mm/frame.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -41,5 +41,4 @@
 
 uintptr_t last_frame = 0;
-uintptr_t end_frame = 0;
 
 void physmem_print(void)
@@ -77,6 +76,4 @@
 	}
 	
-	end_frame = last_frame;
-	
 	/* First is exception vector, second is 'implementation specific',
 	   third and fourth is reserved, other contain real mode code */
Index: kernel/arch/ppc32/src/mm/page.c
===================================================================
--- kernel/arch/ppc32/src/mm/page.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/ppc32/src/mm/page.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ppc32mm	
+/** @addtogroup ppc32mm
  * @{
  */
@@ -38,8 +38,4 @@
 #include <align.h>
 #include <config.h>
-#include <ddi/ddi.h>
-
-/** Physical memory area for devices. */
-static parea_t dev_area;
 
 void page_arch_init(void)
@@ -68,11 +64,4 @@
 }
 
-void hw_area(void)
-{
-	dev_area.pbase = end_frame;
-	dev_area.frames = SIZE2FRAMES(0xffffffff - end_frame);
-	ddi_parea_register(&dev_area);
-}
-
 /** @}
  */
Index: kernel/arch/sparc64/include/mm/frame.h
===================================================================
--- kernel/arch/sparc64/include/mm/frame.h	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/sparc64/include/mm/frame.h	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -74,5 +74,4 @@
 
 extern uintptr_t last_frame;
-extern uintptr_t end_frame;
 extern void frame_arch_init(void);
 #define physmem_print()
Index: kernel/arch/sparc64/src/mm/frame.c
===================================================================
--- kernel/arch/sparc64/src/mm/frame.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/sparc64/src/mm/frame.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup sparc64mm	
+/** @addtogroup sparc64mm
  * @{
  */
@@ -42,5 +42,4 @@
 
 uintptr_t last_frame = NULL;
-uintptr_t end_frame = NULL;
 
 /** Create memory zones according to information stored in bootinfo.
@@ -81,6 +80,4 @@
 		frame_mark_unavailable(ADDR2PFN(KA2PA(PFN2ADDR(0))), 1);
 	}
-	
-	end_frame = last_frame;
 }
 
Index: kernel/arch/sparc64/src/mm/page.c
===================================================================
--- kernel/arch/sparc64/src/mm/page.c	(revision 5f0f29ce3c25993ee100bdb9354b66dc6b762ae7)
+++ kernel/arch/sparc64/src/mm/page.c	(revision c1f7f6eaa570166428a8687a4e9c7cd839cd666d)
@@ -42,8 +42,4 @@
 #include <align.h>
 #include <config.h>
-#include <ddi/ddi.h>
-
-/** Physical memory area for devices. */
-static parea_t dev_area;
 
 #ifdef CONFIG_SMP
@@ -169,11 +165,4 @@
 }
 
-void hw_area(void)
-{
-	dev_area.pbase = end_frame;
-	dev_area.frames = SIZE2FRAMES(0x7ffffffffff - end_frame);
-	ddi_parea_register(&dev_area);
-}
-
 /** @}
  */
