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 <[email protected]>
Reviewed-by: Alexander Graf <[email protected]> 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.
