2023-10-25 20:28:04 +02:00
|
|
|
============
|
|
|
|
qemu-intel64
|
|
|
|
============
|
|
|
|
|
2023-12-21 19:15:47 +01:00
|
|
|
This page file describes the contents of the build configurations available
|
|
|
|
for the NuttX QEMU x86_64 port.
|
2023-10-25 20:28:04 +02:00
|
|
|
|
2023-12-21 19:15:47 +01:00
|
|
|
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
|
|
|
|
|
2020-08-04 12:29:05 +02:00
|
|
|
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
|
|
|
|
|
2023-12-21 19:15:47 +01:00
|
|
|
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.
|
|
|
|
|
2020-08-04 12:29:05 +02:00
|
|
|
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``
|
|
|
|
|
2023-12-21 19:15:47 +01:00
|
|
|
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.
|