qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCHv2] linuxboot optionrom: do not jump into loaded


From: Blue Swirl
Subject: Re: [Qemu-devel] [PATCHv2] linuxboot optionrom: do not jump into loaded kernel in a big real mode
Date: Sat, 12 Jan 2013 16:08:20 +0000

Thanks, applied.

On Sun, Jan 6, 2013 at 1:09 PM, Gleb Natapov <address@hidden> wrote:
> 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>
> ---
>  v1->v2
>   - add patch for binary linuxboot.bin
>
> diff --git a/pc-bios/linuxboot.bin b/pc-bios/linuxboot.bin
> index 
> e7c36694f997c3c34f7f4af3c2923bd2ef6094e7..435cac4ebff3fcd83cab4bf74de11f7071ab5aa6
>  100644
> GIT binary patch
> delta 72
> zcmZqRXyBNj#oWTwIZ^izW6s78X^grY3=9l?2hw%`DF%L}13f4D4!pei7sLaB|Nnu+
> PBpBVlxtghlk#QmbUy&EH
>
> delta 68
> zcmZqRXyBNj#azSGI8pZyW6H)4X^g52K)|nbpyx#2ftL^ef_NbC|38qJbsj=bI={J@
> NsfKa#1||;1e*hia7ytkO
>
> 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]