| .. SPDX-License-Identifier: GPL-2.0+ |
| .. sectionauthor:: Bin Meng <bmeng.cn@gmail.com> |
| |
| QEMU x86 |
| ======== |
| |
| Build instructions for bare mode |
| -------------------------------- |
| |
| To build u-boot.rom for QEMU x86 targets, just simply run:: |
| |
| $ make qemu-x86_defconfig (for 32-bit) |
| $ make qemu-x86_64_defconfig (for 64-bit) |
| $ make all |
| |
| Note this default configuration will build a U-Boot for the QEMU x86 i440FX |
| board. To build a U-Boot against QEMU x86 Q35 board, you can change the build |
| configuration during the 'make menuconfig' process like below:: |
| |
| Device Tree Control ---> |
| ... |
| (qemu-x86_q35) Default Device Tree for DT control |
| |
| Test with QEMU for bare mode |
| ---------------------------- |
| |
| QEMU is a fancy emulator that can enable us to test U-Boot without access to |
| a real x86 board. Please make sure your QEMU version is 2.3.0 or above test |
| U-Boot. To launch QEMU with u-boot.rom, call QEMU as follows:: |
| |
| $ qemu-system-i386 -nographic -bios path/to/u-boot.rom |
| |
| This will instantiate an emulated x86 board with i440FX and PIIX chipset. QEMU |
| also supports emulating an x86 board with Q35 and ICH9 based chipset, which is |
| also supported by U-Boot. To instantiate such a machine, call QEMU with:: |
| |
| $ qemu-system-i386 -nographic -bios path/to/u-boot.rom -M q35 |
| |
| Note by default QEMU instantiated boards only have 128 MiB system memory. But |
| it is enough to have U-Boot boot and function correctly. You can increase the |
| system memory by pass '-m' parameter to QEMU if you want more memory:: |
| |
| $ qemu-system-i386 -nographic -bios path/to/u-boot.rom -m 1024 |
| |
| This creates a board with 1 GiB system memory. Currently U-Boot for QEMU only |
| supports 3 GiB maximum system memory and reserves the last 1 GiB address space |
| for PCI device memory-mapped I/O and other stuff, so the maximum value of '-m' |
| would be 3072. |
| |
| QEMU emulates a graphic card which U-Boot supports. Removing '-nographic' will |
| show QEMU's VGA console window. Note this will disable QEMU's serial output. |
| If you want to check both consoles, use '-serial stdio'. |
| |
| Multicore is also supported by QEMU via '-smp n' where n is the number of cores |
| to instantiate. Note, the maximum supported CPU number in QEMU is 255. |
| |
| U-Boot uses 'distro_bootcmd' by default when booting on x86 QEMU. This tries to |
| load a boot script, kernel, and ramdisk from several different interfaces. For |
| the default boot order, see 'qemu-x86.h'. For more information, see |
| 'README.distro'. Most Linux distros can be booted by writing a uboot script. |
| For example, Debian (stretch) can be booted by creating a script file named |
| 'boot.txt' with the contents:: |
| |
| setenv bootargs root=/dev/sda1 ro |
| load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} /vmlinuz |
| load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} /initrd.img |
| zboot ${kernel_addr_r} - ${ramdisk_addr_r} ${filesize} |
| |
| Then compile and install it with:: |
| |
| $ apt install u-boot-tools && \ |
| mkimage -T script -C none -n "Boot script" -d boot.txt /boot/boot.scr |
| |
| The fw_cfg interface in QEMU also provides information about kernel data, |
| initrd, command-line arguments and more. U-Boot supports directly accessing |
| these informtion from fw_cfg interface, which saves the time of loading them |
| from hard disk or network again, through emulated devices. To use it , simply |
| providing them in QEMU command line:: |
| |
| $ qemu-system-i386 -nographic -bios path/to/u-boot.rom -m 1024 \ |
| -kernel /path/to/bzImage -append 'root=/dev/ram console=ttyS0' \ |
| -initrd /path/to/initrd -smp 8 |
| |
| Note: -initrd and -smp are both optional |
| |
| Then start QEMU, in U-Boot command line use the following U-Boot command to |
| setup kernel:: |
| |
| => qfw |
| qfw - QEMU firmware interface |
| |
| Usage: |
| qfw <command> |
| - list : print firmware(s) currently loaded |
| - cpus : print online cpu number |
| - load <kernel addr> <initrd addr> : load kernel and initrd (if any) and setup for zboot |
| |
| => qfw load |
| loading kernel to address 01000000 size 5d9d30 initrd 04000000 size 1b1ab50 |
| |
| Here the kernel (bzImage) is loaded to 01000000 and initrd is to 04000000. Then, |
| 'zboot' can be used to boot the kernel:: |
| |
| => zboot 01000000 - 04000000 1b1ab50 |
| |
| To run 64-bit U-Boot, qemu-system-x86_64 should be used instead, e.g.:: |
| |
| $ qemu-system-x86_64 -nographic -bios path/to/u-boot.rom |
| |
| A specific CPU can be specified via the '-cpu' parameter but please make |
| sure the specified CPU supports 64-bit like '-cpu core2duo'. Conversely |
| '-cpu pentium' won't work for obvious reasons that the processor only |
| supports 32-bit. |
| |
| Note 64-bit support is very preliminary at this point. Lots of features |
| are missing in the 64-bit world. One notable feature is the VGA console |
| support which is currently missing, so that you must specify '-nographic' |
| to get 64-bit U-Boot up and running. |