Index: kernel/arch/amd64/Makefile.inc
===================================================================
--- kernel/arch/amd64/Makefile.inc	(revision 334bf2812cd844f83efc295b39c767c42f7e9107)
+++ kernel/arch/amd64/Makefile.inc	(revision aa2f865441be1b83a9608ea790e30e7fd980c191)
@@ -32,5 +32,5 @@
 
 FPU_NO_CFLAGS = -mno-sse -mno-sse2
-CMN1 = -m64 -mcmodel=large -mno-red-zone -fno-unwind-tables -fno-omit-frame-pointer
+CMN1 = -m64 -mcmodel=kernel -mno-red-zone -fno-unwind-tables -fno-omit-frame-pointer
 GCC_CFLAGS += $(CMN1)
 ICC_CFLAGS += $(CMN1)
Index: kernel/arch/amd64/include/arch/mm/km.h
===================================================================
--- kernel/arch/amd64/include/arch/mm/km.h	(revision 334bf2812cd844f83efc295b39c767c42f7e9107)
+++ kernel/arch/amd64/include/arch/mm/km.h	(revision aa2f865441be1b83a9608ea790e30e7fd980c191)
@@ -38,9 +38,9 @@
 #include <typedefs.h>
 
-#define KM_AMD64_IDENTITY_START		UINT64_C(0xffff800000000000)
-#define KM_AMD64_IDENTITY_SIZE		UINT64_C(0x0000400000000000)
+#define KM_AMD64_IDENTITY_START		UINT64_C(0xffffffff80000000)
+#define KM_AMD64_IDENTITY_SIZE		UINT64_C(0x0000000080000000)
 
-#define KM_AMD64_NON_IDENTITY_START	UINT64_C(0xffffc00000000000)
-#define KM_AMD64_NON_IDENTITY_SIZE	UINT64_C(0x0000400000000000)
+#define KM_AMD64_NON_IDENTITY_START	UINT64_C(0xffff800000000000)
+#define KM_AMD64_NON_IDENTITY_SIZE	UINT64_C(0x00007fff80000000)
 
 extern void km_identity_arch_init(void);
Index: kernel/arch/amd64/include/arch/mm/page.h
===================================================================
--- kernel/arch/amd64/include/arch/mm/page.h	(revision 334bf2812cd844f83efc295b39c767c42f7e9107)
+++ kernel/arch/amd64/include/arch/mm/page.h	(revision aa2f865441be1b83a9608ea790e30e7fd980c191)
@@ -44,11 +44,11 @@
 #ifndef __ASM__
 
-#define KA2PA(x)  (((uintptr_t) (x)) - UINT64_C(0xffff800000000000))
-#define PA2KA(x)  (((uintptr_t) (x)) + UINT64_C(0xffff800000000000))
+#define KA2PA(x)  (((uintptr_t) (x)) - UINT64_C(0xffffffff80000000))
+#define PA2KA(x)  (((uintptr_t) (x)) + UINT64_C(0xffffffff80000000))
 
 #else /* __ASM__ */
 
-#define KA2PA(x)  ((x) - 0xffff800000000000)
-#define PA2KA(x)  ((x) + 0xffff800000000000)
+#define KA2PA(x)  ((x) - 0xffffffff80000000)
+#define PA2KA(x)  ((x) + 0xffffffff80000000)
 
 #endif /* __ASM__ */
Index: kernel/arch/amd64/src/boot/multiboot.S
===================================================================
--- kernel/arch/amd64/src/boot/multiboot.S	(revision 334bf2812cd844f83efc295b39c767c42f7e9107)
+++ kernel/arch/amd64/src/boot/multiboot.S	(revision aa2f865441be1b83a9608ea790e30e7fd980c191)
@@ -428,17 +428,12 @@
 	
 	/* Call arch_pre_main(multiboot_eax, multiboot_ebx) */
-	xorq %rdi, %rdi
 	movl multiboot_eax, %edi
-	xorq %rsi, %rsi
 	movl multiboot_ebx, %esi
-	
-	movabsq $arch_pre_main, %rax
-	callq *%rax
-	
+	callq arch_pre_main
+
 	long_status $status_main
 	
 	/* Call main_bsp() */
-	movabsq $main_bsp, %rax
-	call *%rax
+	callq main_bsp 
 	
 	/* Not reached */
@@ -638,5 +633,9 @@
 	.quad ptl_2_6g + (PTL_WRITABLE | PTL_PRESENT)
 	.quad ptl_2_7g + (PTL_WRITABLE | PTL_PRESENT)
-	.fill 504, 8, 0
+	.fill 502, 8, 0
+	/* Mapping of [0; 2G) at -2G */
+	.quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT)
+	.quad ptl_2_1g + (PTL_WRITABLE | PTL_PRESENT)
+
 
 .align 4096
@@ -644,7 +643,6 @@
 ptl_0:
 	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
-	.fill 255, 8, 0
+	.fill 510, 8, 0
 	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
-	.fill 255, 8, 0
 
 .section K_DATA_START, "aw", @progbits
Index: kernel/arch/amd64/src/boot/multiboot2.S
===================================================================
--- kernel/arch/amd64/src/boot/multiboot2.S	(revision 334bf2812cd844f83efc295b39c767c42f7e9107)
+++ kernel/arch/amd64/src/boot/multiboot2.S	(revision aa2f865441be1b83a9608ea790e30e7fd980c191)
@@ -244,15 +244,10 @@
 	
 	/* Call arch_pre_main(multiboot_eax, multiboot_ebx) */
-	xorq %rdi, %rdi
 	movl multiboot_eax, %edi
-	xorq %rsi, %rsi
 	movl multiboot_ebx, %esi
-	
-	movabsq $arch_pre_main, %rax
-	callq *%rax
+	callq arch_pre_main 
 	
 	/* Call main_bsp() */
-	movabsq $main_bsp, %rax
-	call *%rax
+	callq main_bsp 
 	
 	/* Not reached */
Index: kernel/arch/amd64/src/mm/km.c
===================================================================
--- kernel/arch/amd64/src/mm/km.c	(revision 334bf2812cd844f83efc295b39c767c42f7e9107)
+++ kernel/arch/amd64/src/mm/km.c	(revision aa2f865441be1b83a9608ea790e30e7fd980c191)
@@ -40,5 +40,5 @@
 {
 	config.identity_base = KM_AMD64_IDENTITY_START;
-	config.identity_size = KM_AMD64_IDENTITY_SIZE;	
+	config.identity_size = KM_AMD64_IDENTITY_SIZE;
 }
 
Index: kernel/genarch/src/mm/page_pt.c
===================================================================
--- kernel/genarch/src/mm/page_pt.c	(revision 334bf2812cd844f83efc295b39c767c42f7e9107)
+++ kernel/genarch/src/mm/page_pt.c	(revision aa2f865441be1b83a9608ea790e30e7fd980c191)
@@ -384,4 +384,15 @@
 	    addr - 1 < base + size - 1;
 	    addr += ptl0_step) {
+		if (GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr))) {
+			ASSERT(overlaps(addr, ptl0_step,
+			    config.identity_base, config.identity_size));
+
+			/*
+			 * This PTL0 entry also maps the kernel identity region,
+			 * so it is already global and initialized.
+			 */
+			continue;
+		}
+
 		uintptr_t l1 = PA2KA(frame_alloc(frames, FRAME_LOWMEM, 0));
 		memsetb((void *) l1, FRAMES2SIZE(frames), 0);
