Skip to content

Commit

Permalink
riscv/qemu: add NuttSBI support
Browse files Browse the repository at this point in the history
This adds NuttSBI support for rv-virt device so that to enable CI
checks for NuttSBI later. It allows using `-bios nuttx` option to
run NuttX with QEMU v6.2 w/o OpenSBI.

Signed-off-by: Yanfeng Liu <[email protected]>
  • Loading branch information
yf13 committed Aug 1, 2024
1 parent d5854b6 commit 4839582
Show file tree
Hide file tree
Showing 10 changed files with 429 additions and 10 deletions.
1 change: 1 addition & 0 deletions arch/risc-v/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@ config ARCH_CHIP_QEMU_RV
select ARCH_HAVE_MPU
select ARCH_MMU_TYPE_SV39 if ARCH_CHIP_QEMU_RV64
select ARCH_MMU_TYPE_SV32 if ARCH_CHIP_QEMU_RV32
select NUTTSBI_LATE_INIT if NUTTSBI
select ARCH_HAVE_ADDRENV
select ARCH_NEED_ADDRENV_MAPPING
select ARCH_HAVE_S_MODE
Expand Down
5 changes: 2 additions & 3 deletions arch/risc-v/src/qemu-rv/Make.defs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@

include common/Make.defs

# Specify our HEAD assembly file. This will be linked as
# the first object file, so it will appear at address 0
HEAD_ASRC = qemu_rv_head.S
# use CHIP_ASRCS for both Nutt and standard SBI implementations
CHIP_ASRCS = qemu_rv_head.S

# Specify our C code within this directory to be included
CHIP_CSRCS = qemu_rv_start.c qemu_rv_irq_dispatch.c qemu_rv_irq.c
Expand Down
6 changes: 6 additions & 0 deletions arch/risc-v/src/qemu-rv/qemu_rv_head.S
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,15 @@
/* Exported Symbols */

.section .text
#ifndef CONFIG_NUTTSBI
.global __start

__start:
#else
.global __start_s

__start_s:
#endif

/* Preserve a1 as it contains the pointer to DTB */
/* Preserve a0 as it has mhartid */
Expand Down
2 changes: 0 additions & 2 deletions arch/risc-v/src/qemu-rv/qemu_rv_memorymap.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,10 @@
#define QEMU_RV_IDLESTACK_BASE _ebss
#endif

#ifndef CONFIG_BUILD_KERNEL
/* QEMU reset chocies */

#define QEMU_RV_RESET_DONE 0x5555
#define QEMU_RV_RESET_FAIL 0x3333
#define QEMU_RV_RESET_REBOOT 0x7777
#endif

#endif /* __ARCH_RISCV_SRC_QEMU_RV_QEMU_RV_MEMORYMAP_H */
21 changes: 21 additions & 0 deletions arch/risc-v/src/qemu-rv/qemu_rv_start.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <nuttx/serial/uart_16550.h>
#include <arch/board/board.h>

#include <debug.h>
#include "riscv_internal.h"
#include "chip.h"

Expand All @@ -44,6 +45,12 @@
* Pre-processor Definitions
****************************************************************************/

#ifdef CONFIG_NUTTSBI_LATE_INIT
# define NAPOT_RWX (PMPCFG_A_NAPOT | PMPCFG_RWX_MASK)
# define NAPOT_RW (PMPCFG_A_NAPOT | PMPCFG_R | PMPCFG_W)
# define SIZE_HALF (UINT32_C(1) << 31)
#endif

#ifdef CONFIG_DEBUG_FEATURES
#define showprogress(c) up_putc(c)
#else
Expand Down Expand Up @@ -92,7 +99,11 @@ static void qemu_boot_secondary(int mhartid, uintptr_t dtb)
continue;
}

#ifndef CONFIG_NUTTSBI
riscv_sbi_boot_secondary(i, (uintptr_t)&__start, dtb);
#else
sinfo("TBD\n");
#endif
}
}
#endif
Expand Down Expand Up @@ -195,3 +206,13 @@ void riscv_serialinit(void)
u16550_serialinit();
#endif
}

