diff --git a/pc-bios/optionrom/linuxboot.S b/pc-bios/optionrom/linuxboot.S
index 748c831..afe39a5 100644
--- a/pc-bios/optionrom/linuxboot.S
+++ b/pc-bios/optionrom/linuxboot.S
@@ -101,18 +101,20 @@ copy_kernel:
 	mov		$1, %eax
 	mov		%eax, %cr0
 
-	/* So we can set ES to a 32-bit segment */
+	/* So we can enlarge ES segment limit */
 	mov		$0x10, %eax
 	mov		%eax, %es
 
-	/* We're now running in 16-bit CS, but 32-bit ES! */
-
 	/* Load kernel and initrd */
 	read_fw_blob_addr32(FW_CFG_KERNEL)
 	read_fw_blob_addr32(FW_CFG_INITRD)
 	read_fw_blob_addr32(FW_CFG_CMDLINE)
 	read_fw_blob_addr32(FW_CFG_SETUP)
 
+	/* Do not leave ES in big real mode  */
+	mov		$0x08, %eax
+	mov		%eax, %es
+
 	/* And now jump into Linux! */
 	mov		$0, %eax
 	mov		%eax, %cr0
@@ -130,10 +132,10 @@ gdt:
 	/* 0x00 */
 .byte	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 
-	/* 0x08: code segment (base=0, limit=0xfffff, type=32bit code exec/read, DPL=0, 4k) */
-.byte	0xff, 0xff, 0x00, 0x00, 0x00, 0x9a, 0xcf, 0x00
+	/* 0x08: data segment (base=0, limit=0xffff, type=16bit data read/write, DPL=0, 4k) */
+.byte	0xff, 0xff, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00
 
-	/* 0x10: data segment (base=0, limit=0xfffff, type=32bit data read/write, DPL=0, 4k) */
-.byte	0xff, 0xff, 0x00, 0x00, 0x00, 0x92, 0xcf, 0x00
+	/* 0x10: data segment (base=0, limit=0xfffff, type=16bit data read/write, DPL=0, 4k) */
+.byte	0xff, 0xff, 0x00, 0x00, 0x00, 0x92, 0x8f, 0x00
 
 BOOT_ROM_END
