blob: b4a2ba5db82b1b2dcbd0f66d36e4289d3674c268 [file] [log] [blame]
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 https://github.com/bonzini/qboot.git
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.
Usage
=====
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
TODO
====
* SMBIOS tables
* Add the possibility to configure out PIC and PCI bridge initialization
* Possibly drop cbfs support, superseded by fw_cfg DMA