Minimal x86 firmware for booting Linux kernels
Switch branches/tags
Nothing to show
Clone or download
yangzhon and bonzini qboot: enable mmconfig
Need to enable mmconfig in qboot and also need to reserve
mmconfig space in bios.

Signed-off-by: Yang Zhong <>
Message-Id: <>
[Do not affect e820 memory map on i440FX chipset. - Paolo]
Signed-off-by: Paolo Bonzini <>
Latest commit ac9488f Mar 30, 2017


A simple x86 firmware that can boot Linux.

Most of QEMU's 500-700 ms startup time is spent:

* in the dynamic linker.  This can be reduced by 150 ms simply by
  compiling a stripped down QEMU:

    ./configure --disable-libssh2 --disable-tcmalloc --disable-glusterfs \
        --disable-seccomp --disable-{bzip2,snappy,lzo} --disable-usb-redir \
        --disable-libusb --disable-smartcard-nss --disable-libnfs  \
        --disable-libiscsi --disable-rbd  --disable-spice --disable-attr \
        --disable-cap-ng --disable-linux-aio --disable-uuid --disable-brlapi \
        --disable-vnc-{jpeg,tls,sasl,png,ws} --disable-rdma --disable-bluez \
        --disable-fdt --disable-curl --disable-curses --disable-sdl \
        --disable-gtk  --disable-tpm --disable-vte --disable-vnc  \
        --disable-xen --disable-opengl --target-list=x86_64-softmmu

* in the BIOS.  qboot saves another 150 ms.

* in fw_cfg.  qboot can use the new DMA interface to fw_cfg from QEMU 2.7+.
  Alternatively, kernel and initrd can be put in a CoreBoot cbfs image
  stored in flash.  However, flash has a limit of 8 MB.  In either case
  350 ms are saved, bringing the startup time down to 60 ms.

Compile qboot

Clone the source:

    $ git clone

Compile the qboot firmware (you may need to install the relevant build
time dependancies):

    $ make

The result will be a 64K file named bios.bin.


fw_cfg based example:

    $ qemu-kvm -bios bios.bin \
      -kernel /boot/vmlinuz-4.0.3-300.fc22.x86_64 \
      -serial mon:stdio -append 'console=ttyS0,115200,8n1'

cbfs-based example (pflash isn't the definitive interface though):

    $ dd if=/dev/zero of=boot.bin bs=4096 count=1
    $ cbfstool cbfs.rom create -s 8128k -B boot.bin  -m x86 -o 0x1000
    $ cbfstool cbfs.rom add -f /boot/vmlinuz-4.0.3-300.fc22.x86_64 -n vmlinuz -t raw
    $ echo 'console=ttyS0,115200,8n1' > cmdline
    $ cbfstool cbfs.rom add -f cmdline -n cmdline -t raw
    $ qemu-kvm -drive if=pflash,file=bios.bin,readonly=on \
        -drive if=pflash,file=cbfs.rom,readonly=on \
        -serial mon:stdio


* SMBIOS tables
* Add the possibility to configure out PIC and PCI bridge initialization
* Possibly drop cbfs support, superseded by fw_cfg DMA