nuttx/Documentation/platforms/x86_64/qemu/boards/qemu-intel64/index.rst

194 lines
5.7 KiB
ReStructuredText
Raw Normal View History

============
qemu-intel64
============
This page file describes the contents of the build configurations available
for the NuttX QEMU x86_64 port.
Creating a bootable disk
========================
This build supports multiboot2, which means that usual multiboot2 bootlaoders,
e.g. grub can be used. To create a bootable disk with grub2, create a directory
named ``iso`` with grub configuration file and the compiled ``nuttx.elf``.
Directory and file hierarchy::
- iso/
- boot/
- grub/
- grub.cfg
- nuttx.elf
The grub.cfg should contain the boot entry of NuttX::
set timeout=0
set default=0
menuentry "kernel" {
multiboot2 /boot/nuttx.elf
}
Making the disk
---------------
Use the following command to create the disk.
P.S. In some distros, ``grub-mkrescue`` is called ``grub2-mkrescue``::
grub-mkrescue -o boot.iso iso
Grub with UEFI
--------------
This flow is very similar except you need to have the BOOTX64.EFI file.
You can find this in most Linux distributions::
iso/
└── boot
├── efi
│ └── EFI
│ └── BOOT
│ └── BOOTX64.EFI
├── grub
│ └── grub.cfg
└── nuttx.elf
QEMU/KVM
========
QEMU is a generic and open source machine emulator and virtual machine. Here are
some links (which will probably be mostly outdated by the time your read this):
* Home Page: http://wiki.qemu.org/Main_Page
* Downloads: http://wiki.qemu.org/Download
* Documentation: http://wiki.qemu.org/Manual
KVM is the Linux kernel hypervisor.
It supports creations of virtual machines in Linux systems.
It is usually coupled with Qemu as its I/O supporting layer.
The qemu can be build from source or downloaded from distro repositories.
However, a modern CPU and KVM support are mandatory because the X2APIC is not
available in pure emulator mode.
This mean using this build with qemu in windows or old x86 machine can be
frustrating. In such case, looks the next section and use bochs emulator instead.
Running QEMU
------------
In the top-level NuttX directory::
qemu-system-x86_64 -cpu host -enable-kvm -m 2G -cdrom boot.iso -nographic -serial mon:stdio
This multiplex the qemu console and COM1 to your console.
Use control-a 1 and 2 to switch between.
Use control-a x to terminate the emulation.
P.S. Make sure that you CPU supports the mandatory features. Look at Real machine
section for more information.
Various fixes for PCI work Squashed commits: 1. Porting prior PCI work in place of jailhouse code At this point the PCI enumeration works for x86_64 including over pci-pci bridges. Running QEMU with this configuration we see the bridge and the device on the bridge. It also detected the qemu test device qemu-system-x86_64 \ -cpu host,+pcid,+x2apic,+tsc-deadline,+xsave,+rdrand \ --enable-kvm -smp 1 -m 2G -cdrom boot.iso --nographic -no-reboot \ -device pci-testdev \ -device pci-bridge,id=bridge0,chassis_nr=2 \ -device e1000,bus=bridge0,addr=0x3 qemu_pci_init: Initializing PCI Bus pci_probe_device: [00:00.0] Found 8086:1237, class/revision 06000002 pci_probe_device: [00:01.1] Found 8086:7010, class/revision 01018000 pci_probe_device: [00:01.2] Found ffff:ffff, class/revision ffffffff pci_probe_device: [00:01.3] Found 8086:7113, class/revision 06800003 pci_probe_device: [00:01.4] Found ffff:ffff, class/revision ffffffff pci_probe_device: [00:01.5] Found ffff:ffff, class/revision ffffffff pci_probe_device: [00:01.6] Found ffff:ffff, class/revision ffffffff pci_probe_device: [00:01.7] Found ffff:ffff, class/revision ffffffff pci_probe_device: [00:02.0] Found 1234:1111, class/revision 03000002 pci_probe_device: [00:03.0] Found 8086:100e, class/revision 02000003 pci_probe_device: [00:04.0] Found 1b36:0005, class/revision 00ff0000 pci_probe_device: [00:04.0] Probing pci_check_pci_bridge: [00:05.0] Found Bridge pci_probe_device: [01:03.0] Found 8086:100e, class/revision 02000003 pci_probe_device: [00:05.0] Found 1b36:0001, class/revision 06040000 2. Remove unused CONFIG_PCI_MAX_BDF option 3. Add a workaround for Jailhouse pci scanning 4. Extend BAR parsing and handle PIO and MMIO for pci-testdev Signed-off-by: Brennan Ashton <bashton@brennanashton.com> 5. PCI: Add initial support for QEMU 'edu' test device Signed-off-by: Brennan Ashton <bashton@brennanashton.com> 6. Bring up PCI later in boot process Signed-off-by: Brennan Ashton <bashton@brennanashton.com> 7. Add ISR and DMA support to QEMU edu test pci device Signed-off-by: Brennan Ashton <bashton@brennanashton.com> 8. Fix bad function prototype definition in qemu_edu 9. intel64: Add a pci test configuration and instructions Signed-off-by: Brennan Ashton <bashton@brennanashton.com> 10. PCI: Fix issue in identification of 64bit bar Signed-off-by: Brennan Ashton <bashton@brennanashton.com>
2020-05-07 11:59:29 +02:00
For testing the PCI bus and driver layers. This QEMU configuration can be used
with the pcitest NuttX configuration::
qemu-system-x86_64 -cpu host,+pcid,+x2apic,+tsc-deadline,+xsave,+rdrand --enable-kvm -smp 1 -m 2G -cdrom boot.iso --nographic -s -no-reboot -device edu -device pci-testdev
This will enable the QEMU pci-test and edu PCI test devices which test PIO, MMIO, IRQ, and DMA
functions. Additionally it will show detailed information about the enumeration of the PCI bus.
If you want to boot using UEFI and TianoCore you will need to add a flag like this to
point at OVMF ``--bios /usr/share/edk2/ovmf/OVMF_CODE.fd``
Bochs
=====
Bochs is also a generic and open source machine emulator and virtualizer.
It does very comprehensive emulation of x86 platform, even the state-of-art processors.
Here are some links (which will probably be mostly outdated by the time your read this):
* Home Page: http://bochs.sourceforge.net
The bochs can be build from source.
Unlike qemu, it does not rely on KVM to support modern hardware features,
therefore it can also be used under Windows.
When building bochs, remember to enable x86-64 support with ``--enable-x86-64``.
If you also want support for SIMD instructions, enable them with ``--enable-avx --enable-evex``.
Running Bochs
-------------
First edit/check the ``.bochsrc``
You can create one in the top-level NuttX directory or bochs will use the one in your $HOME.
Remember to change the CPU model to one with mandatory features and enable the COM port.
* Find and edit (You might adjust the IPS as you machine perform)::
cpu: model=broadwell_ult, count=1, ips=50000000, reset_on_triple_fault=0, ignore_bad_msrs=0, msrs="msrs.def"
ata0-master: type=cdrom, path="<PATH TO boot.iso>", status=inserted
* Add::
com1: enabled=1, mode=file, dev=com1.out
* In the top-level NuttX directory::
bochs
The emulator will drop into debugger mode.
Enter ``c`` to start the emulation.
COM port output will be in the com1.out file.
Real machine
============
This port should work on real x86-64 machine with a proper CPU.
The mandatory CPU features are:
* TSC DEADLINE or APIC timer
* PCID
* X2APIC
WARNING: IF you use TSC DEADLINE, make sure that your CPU's TSC DEADLINE timer
is not buggy!
Toolchains
==========
Currently, only the Linux GCC toolchain is tested.
While building on a modern x86_64 PC, the default system GCC can be used.
Configurations
==============
Common Configuration Notes
--------------------------
1. Each Qemu-intel64 configuration is maintained in a sub-directory
and can be selected as follow::
tools/configure.sh qemu-intel64:<subdir>
Where ``<subdir>`` is one of the configuration sub-directories described in
the following paragraph.
2. These configurations use the mconf-based configuration tool. To
change a configurations using that tool, you should:
a. Build and install the kconfig-mconf tool. See nuttx/README.txt
see additional README.txt files in the NuttX tools repository.
b. Execute ``make menuconfig`` in nuttx/ in order to start the
reconfiguration process.
3. By default, all configurations assume the Linux. This is easily
reconfigured::
CONFIG_HOST_LINUX=y
Configuration Sub-Directories
-----------------------------
ostest
------
The "standard" NuttX examples/ostest configuration.