qemu-armv7a

This board configuration will use QEMU to emulate generic ARM v7-A series hardware platform and provides support for these devices:

  • GICv2 interrupt controllers

  • ARM Generic Timer

  • PL011 UART controller

  • PCI ECAM

  • VirtIO Device

Getting Started

NSH (Single Core)

Configuring NuttX and compile:

$ ./tools/configure.sh -l qemu-armv7a:nsh
$ make

Running with qemu:

$ qemu-system-arm -cpu cortex-a7 -nographic \
-machine virt,virtualization=off,gic-version=2 \
-net none -chardev stdio,id=con,mux=on -serial chardev:con \
-mon chardev=con,mode=readline -kernel ./nuttx

KNSH (Single Core)

This is a configuration of testing the BUILD_KERNEL configuration:

$ cd nuttx
$ ./tools/configure.sh qemu-armv7a:knsh
$ make V=1 -j7
$ make export V=1
$ cd ../apps
$ ./tools/mkimport.sh -z -x ../nuttx/nuttx-export-*.tar.gz
$ make import V=1
$ cd ../nuttx
$ qemu-system-arm -semihosting -M virt -m 1024 -nographic -kernel ./nuttx

NuttShell (NSH) NuttX-12.3.0-RC0
nsh> uname -a
NuttX 12.3.0-RC0 28dee592a3-dirty Oct 12 2023 03:03:07 arm qemu-armv7a
nsh> ps
  PID GROUP PRI POLICY   TYPE    NPX STATE    EVENT     SIGMASK           STACK   USED  FILLED COMMAND
    0     0   0 FIFO     Kthread N-- Ready              0000000000000000 004088 000896  21.9%  Idle_Task
    1     1 100 RR       Kthread --- Waiting  Semaphore 0000000000000000 004040 000304   7.5%  lpwork 0x40119398 0x401193ac
    2     2 100 RR       Task    --- Running            0000000000000000 003032 001032  34.0%  /system/bin/init
nsh> free
                   total       used       free    largest  nused  nfree
        Kmem:  133058556      16644  133041912  133041152     41      3
        Page:  134217728    1105920  133111808  133111808
nsh> /system/bin/hello
Hello, World!!
nsh>

Debugging with QEMU

The nuttx ELF image can be debugged with QEMU.

  1. To debug the nuttx (ELF) with symbols, make sure the following change have applied to defconfig:

    +CONFIG_DEBUG_SYMBOLS=y
    
  2. Run QEMU (Single Core) at shell terminal 1:

    $ qemu-system-arm -cpu cortex-a7 -nographic \
    -machine virt,virtualization=off,gic-version=2 \
    -net none -chardev stdio,id=con,mux=on -serial chardev:con \
    -mon chardev=con,mode=readline -kernel ./nuttx -S -s
    
  3. Run gdb with TUI, connect to QEMU, load nuttx and continue (at shell terminal 2):

    $ arm-none-eabi-gdb -tui --eval-command='target remote localhost:1234' nuttx
    (gdb) c
    Continuing.
    ^C
    Program received signal SIGINT, Interrupt.
    nx_start () at armv7-a/arm_head.S:209
    (gdb)
    

PCI support

To enable PCI support, set the following options:

CONFIG_DEVICE_TREE=y
CONFIG_PCI=y
CONFIG_PCI=y

Then run qemu with:

-machine virt,highmem=off,virtualization=off,gic-version=2

The command that starts QEMU and enables the QEMU EDU device looks like this:

qemu-system-arm -cpu cortex-a7 -nographic \
-machine virt,highmem=off,virtualization=off,gic-version=2 \
-chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline \
-kernel nuttx -device edu