Index: arch/amd64/include/pm.h
===================================================================
--- arch/amd64/include/pm.h	(revision 6d7ffa6500ff049f534738d13b952fc159242a8d)
+++ arch/amd64/include/pm.h	(revision 1a675955a140a3b614cb1280dfa395e1f3f1a12a)
@@ -147,4 +147,5 @@
 extern struct ptr_16_64 gdtr;
 extern struct ptr_16_32 real_bootstrap_gdtr;
+extern struct ptr_16_32 protected_bootstrap_gdtr;
 
 extern void pm_init(void);
Index: arch/amd64/src/boot/boot.S
===================================================================
--- arch/amd64/src/boot/boot.S	(revision 6d7ffa6500ff049f534738d13b952fc159242a8d)
+++ arch/amd64/src/boot/boot.S	(revision 1a675955a140a3b614cb1280dfa395e1f3f1a12a)
@@ -50,4 +50,5 @@
 .code16
 .global kernel_image_start
+.global multiboot_image_start
 kernel_image_start:
 	cli
@@ -96,5 +97,18 @@
 multiboot_image_start:
 	movl $START_STACK, %esp				# initialize stack pointer
-	# FIXME TODO
+	
+	lgdt protected_bootstrap_gdtr + BOOT_OFFSET		# initialize Global Descriptor Table register
+
+	movw $gdtselector(KDATA_DES), %cx
+	movw %cx, %es
+	movw %cx, %gs
+	movw %cx, %fs
+	movw %cx, %ds							# kernel data + stack
+	movw %cx, %ss
+	
+	jmpl $gdtselector(KTEXT_DES), $multiboot_meeting_point + BOOT_OFFSET
+	multiboot_meeting_point:
+	
+	hlt
 
 # Protected 32-bit. We want to reuse the code-seg descriptor,
@@ -209,2 +223,7 @@
 	.word gdtselector(GDT_ITEMS)
 	.long KA2PA(gdt)-BOOT_OFFSET
+
+.global protected_bootstrap_gdtr
+protected_bootstrap_gdtr:
+	.word gdtselector(GDT_ITEMS)
+	.long KA2PA(gdt)
