Index: arch/ia32/Makefile.inc
===================================================================
--- arch/ia32/Makefile.inc	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/ia32/Makefile.inc	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -48,4 +48,2 @@
 	arch/boot/memmap.S\
 	arch/fpu_context.c
-
-
Index: arch/ia32/_link.ld
===================================================================
--- arch/ia32/_link.ld	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/ia32/_link.ld	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -1,7 +1,10 @@
 /** IA-32 linker script
  *  
- *  kernel text
- *  kernel data
- *  
+ * umapped section:
+ * 	kernel text
+ * 	kernel data
+ * mapped section:
+ *	kernel text
+ *	kernel data 
  */
 
@@ -10,10 +13,15 @@
 
 SECTIONS {
-    .image 0x8000: AT (0x8000) { 
+    .unmapped 0x8000: AT (0x8000) {
+	unmapped_ktext_start = .;
+	*(K_TEXT_START);
+	unmapped_ktext_end = .;
+	unmapped_kdata_start = .;
+	*(K_DATA_START);
+	unmapped_kdata_end = .;
+    }
+    
+    .mapped (0x80000000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) { 
 	ktext_start = .;
-	*(K_TEXT_START);
-	delta_start = .;
-	*(K_DATA_START);
-	delta_end = .;			
 	*(.text);
 	ktext_end = .;
@@ -28,18 +36,7 @@
     }
 
-    . = ABSOLUTE(hardcoded_ktext_size);
-    .patch_1 : {
-        LONG(ktext_end - ktext_start - (delta_end - delta_start));
-    }
-
-    . = ABSOLUTE(hardcoded_kdata_size);
-    .patch_2 : {
-        LONG(kdata_end - kdata_start + (delta_end - delta_start));
-    }
-
-    . = ABSOLUTE(hardcoded_load_address);
-    .patch_3 : {
-        LONG(0x8000);
-    }
+    _hardcoded_ktext_size = ktext_end - ktext_start + (unmapped_ktext_end - unmapped_ktext_start);
+    _hardcoded_kdata_size = kdata_end - kdata_start + (unmapped_kdata_end - unmapped_kdata_start);
+    _hardcoded_load_address = 0x80008000;
 
 }
Index: arch/ia32/include/mm/page.h
===================================================================
--- arch/ia32/include/mm/page.h	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/ia32/include/mm/page.h	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -35,6 +35,6 @@
 #define PAGE_SIZE	FRAME_SIZE
 
-#define KA2PA(x)	(x)
-#define PA2KA(x)	(x)
+#define KA2PA(x)	((x) - 0x80000000)
+#define PA2KA(x)	((x) + 0x80000000)
 
 struct page_specifier {
Index: arch/ia32/include/mm/vm.h
===================================================================
--- arch/ia32/include/mm/vm.h	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/ia32/include/mm/vm.h	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -32,12 +32,12 @@
 #include <arch/types.h>
 
-#define KERNEL_ADDRESS_SPACE_START_ARCH		(__address) 0x0
-#define KERNEL_ADDRESS_SPACE_END_ARCH		(__address) 0x3fffffff
-#define USER_ADDRESS_SPACE_START_ARCH		(__address) 0x40000000
-#define USER_ADDRESS_SPACE_END_ARCH		(__address) 0xffffffff	
+#define KERNEL_ADDRESS_SPACE_START_ARCH		(__address) 0x80000000
+#define KERNEL_ADDRESS_SPACE_END_ARCH		(__address) 0xffffffff	
+#define USER_ADDRESS_SPACE_START_ARCH		(__address) 0x00000000
+#define USER_ADDRESS_SPACE_END_ARCH		(__address) 0x7fffffff
 
-#define UTEXT_ADDRESS_ARCH	0x40000000
-#define USTACK_ADDRESS_ARCH	0xfffff000
-#define UDATA_ADDRESS_ARCH	0x41000000
+#define UTEXT_ADDRESS_ARCH	0x00001000
+#define USTACK_ADDRESS_ARCH	(0x7fffffffUL-(PAGE_SIZE-1))
+#define UDATA_ADDRESS_ARCH	0x21000000
 
 #endif
Index: arch/ia32/include/pm.h
===================================================================
--- arch/ia32/include/pm.h	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/ia32/include/pm.h	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -138,5 +138,5 @@
 
 extern void gdt_setbase(struct descriptor *d, __address base);
-extern void gdt_setlimit(struct descriptor *d, __address limit);
+extern void gdt_setlimit(struct descriptor *d, __u32 limit);
 
 extern void idt_init(void);
Index: arch/ia32/src/boot/boot.S
===================================================================
--- arch/ia32/src/boot/boot.S	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/ia32/src/boot/boot.S	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -40,6 +40,6 @@
 #
 kernel_image_start:
+	cli
 	call memmap_arch_init
-	cli
 	xorw %ax,%ax
 	movw %ax,%ds
@@ -63,7 +63,38 @@
 	lidt idtr
 
+	#
+	# Here we setup mapping for both the unmapped and mapped sections of the kernel.
+	# For simplicity, we set only one 4M page for 0x00000000 and one for 0x80000000.
+	#
+	movl %cr4, %ecx
+	orl $(1<<4), %ecx
+	movl %ecx, %cr4				# turn PSE on
+	
+	movl $((1<<7)|(1<<0)), %eax
+	movl %eax, page_directory		# mapping 0x00000000 => 0x00000000
+
+	movl $(page_directory+(4096/2)), %edx
+	movl %eax, (%edx)			# mapping 0x80000000 => 0x00000000
+
+	leal page_directory, %eax
+	movl %eax, %cr3
+	
+	# turn on paging
+	movl %cr0, %ebx
+	orl $(1<<31), %ebx
+	movl %ebx, %cr0
+
+	movl $_hardcoded_ktext_size, hardcoded_ktext_size
+	movl $_hardcoded_kdata_size, hardcoded_kdata_size
+	movl $_hardcoded_load_address, hardcoded_load_address
+
 	call main_bsp			# never returns
-	
 
 	cli
 	hlt
+
+.section K_DATA_START
+
+.align 4096
+page_directory:
+	.space 4096, 0
Index: arch/ia32/src/boot/memmap.S
===================================================================
--- arch/ia32/src/boot/memmap.S	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/ia32/src/boot/memmap.S	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -29,10 +29,4 @@
 
 #include <arch/boot/memmap.h>
-
-.global memmap_arch_init
-
-.code16
-.section K_TEXT_START
-
 
 E820_RECORD_SIZE = MEMMAP_E820_RECORD_SIZE
Index: arch/ia32/src/mm/frame.c
===================================================================
--- arch/ia32/src/mm/frame.c	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/ia32/src/mm/frame.c	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -38,9 +38,6 @@
 {
 	if (config.cpu_active == 1) {
-		__u32 kernel_frames_max;
-		
-		kernel_frames_max = ((KERNEL_ADDRESS_SPACE_END+1)/FRAME_SIZE);
-		
-		kernel_frames_free = kernel_frames = frames < kernel_frames_max ? frames : kernel_frames_max;
+		kernel_frames = frames;
+		kernel_frames_free = frames_free;
 		frame_kernel_bitmap = frame_bitmap;
 
Index: arch/ia32/src/mm/page.c
===================================================================
--- arch/ia32/src/mm/page.c	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/ia32/src/mm/page.c	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -54,7 +54,6 @@
 
 	if (config.cpu_active == 1) {
-		dba = frame_alloc(FRAME_KA | FRAME_PANIC);
+		dba = KA2PA(frame_alloc(FRAME_KA | FRAME_PANIC));
 		memsetb(dba, PAGE_SIZE, 0);
-		cpu_write_dba(dba);
 	    
 		bootstrap_dba = dba;
@@ -62,9 +61,13 @@
 		/*
 		 * Identity mapping for all but 0th page.
+		 * PA2KA(identity) mapping for all but 0th page.
 		 */
-		for (i = 1; i < frames; i++)
+		for (i = 1; i < frames; i++) {
 			map_page_to_frame(i * PAGE_SIZE, i * PAGE_SIZE, PAGE_CACHEABLE, 0);
+			map_page_to_frame(PA2KA(i * PAGE_SIZE), i * PAGE_SIZE, PAGE_CACHEABLE, 0);			
+		}
 
 		trap_register(14, page_fault);
+		cpu_write_dba(dba);		
 	}
 	else {
@@ -105,5 +108,7 @@
 	int pde, pte;
 
-	dba = cpu_read_dba();
+//	TODO: map_page_to_frame should take dba as a parameter
+//	dba = cpu_read_dba();
+	dba = bootstrap_dba;
 
 	pde = page >> 22;		/* page directory entry */
@@ -117,5 +122,5 @@
 		 * frame for the page table and clean it.
 		 */
-		newpt = frame_alloc(FRAME_KA);
+		newpt = KA2PA(frame_alloc(FRAME_KA));
 		pd[pde].frame_address = newpt >> 12;
 		memsetb(newpt, PAGE_SIZE, 0);
@@ -124,5 +129,5 @@
 	}
 	if (copy) {
-		newpt = frame_alloc(FRAME_KA);
+		newpt = KA2PA(frame_alloc(FRAME_KA));
 		memcopy(pd[pde].frame_address << 12, newpt, PAGE_SIZE);
 		pd[pde].frame_address = newpt >> 12;
Index: arch/ia32/src/pm.c
===================================================================
--- arch/ia32/src/pm.c	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/ia32/src/pm.c	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -67,15 +67,15 @@
 
 /* gdtr is changed by kmp before next CPU is initialized */
-struct ptr_16_32 gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = (__address) gdt };
-struct ptr_16_32 idtr __attribute__ ((section ("K_DATA_START")))= { .limit = sizeof(idt), .base = (__address) idt };
+struct ptr_16_32 gdtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(gdt), .base = KA2PA((__address) gdt) };
+struct ptr_16_32 idtr __attribute__ ((section ("K_DATA_START"))) = { .limit = sizeof(idt), .base = KA2PA((__address) idt) };
 
 void gdt_setbase(struct descriptor *d, __address base)
 {
-        d->base_0_15 = base & 0xffff;
-        d->base_16_23 = (base >> 16) & 0xff;
-        d->base_24_31 = (base >> 24) & 0xff;
+        d->base_0_15 = KA2PA(base) & 0xffff;
+        d->base_16_23 = (KA2PA(base) >> 16) & 0xff;
+        d->base_24_31 = (KA2PA(base) >> 24) & 0xff;
 }
 
-void gdt_setlimit(struct descriptor *d, __address limit)
+void gdt_setlimit(struct descriptor *d, __u32 limit)
 {
         d->limit_0_15 = limit & 0xffff;
@@ -85,6 +85,6 @@
 void idt_setoffset(struct idescriptor *d, __address offset)
 {
-	d->offset_0_15 = offset & 0xffff;
-	d->offset_16_31 = offset >> 16;
+	d->offset_0_15 = KA2PA(offset) & 0xffff;
+	d->offset_16_31 = KA2PA(offset) >> 16;
 }
 
Index: arch/ia64/include/mm/vm.h
===================================================================
--- arch/ia64/include/mm/vm.h	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/ia64/include/mm/vm.h	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -38,5 +38,5 @@
 
 #define UTEXT_ADDRESS_ARCH	0x0000000000001000
-#define USTACK_ADDRESS_ARCH	0x7ffffffffffff000
+#define USTACK_ADDRESS_ARCH	(0x7fffffffffffffff-(PAGE_SIZE-1))
 #define UDATA_ADDRESS_ARCH	0x0000000001001000
 
Index: arch/mips/include/mm/vm.h
===================================================================
--- arch/mips/include/mm/vm.h	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/mips/include/mm/vm.h	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -38,5 +38,5 @@
 
 #define UTEXT_ADDRESS_ARCH	0x00001000
-#define USTACK_ADDRESS_ARCH	0x7ffff000
+#define USTACK_ADDRESS_ARCH	(0x7fffffff-(PAGE_SIZE-1))
 #define UDATA_ADDRESS_ARCH	0x01001000
 
Index: arch/mips/src/asm.s
===================================================================
--- arch/mips/src/asm.s	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ arch/mips/src/asm.s	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -149,4 +149,9 @@
 	nop
 
+.global memcopy
+memcopy:
+	j _memcopy
+	nop
+
 # THIS IS USERSPACE CODE
 .global utext
Index: doc/AUTHORS
===================================================================
--- doc/AUTHORS	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ doc/AUTHORS	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
Index: include/config.h
===================================================================
--- include/config.h	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ include/config.h	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -33,5 +33,5 @@
 #include <typedefs.h>
 
-#define CONFIG_MEMORY_SIZE	16*1024*1024
+#define CONFIG_MEMORY_SIZE	4*1024*1024
 #define CONFIG_HEAP_SIZE	300*1024
 #define CONFIG_STACK_SIZE	32*1024
Index: src/main/main.c
===================================================================
--- src/main/main.c	(revision 7dcbc0a15d01ecc817038f477547f10fd2937e75)
+++ src/main/main.c	(revision dcbc8be75e5824d4f8c94163799daa1370fbaae0)
@@ -64,5 +64,6 @@
 /*
  * These 'hardcoded' variables will be intialised by
- * the linker with appropriate sizes and addresses.
+ * the linker or the low level assembler code with
+ * appropriate sizes and addresses.
  */
 __address hardcoded_load_address = 0;
@@ -115,5 +116,4 @@
 
 	printf("%s\n%s\n", project, copyright);
-
 	printf("%P: hardcoded_ktext_size=%dK, hardcoded_kdata_size=%dK\n",
 		config.base, hardcoded_ktext_size/1024, hardcoded_kdata_size/1024);
