nuttx/boards/x86_64/intel64/qemu-intel64/README.txt
Sonic Yang b984752aec Flat address x86_64 port of Nuttx (#411)
* arch: x86_64: Pour-in the x86_64 code from cRTOS repository, excluding modifications of NuttX kernel, jailhouse support and linux compatibility layer

* arch: x86_64: Refactor x86_64 loading procedure for better comprehension and included support for multiboot2

* arch: x86_64: Locate the kernel at 4GB~ and modify the page table initializing procedure accordingly

* arch: x86_64: Implemented kconfig option for various x86_64 capabilities, dynamic probe and check capability on lowsetup before enabling

* arch: x86_64: inte64_check_capability: Use Marco to prettify the capability checking procedure

* arch: x86_64: intel64_timerisr.c: Refactor with new frequency calibrating method

* arch: x86_64: Fix C alias of page table and GDT/IST

* arch: x86_64: Reload GTDR with GDT in high address in up_lowsetup

* arch: x86_64: Consolidate MSR definition in arch/arch.h

* arch: x86_64: Edit the way of handling GDT/IST in C into structures

* arch: x86_64: Correct the starting point of isr/irq stack

* arch: x86_64: Update up_initialize.c with the new initializing procedure

* arch: x86_64: up_map_region now take flags instead of assuming WR/PRESENT

* arch: x86_64: Overhual of interrupt initialization procedure

* arch: x86_64: Properly configure the heap to be memory as [_ebss, end of memory]

* arch: x86_64: Try to probe the TSC frequency, fall-back to user specified frequency on failure

* arch: x86_64: Remove debug printing during restore_aux, causing infinite CTX bug

* arch: x86_64: for X86 16500 serial interrupt to work, OUT2 of MCR must be 1. Make it stuck at 1 after boot

* arch: x86_64: Correctly apply license header, comment and format code

* arch: x86_64: properly send a SIGFPE on floating point error

* arch: x86_64: Remove unused variable in up_restore_auxstate

* arch: x86_64: properly trash the processor with an infinite loop

* arch: x86_64: Fix typo in ISR handler causing ISR not handled

* arch: x86_64: Fix possibile race conditions with scheduler debug option on in signal handling path

* arch: x86_64: Fix typo in MSR_X2APIC_LVTT_TSC_DEADLINE

* arch: x86_64: Migrate tickless implementation to the new MSR naming and frequency calibration method

* board: x86_64: qemu: Add guard to exclude up_netinitialize when compiling without net support

* arch: x86_64: update defconfigs

* arch: x86_64: rename qemu as qemu-intel64

* arch: x86_64: update Board readme
2020-03-03 19:02:59 -06:00

187 lines
5.0 KiB
Plaintext

README
======
This README file describes the contents of the build configurations available
for the NuttX QEMU x86_64 port.
Contents
========
* Creating a bootable disk
* QEMU/KVM
- Running QEMU/KVM
* Bochs
- Building Bochs
- Running Bochs
* Real machine
* Toolchain
* FAQ
* Configurations
- ostest
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
```
##### grub.cfg
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
```
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 -cpu host -enable-kvm -m 2GB -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.
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 do not rely on KVM to support modern hardware features, therefor it can
also be used under windows.
When building bochs, remember to enable x86-64 support with "--enable-x86-64".
If you also want the support of SIMD instruction, 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" a
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.