#ifdef CONFIG_NUTTSBI_LATE_INIT
void sbi_late_initialize(void)
{
/* QEMU 6.2 doesn't support 0 size, so we do it explicitly here */

riscv_append_pmp_region(NAPOT_RW, 0, SIZE_HALF);
riscv_append_pmp_region(NAPOT_RWX, SIZE_HALF, SIZE_HALF);
}
#endif
99 changes: 99 additions & 0 deletions boards/risc-v/qemu-rv/rv-virt/configs/nsbi/defconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_DISABLE_OS_API is not set
# CONFIG_NSH_DISABLE_LOSMART is not set
CONFIG_16550_ADDRWIDTH=0
CONFIG_16550_UART0=y
CONFIG_16550_UART0_BASE=0x10000000
CONFIG_16550_UART0_CLOCK=3686400
CONFIG_16550_UART0_IRQ=35
CONFIG_16550_UART0_SERIAL_CONSOLE=y
CONFIG_16550_UART=y
CONFIG_ARCH="risc-v"
CONFIG_ARCH_ADDRENV=y
CONFIG_ARCH_BOARD="rv-virt"
CONFIG_ARCH_BOARD_QEMU_RV_VIRT=y
CONFIG_ARCH_CHIP="qemu-rv"
CONFIG_ARCH_CHIP_QEMU_RV32=y
CONFIG_ARCH_CHIP_QEMU_RV=y
CONFIG_ARCH_CHIP_QEMU_RV_ISA_A=y
CONFIG_ARCH_CHIP_QEMU_RV_ISA_C=y
CONFIG_ARCH_CHIP_QEMU_RV_ISA_M=y
CONFIG_ARCH_DATA_NPAGES=128
CONFIG_ARCH_DATA_VBASE=0xC0100000
CONFIG_ARCH_HEAP_NPAGES=128
CONFIG_ARCH_HEAP_VBASE=0xC0800000
CONFIG_ARCH_INTERRUPTSTACK=2048
CONFIG_ARCH_KERNEL_STACKSIZE=3072
CONFIG_ARCH_PGPOOL_MAPPING=y
CONFIG_ARCH_PGPOOL_PBASE=0x80800000
CONFIG_ARCH_PGPOOL_SIZE=4194304
CONFIG_ARCH_PGPOOL_VBASE=0x80800000
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARCH_TEXT_NPAGES=128
CONFIG_ARCH_TEXT_VBASE=0xC0000000
CONFIG_ARCH_USE_MMU=y
CONFIG_ARCH_USE_MPU=y
CONFIG_ARCH_USE_S_MODE=y
CONFIG_BINFMT_ELF_EXECUTABLE=y
CONFIG_BOARDCTL_POWEROFF=y
CONFIG_BOARD_LOOPSPERMSEC=6366
CONFIG_BUILD_KERNEL=y
CONFIG_DEBUG_ASSERTIONS=y
CONFIG_DEBUG_FEATURES=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEV_ZERO=y
CONFIG_ELF=y
CONFIG_EXAMPLES_HELLO=m
CONFIG_FS_HOSTFS=y
CONFIG_FS_PROCFS=y
CONFIG_IDLETHREAD_STACKSIZE=3072
CONFIG_INIT_FILEPATH="/system/bin/init"
CONFIG_INIT_MOUNT=y
CONFIG_INIT_MOUNT_DATA="fs=../apps"
CONFIG_INIT_MOUNT_FLAGS=0x1
CONFIG_INIT_MOUNT_FSTYPE="hostfs"
CONFIG_INIT_MOUNT_SOURCE=""
CONFIG_INIT_MOUNT_TARGET="/system"
CONFIG_INIT_STACKSIZE=3072
CONFIG_LIBC_ENVPATH=y
CONFIG_LIBC_EXECFUNCS=y
CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_LIBM=y
CONFIG_MM_PGALLOC=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_FILE_APPS=y
CONFIG_NSH_READLINE=y
CONFIG_NUTTSBI=y
CONFIG_NUTTSBI_IPI_BASE=0x2000000
CONFIG_NUTTSBI_MTIMECMP_BASE=0x2004000
CONFIG_NUTTSBI_MTIME_BASE=0x200bff8
CONFIG_PATH_INITIAL="/system/bin"
CONFIG_RAM_SIZE=12582912
CONFIG_RAM_START=0x80000000
CONFIG_READLINE_CMD_HISTORY=y
CONFIG_RISCV_SEMIHOSTING_HOSTFS=y
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_HAVE_PARENT=y
CONFIG_SCHED_LPWORK=y
CONFIG_SCHED_WAITPID=y
CONFIG_SERIAL_UART_ARCH_MMIO=y
CONFIG_START_MONTH=7
CONFIG_START_YEAR=2024
CONFIG_SYMTAB_ORDEREDBYNAME=y
CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_NSH_PROGNAME="init"
CONFIG_TESTING_GETPRIME=y
CONFIG_TESTING_LEAKS=y
CONFIG_TESTING_OSTEST=y
CONFIG_USEC_PER_TICK=1000
98 changes: 98 additions & 0 deletions boards/risc-v/qemu-rv/rv-virt/configs/nsbi64/defconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_DISABLE_OS_API is not set
# CONFIG_NSH_DISABLE_LOSMART is not set
CONFIG_16550_ADDRWIDTH=0
CONFIG_16550_UART0=y
CONFIG_16550_UART0_BASE=0x10000000
CONFIG_16550_UART0_CLOCK=3686400
CONFIG_16550_UART0_IRQ=35
CONFIG_16550_UART0_SERIAL_CONSOLE=y
CONFIG_16550_UART=y
CONFIG_ARCH="risc-v"
CONFIG_ARCH_ADDRENV=y
CONFIG_ARCH_BOARD="rv-virt"
CONFIG_ARCH_BOARD_QEMU_RV_VIRT=y
CONFIG_ARCH_CHIP="qemu-rv"
CONFIG_ARCH_CHIP_QEMU_RV64=y
CONFIG_ARCH_CHIP_QEMU_RV=y
CONFIG_ARCH_CHIP_QEMU_RV_ISA_A=y
CONFIG_ARCH_CHIP_QEMU_RV_ISA_C=y
CONFIG_ARCH_CHIP_QEMU_RV_ISA_M=y
CONFIG_ARCH_DATA_NPAGES=128
CONFIG_ARCH_DATA_VBASE=0xC0100000
CONFIG_ARCH_HEAP_NPAGES=128
CONFIG_ARCH_HEAP_VBASE=0xC0800000
CONFIG_ARCH_INTERRUPTSTACK=2048
CONFIG_ARCH_KERNEL_STACKSIZE=3072
CONFIG_ARCH_PGPOOL_MAPPING=y
CONFIG_ARCH_PGPOOL_PBASE=0x80400000
CONFIG_ARCH_PGPOOL_SIZE=4194304
CONFIG_ARCH_PGPOOL_VBASE=0x80400000
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARCH_TEXT_NPAGES=128
CONFIG_ARCH_TEXT_VBASE=0xC0000000
CONFIG_ARCH_USE_MMU=y
CONFIG_ARCH_USE_MPU=y
CONFIG_ARCH_USE_S_MODE=y
CONFIG_BINFMT_ELF_EXECUTABLE=y
CONFIG_BOARDCTL_POWEROFF=y
CONFIG_BOARD_LOOPSPERMSEC=6366
CONFIG_BUILD_KERNEL=y
CONFIG_DEBUG_ASSERTIONS=y
CONFIG_DEBUG_FEATURES=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEV_ZERO=y
CONFIG_ELF=y
CONFIG_EXAMPLES_HELLO=m
CONFIG_FS_HOSTFS=y
CONFIG_FS_PROCFS=y
CONFIG_IDLETHREAD_STACKSIZE=3072
CONFIG_INIT_FILEPATH="/system/bin/init"
CONFIG_INIT_MOUNT=y
CONFIG_INIT_MOUNT_DATA="fs=../apps"
CONFIG_INIT_MOUNT_FLAGS=0x1
CONFIG_INIT_MOUNT_FSTYPE="hostfs"
CONFIG_INIT_MOUNT_SOURCE=""
CONFIG_INIT_MOUNT_TARGET="/system"
CONFIG_INIT_STACKSIZE=3072
CONFIG_LIBC_ENVPATH=y
CONFIG_LIBC_EXECFUNCS=y
CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_LIBM=y
CONFIG_MM_PGALLOC=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_FILE_APPS=y
CONFIG_NSH_READLINE=y
CONFIG_NUTTSBI=y
CONFIG_NUTTSBI_IPI_BASE=0x2000000
CONFIG_NUTTSBI_MTIMECMP_BASE=0x2004000
CONFIG_NUTTSBI_MTIME_BASE=0x200bff8
CONFIG_PATH_INITIAL="/system/bin"
CONFIG_RAM_SIZE=8388608
CONFIG_RAM_START=0x80000000
CONFIG_READLINE_CMD_HISTORY=y
CONFIG_RISCV_SEMIHOSTING_HOSTFS=y
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_HAVE_PARENT=y
CONFIG_SCHED_LPWORK=y
CONFIG_SCHED_WAITPID=y
CONFIG_SERIAL_UART_ARCH_MMIO=y
CONFIG_START_MONTH=7
CONFIG_START_YEAR=2024
CONFIG_SYMTAB_ORDEREDBYNAME=y
CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_NSH_PROGNAME="init"
CONFIG_TESTING_GETPRIME=y
CONFIG_TESTING_OSTEST=y
CONFIG_USEC_PER_TICK=1000
6 changes: 4 additions & 2 deletions boards/risc-v/qemu-rv/rv-virt/scripts/Make.defs
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,12 @@ include $(TOPDIR)/tools/Config.mk
include $(TOPDIR)/arch/risc-v/src/common/Toolchain.defs

ifeq ($(CONFIG_ARCH_CHIP_QEMU_RV),y)
LDSCRIPT = ld.script
ifeq ($(CONFIG_BUILD_KERNEL),y)
LDSCRIPT = ld-kernel.script
else
LDSCRIPT = ld.script
ifeq ($(CONFIG_NUTTSBI),y)
LDSCRIPT = ld-nuttsbi.script
endif
endif
endif

Expand Down
Loading

0 comments on commit 4839582

Please sign in to comment.