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: Alexander Graf
Subject: Re: [Qemu-devel] [PATCHv2] linuxboot optionrom: do not jump into loaded kernel in a big real mode
Date: Sun, 6 Jan 2013 14:18:58 +0100

On 06.01.2013, at 14:09, Gleb Natapov 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>

Reviewed-by: Alexander Graf <address@hidden>


Alex

> ---
> 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]