qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] linuxboot optionrom: do not jump into loaded kernel


From: Gleb Natapov
Subject: [Qemu-devel] [PATCH] linuxboot optionrom: do not jump into loaded kernel in a big real mode
Date: Sun, 6 Jan 2013 14:36:35 +0200

Big real mode is fully emulated by KVM now, so if control is passed to
the loaded kernel while one of the segment registers is in big real
mode all the real mode part of the Linux start up is emulated. This
slows boot process down. Fix that by resetting ES limit to 0xffff before
jumping into the kernel.

The patch also removes unused code segment definition from GDT and changes
ES register to be 16bit in protected mode since CS stays 16bit too and
it is CS segment that determines effective operands and addresses length.

Signed-off-by: Gleb Natapov <address@hidden>
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
--
                        Gleb.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]