summaryrefslogtreecommitdiff
path: root/bsp
diff options
context:
space:
mode:
authorGUI <[email protected]>2026-10-17 09:44:26 +0800
committerGitHub <[email protected]>2026-10-17 09:44:26 +0800
commit8d8dc96b67eee53af2841a8819364d52fbec39cb (patch)
treeeb2ac2f0984261f526c5d9c14462db47eceeb193 /bsp
parentc1d931bcc78915f24c3526a07bdecc64d5110d51 (diff)
[ARCH/RISC-V] Next RISC-V (#10320)
* [libcpu][risc-v] Refactor the RISC-V architecture port Introduce an opt-in unified RISC-V common layer for RV32 and RV64 while keeping existing BSPs on the legacy implementation during migration. - use ARCH_RISCV and ARCH_CPU_64BIT for architecture and XLEN selection - unify context, trap, MMU, cache, timer, SBI, SMP and ISA handling - add PLIC, CLIC, ACLINT, APLIC and IMSIC support - map physical hart IDs to contiguous logical CPU IDs - add T-Head vendor overrides while preserving legacy ports - migrate qemu-virt64-riscv with RV32 and RV64 support - update clock_time, MM, LWP, OFW, PCI and Rust integration Existing BSPs continue using legacy_common or common64 unless they select RT_USING_RISCV_NEW_COMMON. Signed-off-by: GuEe-GUI <[email protected]> * [libcpu][risc-v] skip disabled CPU nodes in early FDT walk Rbb666 noted that rt_hw_fdt_install_early() walked every /cpus child without checking status, so disabled cores still joined hart registration and MMU capability probing. Skip nodes that are not okay/ok via rt_fdt_device_is_available() before reading reg or mmu-type. Signed-off-by: seteiro <[email protected]> * [libcpu][risc-v] Fix per-CPU page table mapping - reuse existing non-leaf page table entries when mapping per-CPU areas - reject leaf entry conflicts instead of overwriting mappings Signed-off-by: GuEe-GUI <[email protected]> --------- Signed-off-by: GuEe-GUI <[email protected]> Signed-off-by: seteiro <[email protected]> Co-authored-by: seteiro <[email protected]>
Diffstat (limited to 'bsp')
-rw-r--r--bsp/qemu-virt64-riscv/.config299
-rw-r--r--bsp/qemu-virt64-riscv/.gitignore6
-rw-r--r--bsp/qemu-virt64-riscv/Kconfig75
-rw-r--r--bsp/qemu-virt64-riscv/README.md434
-rw-r--r--bsp/qemu-virt64-riscv/README_cn.md435
-rw-r--r--bsp/qemu-virt64-riscv/SConstruct36
-rw-r--r--bsp/qemu-virt64-riscv/applications/mnt.c42
-rw-r--r--bsp/qemu-virt64-riscv/driver/Kconfig40
-rw-r--r--bsp/qemu-virt64-riscv/driver/SConscript15
-rw-r--r--bsp/qemu-virt64-riscv/driver/asm/sbiasm.h10
-rw-r--r--bsp/qemu-virt64-riscv/driver/asm/sbidef.h27
-rw-r--r--bsp/qemu-virt64-riscv/driver/board.c116
-rw-r--r--bsp/qemu-virt64-riscv/driver/board.h23
-rw-r--r--bsp/qemu-virt64-riscv/driver/drv_romfb.c13
-rw-r--r--bsp/qemu-virt64-riscv/driver/drv_uart.c165
-rw-r--r--bsp/qemu-virt64-riscv/driver/drv_uart.h62
-rw-r--r--bsp/qemu-virt64-riscv/driver/drv_virtio.c100
-rw-r--r--bsp/qemu-virt64-riscv/driver/drv_virtio.h16
-rw-r--r--bsp/qemu-virt64-riscv/driver/virt.h30
-rw-r--r--bsp/qemu-virt64-riscv/link.lds201
-rw-r--r--bsp/qemu-virt64-riscv/link_cpus.lds1
-rw-r--r--bsp/qemu-virt64-riscv/link_smart.lds202
-rw-r--r--bsp/qemu-virt64-riscv/link_stacksize.lds1
-rwxr-xr-xbsp/qemu-virt64-riscv/qemu-dbg.sh16
-rwxr-xr-xbsp/qemu-virt64-riscv/qemu-dumpdtb.sh1
-rw-r--r--bsp/qemu-virt64-riscv/qemu-nographic.bat9
-rwxr-xr-xbsp/qemu-virt64-riscv/qemu-rv64ilp32-nographic.sh1
-rw-r--r--bsp/qemu-virt64-riscv/qemu-v-dbg.sh4
-rw-r--r--bsp/qemu-virt64-riscv/qemu-v-nographic.sh9
-rwxr-xr-xbsp/qemu-virt64-riscv/qemu.py356
-rw-r--r--bsp/qemu-virt64-riscv/rtconfig.h179
-rw-r--r--bsp/qemu-virt64-riscv/rtconfig.py57
-rwxr-xr-xbsp/qemu-virt64-riscv/run.sh43
33 files changed, 971 insertions, 2053 deletions
diff --git a/bsp/qemu-virt64-riscv/.config b/bsp/qemu-virt64-riscv/.config
index b6b6c5eee5..27c929d27c 100644
--- a/bsp/qemu-virt64-riscv/.config
+++ b/bsp/qemu-virt64-riscv/.config
@@ -1,3 +1,7 @@
+# CONFIG_BSP_QEMU_RISCV32 is not set
+CONFIG_BSP_QEMU_RISCV64=y
+CONFIG_ARCH_TEXT_OFFSET=0x200000
+CONFIG_ARCH_RAM_OFFSET=0x80000000
#
# RT-Thread Kernel
@@ -12,17 +16,7 @@
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
-CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
-CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
-CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
-CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
-CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER=y
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
-CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
-CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
-CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
-CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
-CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
# end of rt_vsnprintf options
#
@@ -121,8 +115,8 @@ CONFIG_RT_NAME_MAX=24
# CONFIG_RT_USING_NANO is not set
# CONFIG_RT_USING_SMART is not set
# CONFIG_RT_USING_AMP is not set
-# CONFIG_RT_USING_SMP is not set
-CONFIG_RT_CPUS_NR=1
+CONFIG_RT_USING_SMP=y
+CONFIG_RT_CPUS_NR=4
CONFIG_RT_ALIGN_SIZE=8
# CONFIG_RT_THREAD_PRIORITY_8 is not set
CONFIG_RT_THREAD_PRIORITY_32=y
@@ -136,6 +130,7 @@ CONFIG_RT_HOOK_USING_FUNC_PTR=y
CONFIG_RT_USING_IDLE_HOOK=y
CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
CONFIG_IDLE_THREAD_STACK_SIZE=16384
+CONFIG_SYSTEM_THREAD_STACK_SIZE=16384
CONFIG_RT_USING_TIMER_SOFT=y
CONFIG_RT_TIMER_THREAD_PRIO=4
CONFIG_RT_TIMER_THREAD_STACK_SIZE=16384
@@ -154,6 +149,8 @@ CONFIG_RT_DEBUGING_ASSERT=y
CONFIG_RT_DEBUGING_COLOR=y
CONFIG_RT_DEBUGING_CONTEXT=y
# CONFIG_RT_DEBUGING_AUTO_INIT is not set
+# CONFIG_RT_DEBUGING_SPINLOCK is not set
+# CONFIG_RT_DEBUGING_CRITICAL is not set
# CONFIG_RT_USING_CI_ACTION is not set
#
@@ -187,7 +184,7 @@ CONFIG_RT_USING_HEAP=y
CONFIG_RT_USING_DEVICE=y
CONFIG_RT_USING_DEVICE_OPS=y
-# CONFIG_RT_USING_INTERRUPT_INFO is not set
+CONFIG_RT_USING_INTERRUPT_INFO=y
# CONFIG_RT_USING_THREADSAFE_PRINTF is not set
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=256
@@ -198,15 +195,35 @@ CONFIG_RT_USING_STDC_ATOMIC=y
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
+CONFIG_ARCH_SECONDARY_CPU_STACK_SIZE=4096
+CONFIG_ARCH_HEAP_SIZE=0x4000000
+CONFIG_ARCH_INIT_PAGE_SIZE=0x200000
CONFIG_ARCH_CPU_64BIT=y
CONFIG_RT_USING_CACHE=y
+CONFIG_RT_USING_HW_ATOMIC=y
+CONFIG_RT_USING_CPU_FFS=y
CONFIG_ARCH_MM_MMU=y
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_RISCV_FPU=y
+CONFIG_ARCH_RISCV_VECTOR=y
+CONFIG_ARCH_VECTOR_VLEN_128=y
+# CONFIG_ARCH_VECTOR_VLEN_256 is not set
+# CONFIG_ARCH_VECTOR_VLEN_512 is not set
+# CONFIG_ARCH_VECTOR_VLEN_1024 is not set
+# CONFIG_ARCH_VECTOR_VLEN_2048 is not set
+# CONFIG_ARCH_VECTOR_VLEN_4096 is not set
+CONFIG_ARCH_RISCV_FPU_D=y
CONFIG_ARCH_RISCV64=y
+
+#
+# RISC-V Architecture Configuration
+#
+CONFIG_RT_USING_RISCV_NEW_COMMON=y
+# CONFIG_ARCH_RISCV_USING_IRQ_STACK is not set
+# CONFIG_RT_USING_USERSPACE_32BIT_LIMIT is not set
+# end of RISC-V Architecture Configuration
+
CONFIG_ARCH_USING_NEW_CTX_SWITCH=y
-CONFIG_ARCH_USING_RISCV_COMMON64=y
-CONFIG_ARCH_REMAP_KERNEL=y
#
# RT-Thread Components
@@ -282,7 +299,7 @@ CONFIG_RT_USING_DFS_ROMFS=y
#
# Device Drivers
#
-# CONFIG_RT_USING_DM is not set
+CONFIG_RT_USING_DM=y
# CONFIG_RT_USING_DEV_BUS is not set
CONFIG_RT_USING_DEVICE_IPC=y
CONFIG_RT_UNAMED_PIPE_NUMBER=64
@@ -294,14 +311,25 @@ CONFIG_RT_USING_SERIAL_V1=y
# CONFIG_RT_USING_SERIAL_V2 is not set
CONFIG_RT_SERIAL_USING_DMA=y
CONFIG_RT_SERIAL_RB_BUFSZ=64
-# CONFIG_RT_USING_SERIAL_BYPASS is not set
+CONFIG_RT_USING_SERIAL_BYPASS=y
+# CONFIG_RT_SERIAL_EARLY_HVC is not set
+# CONFIG_RT_SERIAL_PL011 is not set
+CONFIG_RT_SERIAL_8250=y
+# CONFIG_RT_SERIAL_8250_DW is not set
+CONFIG_RT_SERIAL_8250_PCI=y
+CONFIG_RT_SERIAL_VIRTUAL=y
+CONFIG_RT_SERIAL_VIRTUAL_FONT_UNI2_FIXED16=y
+# CONFIG_RT_SERIAL_VIRTUAL_FONT_UNI2_VGA16 is not set
+CONFIG_RT_SERIAL_EARLY_SBI=y
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
CONFIG_RT_USING_CLOCK_TIME=y
+# CONFIG_RT_USING_CLOCK_TIMER_TRIGGER is not set
CONFIG_CLOCK_TIMER_FREQ=0
+CONFIG_RT_USING_ETHERNET=y
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
CONFIG_RT_USING_NULL=y
CONFIG_RT_USING_ZERO=y
@@ -313,22 +341,165 @@ CONFIG_RT_USING_RANDOM=y
# CONFIG_RT_USING_MTD_NAND is not set
# CONFIG_RT_USING_PM is not set
CONFIG_RT_USING_RTC=y
-# CONFIG_RT_USING_ALARM is not set
-CONFIG_RT_USING_SOFT_RTC=y
+CONFIG_RT_USING_ALARM=y
+CONFIG_RT_ALARM_STACK_SIZE=16384
+CONFIG_RT_ALARM_TIMESLICE=5
+CONFIG_RT_ALARM_PRIORITY=10
+# CONFIG_RT_ALARM_USING_LOCAL_TIME is not set
+# CONFIG_RT_USING_SOFT_RTC is not set
+CONFIG_RT_RTC_GOLDFISH=y
+# CONFIG_RT_RTC_PL031 is not set
# CONFIG_RT_USING_SDIO is not set
# CONFIG_RT_USING_SPI is not set
-# CONFIG_RT_USING_WDT is not set
-# CONFIG_RT_USING_AUDIO is not set
+CONFIG_RT_USING_WDT=y
+# CONFIG_RT_WDT_DW is not set
+CONFIG_RT_WDT_I6300ESB=y
+CONFIG_RT_USING_AUDIO=y
+CONFIG_RT_AUDIO_REPLAY_MP_BLOCK_SIZE=4096
+CONFIG_RT_AUDIO_REPLAY_MP_BLOCK_COUNT=2
+CONFIG_RT_AUDIO_RECORD_PIPE_SIZE=2048
+CONFIG_RT_AUDIO_INTEL_HDA=y
# CONFIG_RT_USING_SENSOR is not set
-# CONFIG_RT_USING_TOUCH is not set
-# CONFIG_RT_USING_LCD is not set
-# CONFIG_RT_USING_HWCRYPTO is not set
+CONFIG_RT_USING_TOUCH=y
+# CONFIG_RT_TOUCH_PIN_IRQ is not set
+CONFIG_RT_USING_LCD=y
+CONFIG_RT_USING_GRAPHIC=y
+# CONFIG_RT_GRAPHIC_BACKLIGHT is not set
+CONFIG_RT_GRAPHIC_FB=y
+# CONFIG_RT_GRAPHIC_FB_SIMPLE is not set
+CONFIG_RT_GRAPHIC_LOGO=y
+# CONFIG_RT_GRAPHIC_LOGO_NONE is not set
+CONFIG_RT_GRAPHIC_LOGO_RT_THREAD_CLUT224=y
+# CONFIG_RT_GRAPHIC_LOGO_RT_THREAD_WHITE_CLUT224 is not set
+CONFIG_RT_USING_HWCRYPTO=y
+CONFIG_RT_HWCRYPTO_DEFAULT_NAME="hwcryto"
+CONFIG_RT_HWCRYPTO_IV_MAX_SIZE=16
+CONFIG_RT_HWCRYPTO_KEYBIT_MAX_SIZE=256
+# CONFIG_RT_HWCRYPTO_USING_GCM is not set
+CONFIG_RT_HWCRYPTO_USING_AES=y
+CONFIG_RT_HWCRYPTO_USING_AES_ECB=y
+CONFIG_RT_HWCRYPTO_USING_AES_CBC=y
+# CONFIG_RT_HWCRYPTO_USING_AES_CFB is not set
+CONFIG_RT_HWCRYPTO_USING_AES_CTR=y
+# CONFIG_RT_HWCRYPTO_USING_AES_OFB is not set
+CONFIG_RT_HWCRYPTO_USING_DES=y
+CONFIG_RT_HWCRYPTO_USING_DES_ECB=y
+CONFIG_RT_HWCRYPTO_USING_DES_CBC=y
+CONFIG_RT_HWCRYPTO_USING_3DES=y
+CONFIG_RT_HWCRYPTO_USING_3DES_ECB=y
+CONFIG_RT_HWCRYPTO_USING_3DES_CBC=y
+CONFIG_RT_HWCRYPTO_USING_RC4=y
+# CONFIG_RT_HWCRYPTO_USING_MD5 is not set
+# CONFIG_RT_HWCRYPTO_USING_SHA1 is not set
+# CONFIG_RT_HWCRYPTO_USING_SHA2 is not set
+CONFIG_RT_HWCRYPTO_USING_RNG=y
+# CONFIG_RT_HWCRYPTO_USING_CRC is not set
+# CONFIG_RT_HWCRYPTO_USING_BIGNUM is not set
# CONFIG_RT_USING_WIFI is not set
-# CONFIG_RT_USING_BLK is not set
+# CONFIG_RT_USING_PTP is not set
+# CONFIG_RT_USING_LED is not set
+CONFIG_RT_USING_INPUT=y
+CONFIG_RT_INPUT_POWER=y
+# CONFIG_RT_INPUT_UAPI is not set
+# CONFIG_RT_INPUT_JOYSTICK is not set
+CONFIG_RT_INPUT_KEYBOARD=y
+# CONFIG_RT_INPUT_KEYBOARD_GPIO is not set
+# CONFIG_RT_INPUT_MISC is not set
+CONFIG_RT_INPUT_TOUCHSCREEN=y
+# CONFIG_RT_USING_MBOX is not set
+# CONFIG_RT_USING_HWSPINLOCK is not set
+# CONFIG_RT_USING_RPMSG is not set
+# CONFIG_RT_USING_PHYE is not set
+# CONFIG_RT_USING_ATA is not set
+CONFIG_RT_USING_NVME=y
+CONFIG_RT_USING_NVME_IO_QUEUE=4
+CONFIG_RT_NVME_PCI=y
+CONFIG_RT_USING_BLK=y
+
+#
+# Partition Types
+#
+CONFIG_RT_BLK_PARTITION_DFS=y
+CONFIG_RT_BLK_PARTITION_EFI=y
+# end of Partition Types
+
+# CONFIG_RT_USING_SCSI is not set
+CONFIG_RT_USING_FIRMWARE=y
+CONFIG_RT_FIRMWARE_QEMU_FW_CFG=y
+# CONFIG_RT_USING_TEE is not set
+# CONFIG_RT_USING_HWCACHE is not set
# CONFIG_RT_USING_REGULATOR is not set
+CONFIG_RT_USING_RESET=y
+# CONFIG_RT_RESET_SIMPLE is not set
+
+#
+# Power Management (PM) Domains device drivers
+#
+# end of Power Management (PM) Domains device drivers
+
+CONFIG_RT_USING_POWER_RESET=y
+CONFIG_RT_POWER_RESET_SYSCON_POWEROFF=y
+# CONFIG_RT_POWER_RESET_SYSCON_REBOOT_MODE is not set
+CONFIG_RT_POWER_RESET_SYSCON_REBOOT=y
# CONFIG_RT_USING_POWER_SUPPLY is not set
-CONFIG_RT_USING_PIN=y
+# CONFIG_RT_USING_THERMAL is not set
+CONFIG_RT_USING_VIRTIO=y
+CONFIG_RT_VIRTIO_TRANSPORT_MMIO=y
+CONFIG_RT_VIRTIO_TRANSPORT_PCI=y
+CONFIG_RT_VIRTIO_NET=y
+CONFIG_RT_VIRTIO_BLK=y
+CONFIG_RT_VIRTIO_CONSOLE=y
+CONFIG_RT_VIRTIO_RNG=y
+# CONFIG_RT_VIRTIO_9P is not set
+CONFIG_RT_VIRTIO_RPROC_SERIAL=y
+CONFIG_RT_VIRTIO_GPU=y
+CONFIG_RT_VIRTIO_INPUT=y
+CONFIG_RT_VIRTIO_CRYPTO=y
+CONFIG_RT_VIRTIO_SOUND=y
+CONFIG_RT_USING_DMA=y
+# CONFIG_RT_DMA_PL330 is not set
+# CONFIG_RT_DMA_DW_AXI_DMAC is not set
+CONFIG_RT_USING_MFD=y
+CONFIG_RT_MFD_EDU=y
+CONFIG_RT_MFD_SYSCON=y
+# CONFIG_RT_USING_IVSHMEM is not set
+CONFIG_RT_USING_OFW=y
+# CONFIG_RT_USING_BUILTIN_FDT is not set
+CONFIG_RT_FDT_EARLYCON_MSG_SIZE=128
+CONFIG_RT_USING_OFW_BUS_RANGES_NUMBER=8
+CONFIG_RT_USING_PCI=y
+CONFIG_RT_PCI_MSI=y
+# CONFIG_RT_PCI_ENDPOINT is not set
+CONFIG_RT_PCI_SYS_64BIT=y
+CONFIG_RT_PCI_CACHE_LINE_SIZE=8
+# CONFIG_RT_PCI_LOCKLESS is not set
+
+#
+# PCI Device Drivers
+#
+CONFIG_RT_PCI_ECAM=y
+CONFIG_RT_PCI_HOST_COMMON=y
+CONFIG_RT_PCI_HOST_GENERIC=y
+# CONFIG_RT_PCI_DW is not set
+CONFIG_RT_USING_PIC=y
+# CONFIG_RT_USING_PIC_STATISTICS is not set
+CONFIG_MAX_HANDLERS=512
+# CONFIG_RT_PIC_ARM_GIC is not set
+# CONFIG_RT_PIC_ARM_GIC_V3 is not set
+CONFIG_RT_PIC_RISCV_AIA=y
+# CONFIG_RT_PIC_RISCV_CLIC is not set
+CONFIG_RT_PIC_RISCV_INTC=y
+CONFIG_RT_PIC_SIFIVE_PLIC=y
+# CONFIG_RT_USING_PIN is not set
+CONFIG_RT_USING_CLK=y
# CONFIG_RT_USING_CHERRYUSB is not set
+
+#
+# SoC (System on Chip) Drivers
+#
+CONFIG_RT_GRAPHIC_ROMFB_WIDTH=800
+CONFIG_RT_GRAPHIC_ROMFB_HEIGHT=600
+# end of SoC (System on Chip) Drivers
# end of Device Drivers
#
@@ -403,6 +574,7 @@ CONFIG_SAL_USING_LWIP=y
# end of Docking with protocol stacks
CONFIG_SAL_USING_POSIX=y
+# CONFIG_RT_USING_AF_UNIX is not set
CONFIG_RT_USING_NETDEV=y
CONFIG_NETDEV_USING_IFCONFIG=y
CONFIG_NETDEV_USING_PING=y
@@ -503,10 +675,11 @@ CONFIG_RT_USING_ADT_REF=y
#
# Memory management
#
-# CONFIG_RT_PAGE_MPR_SIZE_DYNAMIC is not set
+CONFIG_RT_PAGE_MPR_SIZE_DYNAMIC=y
CONFIG_RT_PAGE_AFFINITY_BLOCK_SIZE=0x1000
CONFIG_RT_PAGE_MAX_ORDER=11
-# CONFIG_RT_USING_MEMBLOCK is not set
+CONFIG_RT_USING_MEMBLOCK=y
+CONFIG_RT_INIT_MEMORY_REGIONS=128
#
# Debugging
@@ -525,6 +698,7 @@ CONFIG_RT_PAGE_MAX_ORDER=11
# end of Using USB legacy version
# CONFIG_RT_USING_FDT is not set
+# CONFIG_RT_USING_LEGACY_VIRTIO is not set
# CONFIG_RT_USING_RUST is not set
# end of RT-Thread Components
@@ -632,6 +806,7 @@ CONFIG_RT_PAGE_MAX_ORDER=11
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -806,6 +981,7 @@ CONFIG_RT_PAGE_MAX_ORDER=11
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
# end of tools packages
#
@@ -987,7 +1163,21 @@ CONFIG_RT_PAGE_MAX_ORDER=11
# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -1075,6 +1265,23 @@ CONFIG_RT_PAGE_MAX_ORDER=11
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -1208,6 +1415,7 @@ CONFIG_RT_PAGE_MAX_ORDER=11
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1258,6 +1466,7 @@ CONFIG_RT_PAGE_MAX_ORDER=11
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1275,6 +1484,8 @@ CONFIG_RT_PAGE_MAX_ORDER=11
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1357,6 +1568,7 @@ CONFIG_RT_PAGE_MAX_ORDER=11
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1596,27 +1808,4 @@ CONFIG_RT_PAGE_MAX_ORDER=11
# end of Arduino libraries
# end of RT-Thread online packages
-#
-# RISC-V QEMU virt64 configs
-#
-CONFIG_RT_USING_LEGACY_VIRTIO=y
-CONFIG_RT_USING_VIRTIO10=y
-# CONFIG_RT_USING_VIRTIO_MMIO_ALIGN is not set
-CONFIG_RT_USING_VIRTIO_BLK=y
-CONFIG_RT_USING_VIRTIO_NET=y
-CONFIG_RT_USING_VIRTIO_CONSOLE=y
-CONFIG_RT_USING_VIRTIO_CONSOLE_PORT_MAX_NR=4
-CONFIG_RT_USING_VIRTIO_GPU=y
-CONFIG_RT_USING_VIRTIO_INPUT=y
-CONFIG_BSP_USING_VIRTIO_BLK=y
-CONFIG_BSP_USING_VIRTIO_NET=y
-CONFIG_BSP_USING_VIRTIO_CONSOLE=y
-CONFIG_BSP_USING_VIRTIO_GPU=y
-CONFIG_BSP_USING_VIRTIO_INPUT=y
-# end of RISC-V QEMU virt64 configs
-
-CONFIG_BOARD_QEMU_VIRT_RV64=y
-CONFIG_ENABLE_FPU=y
-# CONFIG_ENABLE_VECTOR is not set
-# CONFIG_RT_USING_USERSPACE_32BIT_LIMIT is not set
-CONFIG___STACKSIZE__=16384
+CONFIG_BSP_USING_QEMU_RISCV_VIRT=y
diff --git a/bsp/qemu-virt64-riscv/.gitignore b/bsp/qemu-virt64-riscv/.gitignore
index 341f703a73..85effa2cdc 100644
--- a/bsp/qemu-virt64-riscv/.gitignore
+++ b/bsp/qemu-virt64-riscv/.gitignore
@@ -1,3 +1,5 @@
-mnt.c
-romfs_data.c
+*.dtb
+*.dts
+*.qcow2
opensbi
+romfs_data.c
diff --git a/bsp/qemu-virt64-riscv/Kconfig b/bsp/qemu-virt64-riscv/Kconfig
index a3f7e0f1b7..f5da5a2deb 100644
--- a/bsp/qemu-virt64-riscv/Kconfig
+++ b/bsp/qemu-virt64-riscv/Kconfig
@@ -6,52 +6,47 @@ RTT_DIR := ../../
PKGS_DIR := packages
+SOC_DM_PIC_DIR := $(RTT_DIR)/libcpu/risc-v/common/pic
+SOC_DM_SERIAL_DIR := $(RTT_DIR)/libcpu/risc-v/common/serial
+SOC_DM_HWCACHE_DIR := $(RTT_DIR)/libcpu/risc-v/common/hwcache
+SOC_DM_SOC_DIR := $(BSP_DIR)/driver
+
+choice
+ prompt "RISC-V XLEN"
+ default BSP_QEMU_RISCV64
+
+ config BSP_QEMU_RISCV32
+ bool "RV32"
+
+ config BSP_QEMU_RISCV64
+ bool "RV64"
+endchoice
+
+config ARCH_TEXT_OFFSET
+ range 0x400000 0x400000 if BSP_QEMU_RISCV32
+ range 0x200000 0x200000 if BSP_QEMU_RISCV64
+ default 0x400000 if BSP_QEMU_RISCV32
+ default 0x200000 if BSP_QEMU_RISCV64
+
+config ARCH_RAM_OFFSET
+ range 0x80000000 0x80000000
+ default 0x80000000
+
source "$(RTT_DIR)/Kconfig"
osource "$PKGS_DIR/Kconfig"
-rsource "driver/Kconfig"
-config BOARD_QEMU_VIRT_RV64
+config BSP_USING_QEMU_RISCV_VIRT
bool
- select ARCH_RISCV64
- select ARCH_USING_RISCV_COMMON64
+ select ARCH_RISCV32 if BSP_QEMU_RISCV32
+ select ARCH_RISCV64 if BSP_QEMU_RISCV64
+ select RT_USING_RISCV_NEW_COMMON
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
select RT_USING_CACHE
select ARCH_MM_MMU
- select ARCH_REMAP_KERNEL
- default y
-
-config ENABLE_FPU
- bool "Enable FPU"
- select ARCH_RISCV_FPU
+ select ARCH_REMAP_KERNEL if RT_USING_SMART
+ select ARCH_RISCV_FPU_D if BSP_QEMU_RISCV64
+ select RT_KLIBC_USING_VSNPRINTF_LONGLONG
+ select RT_USING_HW_ATOMIC
+ select RT_USING_STDC_ATOMIC
default y
-
-config ENABLE_VECTOR
- bool "Using RISC-V Vector Extension"
- select ARCH_RISCV_VECTOR
- default n
-
-if ENABLE_VECTOR
- choice ARCH_VECTOR_VLEN_SEL
- prompt "Vector Registers Length in Bits"
- default ARCH_VECTOR_VLEN_128
-
- config ARCH_VECTOR_VLEN_128
- bool "128"
-
- config ARCH_VECTOR_VLEN_256
- bool "256"
- endchoice
-endif
-
-config RT_USING_USERSPACE_32BIT_LIMIT
- bool "Enable userspace 32bit limit"
- default n
-
-config RT_USING_VIRTIO_MMIO_ALIGN
- bool "Open packed attribution, this may caused an error on virtio"
- default n
-
-config __STACKSIZE__
- int "stack size for interrupt"
- default 4096
diff --git a/bsp/qemu-virt64-riscv/README.md b/bsp/qemu-virt64-riscv/README.md
index c04fd2b498..b7ea491bb1 100644
--- a/bsp/qemu-virt64-riscv/README.md
+++ b/bsp/qemu-virt64-riscv/README.md
@@ -1,405 +1,75 @@
-**QEMU/RISCV64 VIRT Board Support Package User Guide**
+# QEMU RISC-V virt BSP
-English | [中文](./README_cn.md)
+English | [中文](README_cn.md)
-<!-- TOC -->
+This BSP runs RT-Thread in S-mode on QEMU's RISC-V `virt` machine. The directory
+name is retained for compatibility, while Kconfig supports both RV32 and RV64.
+RV64 is the default. RT-Thread Smart remains RV64-only; RV32 currently targets
+the standard RT-Thread kernel.
-- [1. Introduction](#1-introduction)
-- [2. Building](#2-building)
- - [2.1. Installing the toolchain](#21-installing-the-toolchain)
- - [2.2. Setting RT-Thread toolchain environment variables](#22-setting-rt-thread-toolchain-environment-variables)
- - [2.3. Downloading the kernel](#23-downloading-the-kernel)
- - [2.4. Configuring the kernel](#24-configuring-the-kernel)
- - [2.5. Compiling the kernel](#25-compiling-the-kernel)
-- [3. Running](#3-running)
- - [3.1. Installing QEMU](#31-installing-qemu)
- - [3.2. Running QEMU](#32-running-qemu)
- - [3.2.1. Running RT-Thread Standard Edition](#321-running-rt-thread-standard-edition)
- - [3.2.2. Running RT-Thread Smart version](#322-running-rt-thread-smart-version)
- - [3.2.3. Running RT-Thread Smart version + Root file-system](#323-running-rt-thread-smart-version--root-file-system)
-- [4. How to use rv64ilp32 toolchain](#4-how-to-use-rv64ilp32-toolchain)
-- [5. Contact information](#5-contact-information)
+## Build
-<!-- /TOC -->
+Install SCons, QEMU RISC-V system emulation, and a RISC-V GCC toolchain. The
+toolchain used for RV32 must provide the selected RV32 multilib.
-# 1. Introduction
+```sh
+export RTT_EXEC_PATH=/path/to/toolchain/bin
+export RTT_CC_PREFIX=riscv64-unknown-elf-
-RISC-V is an open and free instruction set architecture (ISA). This project is a port on the RISCV64 VIRT version of QEMU.
-
-This project supports the world's first rv64ilp32 product-level open source toolchain jointly launched by the Xuantie team and the Institute of Software of the Chinese Academy of Sciences.
-
-# 2. Building
-
-Working system: take Ubuntu 22.04 as an example:
-
-```shell
-$ lsb_release -a
-No LSB modules are available.
-Distributor ID: Ubuntu
-Description: Ubuntu 22.04.2 LTS
-Release: 22.04
-Codename: jammy
+scons --menuconfig
+scons -j$(nproc)
```
-## 2.1. Installing the toolchain
-
-The specific toolchain used is consistent with the official RT-Thread. For the specific toolchain version, please refer to the file <https://github.com/RT-Thread/rt-thread/blob/master/.github/workflows/action_utest.yml> in the RT-Thread repository.
+Select the XLEN under `RISC-V XLEN`. Configuration regeneration produces
+`rtconfig.h`; the build then emits `rtthread.elf` and `rtthread.bin`. The BSP
+sets `ARCH_RAM_OFFSET=0x80000000` and uses a 4 MiB RV32 or 2 MiB RV64 image
+offset, matching QEMU/OpenSBI's default load addresses without a BSP linker
+script.
-```yaml
- - name: Install RISC-V ToolChains
- if: ${{ matrix.legs.QEMU_ARCH == 'riscv64' && matrix.legs.UTEST != 'rtsmart/riscv64' && success() }}
- run: |
- wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/v1.4/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz
- sudo tar zxvf riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz -C /opt
- /opt/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-gcc --version
- echo "RTT_EXEC_PATH=/opt/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin" >> $GITHUB_ENV
+## Run
- - name: Install RISC-V Musl ToolChains
- if: ${{ matrix.legs.QEMU_ARCH == 'riscv64' && matrix.legs.UTEST == 'rtsmart/riscv64' && success() }}
- shell: bash
- run: |
- wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/v1.7/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2
- sudo tar xjf riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2 -C /opt
- /opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/riscv64-unknown-linux-musl-gcc --version
- echo "RTT_EXEC_PATH=/opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin" >> $GITHUB_ENV
- echo "RTT_CC_PREFIX=riscv64-unknown-linux-musl-" >> $GITHUB_ENV
+```sh
+./qemu.py
```
-Among them, `riscv64-unknown-elf-gcc` is used to build the RT-Thread Standard version, and `riscv64-unknown-linux-musl-gcc` is used to build the RT-Thread Smart version. Download them to your local computer according to the links shown above and decompress them.
-
-## 2.2. Setting RT-Thread toolchain environment variables
+Both XLEN configurations enable user-mode networking and one virtio block disk
+by default. RV64 additionally defaults to AIA (APLIC/IMSIC), NVMe,
+virtio-console, and PCI serial. RV32 defaults to PLIC/ACLINT and legacy
+virtio-mmio; NVMe and the additional consoles are not attached by default.
+Missing qcow2 images are created automatically. Storage emulation is
+intentionally limited to virtio block and NVMe.
-There are three environment variables related to the RT-Thread toolchain
+With QEMU 10.1 and OpenSBI 1.5.1, RV32 S-mode AIA reaches IMSIC setup but traps
+when accessing `siselect/sireg`. The `-aia` option remains available for testing
+newer emulator and firmware combinations, but it is not the RV32 default.
-- `RTT_CC` is the toolchain name, which is `"gcc"` here
-- `RTT_CC_PREFIX`: is the toolchain prefix, which is `"riscv64-unknown-elf-"` for the Standard version and `"riscv64-unknown-linux-musl-"` for the Smart version.
-- `RTT_EXEC_PATH`: the path where the bin folder of the toolchain is located, such as `"$HOME/tools/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin"`. This is set according to the actual path after personal download and decompression. Note that the toolchains of the RT-Thread standard version and the Smart version are two different versions, and the path name of `RTT_EXEC_PATH` must be set to `bin`.
+Useful options:
-If you use them all the time, it is recommended to export these three environment variables in the `.bashrc` file.
-
-## 2.3. Downloading the kernel
-
-Assume that the working path is `$WORKSPACE`.
-
-```shell
-$ cd $WORKSPACE
-$ git clone [email protected]:RT-Thread/rt-thread.git
+```sh
+./qemu.py -no-aia
+./qemu.py -no-net -no-nvme
+./qemu.py -nvme -virtio-console -pci-serial
+./qemu.py -pci
+./qemu.py -graphic
+./qemu.py -dumpdtb qemu-virt.dtb
+./qemu.py -dry-run
```
-Enter the BSP directory where qemu-virt64-riscv is located. The following operations will not be introduced separately. By default, it is in this directory.
+The QEMU CPU count must match `RT_CPUS_NR` in the kernel configuration. Change
+`RT_CPUS_NR` and rebuild before changing `-smp`; the script rejects a mismatch
+because the kernel does not currently maintain a separate online-CPU mask.
-```shell
-$ cd $WORKSPACE/rt-thread/bsp/qemu-virt64-riscv
-```
+When `ARCH_RISCV_VECTOR` is enabled, the script reads the selected VLEN from
+`rtconfig.h` and configures QEMU accordingly. `-v` can force the default
+128-bit vector configuration for a kernel built without that option.
-## 2.4. Configuring the kernel
+## Debug
-Refresh the configuration file before compiling for the first time.
+Start QEMU paused and attach GDB:
-```shell
-$ scons --menuconfig
+```sh
+./qemu.py -debug
+riscv64-linux-gnu-gdb rtthread.elf -ex "target remote :1234"
```
-The default configuration is the RT-Thread standard version, so if you don't have any special requirements, don't change anything, just save and exit.
-
-If you want to use the RT-Thread Smart version, at least turn on the `RT_USING_SMART` option after entering the configuration menu (see the figure below), and the rest depends on your needs.
-
-```
-(Top) → RT-Thread Kernel
-RT-Thread Project Configuration
-(24) The maximal size of kernel object name
-[ ] Use the data types defined in ARCH_CPU
-[*] Enable RT-Thread Smart (microkernel on kernel/userland)
-[ ] Enable RT-Thread Nano
-...
-```
-
-Save and exit after modification.
-
-## 2.5. Compiling the kernel
-
-If you have compiled before, you can clean it up:
-
-```shell
-$ scons --clean
-```
-
-Or compile directly:
-
-```shell
-$ scons -j$(nproc)
-```
-
-The kernel binary file `rtthread.bin` will be generated in the `$WORKSPACE/rt-thread/bsp/qemu-virt64-riscv`.
-
-# 3. Running
-
-## 3.1. Installing QEMU
-
-```shell
-$ sudo apt update
-$ sudo apt install qemu-system-misc
-```
-
-After the installation is complete, you can check the version.
-
-```shell
-$ qemu-system-riscv64 --version
-QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.24)
-Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
-```
-
-## 3.2. Running QEMU
-
-The repository has provided a ready-made execution script, which can be executed directly:
-
-```shell
-$ ./run.sh
-```
-
-### 3.2.1. Running RT-Thread Standard Edition
-
-The following is an example:
-
-```shell
-$ ./run.sh
-
-OpenSBI v0.9
- ____ _____ ____ _____
- / __ \ / ____| _ \_ _|
- | | | |_ __ ___ _ __ | (___ | |_) || |
- | | | | '_ \ / _ \ '_ \ \___ \| _ < | |
- | |__| | |_) | __/ | | |____) | |_) || |_
- \____/| .__/ \___|_| |_|_____/|____/_____|
- | |
- |_|
-
-Platform Name : riscv-virtio,qemu
-Platform Features : timer,mfdeleg
-Platform HART Count : 1
-Firmware Base : 0x80000000
-Firmware Size : 100 KB
-Runtime SBI Version : 0.2
-
-Domain0 Name : root
-Domain0 Boot HART : 0
-Domain0 HARTs : 0*
-Domain0 Region00 : 0x0000000080000000-0x000000008001ffff ()
-Domain0 Region01 : 0x0000000000000000-0xffffffffffffffff (R,W,X)
-Domain0 Next Address : 0x0000000080200000
-Domain0 Next Arg1 : 0x000000008f000000
-Domain0 Next Mode : S-mode
-Domain0 SysReset : yes
-
-Boot HART ID : 0
-Boot HART Domain : root
-Boot HART ISA : rv64imafdcsu
-Boot HART Features : scounteren,mcounteren,time
-Boot HART PMP Count : 16
-Boot HART PMP Granularity : 4
-Boot HART PMP Address Bits: 54
-Boot HART MHPM Count : 0
-Boot HART MHPM Count : 0
-Boot HART MIDELEG : 0x0000000000000222
-Boot HART MEDELEG : 0x000000000000b109
-heap: [0x8028d8a8 - 0x8428d8a8]
-
- \ | /
-- RT - Thread Operating System
- / | \ 5.2.0 build Nov 14 2024 15:41:57
- 2006 - 2024 Copyright by RT-Thread team
-lwIP-2.0.3 initialized!
-[I/sal.skt] Socket Abstraction Layer initialize success.
-[I/utest] utest is initialize success.
-[I/utest] total utest testcase num: (0)
-file system initialization done!
-Hello RISC-V
-msh />
-```
-### 3.2.2. Running RT-Thread Smart version
-
-The following is an example:
-
-```shell
-$ ./run.sh
-
-OpenSBI v0.9
- ____ _____ ____ _____
- / __ \ / ____| _ \_ _|
- | | | |_ __ ___ _ __ | (___ | |_) || |
- | | | | '_ \ / _ \ '_ \ \___ \| _ < | |
- | |__| | |_) | __/ | | |____) | |_) || |_
- \____/| .__/ \___|_| |_|_____/|____/_____|
- | |
- |_|
-
-Platform Name : riscv-virtio,qemu
-Platform Features : timer,mfdeleg
-Platform HART Count : 1
-Firmware Base : 0x80000000
-Firmware Size : 100 KB
-Runtime SBI Version : 0.2
-
-Domain0 Name : root
-Domain0 Boot HART : 0
-Domain0 HARTs : 0*
-Domain0 Region00 : 0x0000000080000000-0x000000008001ffff ()
-Domain0 Region01 : 0x0000000000000000-0xffffffffffffffff (R,W,X)
-Domain0 Next Address : 0x0000000080200000
-Domain0 Next Arg1 : 0x000000008f000000
-Domain0 Next Mode : S-mode
-Domain0 SysReset : yes
-
-Boot HART ID : 0
-Boot HART Domain : root
-Boot HART ISA : rv64imafdcsu
-Boot HART Features : scounteren,mcounteren,time
-Boot HART PMP Count : 16
-Boot HART PMP Granularity : 4
-Boot HART PMP Address Bits: 54
-Boot HART MHPM Count : 0
-Boot HART MHPM Count : 0
-Boot HART MIDELEG : 0x0000000000000222
-Boot HART MEDELEG : 0x000000000000b109
-heap: [0x002ef030 - 0x042ef030]
-
- \ | /
-- RT - Thread Smart Operating System
- / | \ 5.2.0 build Nov 14 2024 15:48:43
- 2006 - 2024 Copyright by RT-Thread team
-lwIP-2.0.3 initialized!
-[I/sal.skt] Socket Abstraction Layer initialize success.
-[I/utest] utest is initialize success.
-[I/utest] total utest testcase num: (0)
-[I/drivers.serial] Using /dev/ttyS0 as default console
-file system initialization done!
-Hello RISC-V
-msh />
-```
-
-### 3.2.3. Running RT-Thread Smart version + Root file-system
-
-For the Smart version of the kernel, you can also specify the path of the root file-system image file when executing the `run.sh` script to mount the root file-system during the startup process.
-
-It should be noted that the kernel supports fat by default. If you want to mount the ext4 file-system, you need to install the lwext4 package additionally, i.e. to enable the `PKG_USING_LWEXT4` option (the specific menuconfig path is (Top) -> RT-Thread online packages -> system packages -> lwext4: an excellent choice of ext2/3/4 filesystem for microcontrollers.). If you can't find the item in the menu, you can exit menuconfig and execute `pkgs --upgrade` to update the package index and then try to enable the package.
-
-After checking this option, you also need to perform the following operations to update the software and install the source code to the packages directory of bsp (this operation only needs to be performed once):
-
-```shell
-$ source ~/.env/env.sh
-$ pkgs --update
-```
-
-Save and recompile the kernel.
-
-For how to make a root file-system, please refer to <https://github.com/RT-Thread/userapps/blob/main/README.md>, which will not be repeated here.
-
-The example is as follows:
-
-```shell
-$ ./run.sh /home/u/ws/duo/userapps/apps/build/ext4.img
-
-OpenSBI v0.9
- ____ _____ ____ _____
- / __ \ / ____| _ \_ _|
- | | | |_ __ ___ _ __ | (___ | |_) || |
- | | | | '_ \ / _ \ '_ \ \___ \| _ < | |
- | |__| | |_) | __/ | | |____) | |_) || |_
- \____/| .__/ \___|_| |_|_____/|____/_____|
- | |
- |_|
-
-Platform Name : riscv-virtio,qemu
-Platform Features : timer,mfdeleg
-Platform HART Count : 1
-Firmware Base : 0x80000000
-Firmware Size : 100 KB
-Runtime SBI Version : 0.2
-
-Domain0 Name : root
-Domain0 Boot HART : 0
-Domain0 HARTs : 0*
-Domain0 Region00 : 0x0000000080000000-0x000000008001ffff ()
-Domain0 Region01 : 0x0000000000000000-0xffffffffffffffff (R,W,X)
-Domain0 Next Address : 0x0000000080200000
-Domain0 Next Arg1 : 0x000000008f000000
-Domain0 Next Mode : S-mode
-Domain0 SysReset : yes
-
-Boot HART ID : 0
-Boot HART Domain : root
-Boot HART ISA : rv64imafdcsu
-Boot HART Features : scounteren,mcounteren,time
-Boot HART PMP Count : 16
-Boot HART PMP Granularity : 4
-Boot HART PMP Address Bits: 54
-Boot HART MHPM Count : 0
-Boot HART MHPM Count : 0
-Boot HART MIDELEG : 0x0000000000000222
-Boot HART MEDELEG : 0x000000000000b109
-heap: [0x00326438 - 0x04326438]
-
- \ | /
-- RT - Thread Smart Operating System
- / | \ 5.2.0 build Dec 17 2024 11:49:39
- 2006 - 2024 Copyright by RT-Thread team
-lwIP-2.0.3 initialized!
-[I/sal.skt] Socket Abstraction Layer initialize success.
-[I/utest] utest is initialize success.
-[I/utest] total utest testcase num: (0)
-[I/drivers.serial] Using /dev/ttyS0 as default console
-[W/DFS.fs] mount / failed with file system type: elm
-file system initialization done!
-Hello RISC-V
-msh />[E/sal.skt] not find network interface device by protocol family(1).
-[E/sal.skt] SAL socket protocol family input failed, return error -3.
-/ # ls
-bin lib proc sbin tmp
-dev lost+found root services usr
-etc mnt run tc var
-/ #
-```
-
-# 4. How to use rv64ilp32 toolchain
-
-- Toolchain address: <https://github.com/ruyisdk/riscv-gnu-toolchain-rv64ilp32/tags>
-
-- Usage:
-
- - Configure toolchain path
-
- - Modify ABI parameter to: `-mabi=ilp32d`
-
- - Then perform regular compilation
-
- - Use [script](./qemu-rv64ilp32-nographic.sh) to start QEMU (INFO: QEMU binary is also in the toolchain directory)
-
-- Compare the firmware size of the same project compiled using the traditional 64-bit toolchain and the new 32-bit toolchain:
-
- Traditional 64-bit toolchain firmware size:
-
- ```bash
- Memory region Used Size Region Size %age Used
- SRAM: 225856 B 16 MB 1.35%
- riscv64-unknown-elf-objcopy -O binary rtthread.elf rtthread.bin
- riscv64-unknown-elf-size rtthread.elf
- text data bss dec hex filename
- 150907 3664 71268 225839 3722f rtthread.elf
- ```
-
- New 32-bit toolchain firmware size:
-
- ```bash
- Memory region Used Size Region Size %age Used
- SRAM: 209376 B 16 MB 1.25%
- riscv64-unknown-elf-objcopy -O binary rtthread.elf rtthread.bin
- riscv64-unknown-elf-size rtthread.elf
- text data bss dec hex filename
- 138739 1356 69276 209371 331db rtthread.elf
- ```
-
-# 5. Contact information
-
-Maintainer: [bernard][1]
-
-[1]: https://github.com/BernardXiong \ No newline at end of file
+Use a GDB matching the configured XLEN and toolchain when building RV32.
diff --git a/bsp/qemu-virt64-riscv/README_cn.md b/bsp/qemu-virt64-riscv/README_cn.md
index 418dfc624b..d69ba8488b 100644
--- a/bsp/qemu-virt64-riscv/README_cn.md
+++ b/bsp/qemu-virt64-riscv/README_cn.md
@@ -1,409 +1,72 @@
-**QEMU/RISCV64 VIRT 板级支持包使用说明**
+# QEMU RISC-V virt BSP
-中文页 | [English](./README.md)
+[English](README.md) | 中文
-<!-- TOC -->
+本 BSP 在 QEMU RISC-V `virt` 机器的 S-Mode 下运行 RT-Thread。目录名为兼容
+现有工程继续保留,Kconfig 内部同时支持 RV32 和 RV64,默认选择 RV64。目前
+RT-Thread Smart 仍只支持 RV64;RV32 运行标准版 RT-Thread。
-- [1. 简介](#1-简介)
-- [2. 构建](#2-构建)
- - [2.1. 安装工具链](#21-安装工具链)
- - [2.2. 设置 RT-Thread 工具链环境变量](#22-设置-rt-thread-工具链环境变量)
- - [2.3. 下载内核](#23-下载内核)
- - [2.4. 配置内核](#24-配置内核)
- - [2.5. 编译内核](#25-编译内核)
-- [3. 运行](#3-运行)
- - [3.1. 安装 QEMU](#31-安装-qemu)
- - [3.2. 运行 QEMU](#32-运行-qemu)
- - [3.2.1. 运行 RT-Thread 标准版](#321-运行-rt-thread-标准版)
- - [3.2.2. 运行 RT-Thread Smart 版](#322-运行-rt-thread-smart-版)
- - [3.2.3. 运行 RT-Thread Smart 版 + 根文件系统](#323-运行-rt-thread-smart-版--根文件系统)
-- [4. 如何使用 rv64ilp32 工具链](#4-如何使用-rv64ilp32-工具链)
-- [5. 联系人信息](#5-联系人信息)
+## 编译
-<!-- /TOC -->
+安装 SCons、QEMU RISC-V system emulator 和 RISC-V GCC 工具链。编译 RV32
+时,工具链必须包含所选 RV32 ABI 的 multilib。
-# 1. 简介
+```sh
+export RTT_EXEC_PATH=/path/to/toolchain/bin
+export RTT_CC_PREFIX=riscv64-unknown-elf-
-RISC-V 是一种开放和免费的指令集体系结构 (ISA)。本工程是在 QEMU 的 RISCV64 VIRT 版本上进行的一份移植。
-
-本工程支持玄铁团队联合中科院软件所共同推出的全球首款 rv64ilp32 产品级开源工具链。
-
-# 2. 构建
-
-工作系统:以 Ubuntu 22.04 为例:
-
-```shell
-$ lsb_release -a
-No LSB modules are available.
-Distributor ID: Ubuntu
-Description: Ubuntu 22.04.2 LTS
-Release: 22.04
-Codename: jammy
-```
-
-## 2.1. 安装工具链
-
-具体使用的工具链,和 RT-Thread 官方保持一致,具体的工具链版本可以参考 RT-Thread 仓库的 <https://github.com/RT-Thread/rt-thread/blob/master/.github/workflows/action_utest.yml> 这个文件。
-
-```yaml
- - name: Install RISC-V ToolChains
- if: ${{ matrix.legs.QEMU_ARCH == 'riscv64' && matrix.legs.UTEST != 'rtsmart/riscv64' && success() }}
- run: |
- wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/v1.4/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz
- sudo tar zxvf riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz -C /opt
- /opt/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-gcc --version
- echo "RTT_EXEC_PATH=/opt/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin" >> $GITHUB_ENV
-
- - name: Install RISC-V Musl ToolChains
- if: ${{ matrix.legs.QEMU_ARCH == 'riscv64' && matrix.legs.UTEST == 'rtsmart/riscv64' && success() }}
- shell: bash
- run: |
- wget -q https://github.com/RT-Thread/toolchains-ci/releases/download/v1.7/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2
- sudo tar xjf riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2 -C /opt
- /opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/riscv64-unknown-linux-musl-gcc --version
- echo "RTT_EXEC_PATH=/opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin" >> $GITHUB_ENV
- echo "RTT_CC_PREFIX=riscv64-unknown-linux-musl-" >> $GITHUB_ENV
-```
-
-其中 `riscv64-unknown-elf-gcc` 用于构建 RT-Thread 标准版,`riscv64-unknown-linux-musl-gcc` 用于构建 RT-Thread Smart 版。根据上面所示链接分别下载到本地后解压缩。
-
-## 2.2. 设置 RT-Thread 工具链环境变量
-
-和 RT-Thread 工具链相关的环境变量有三个
-
-- `RTT_CC` 为工具链名称, 这里统一为 `"gcc"`
-- `RTT_CC_PREFIX`: 为工具链前缀, 这里对于标准版是 `"riscv64-unknown-elf-"`,对于 Smart 版是 `"riscv64-unknown-linux-musl-"`。
-- `RTT_EXEC_PATH`: 工具链的 bin 文件夹所在路径, 如 `"$HOME/tools/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin"`, 这个根据个人下载解压后的实际路径进行设置,注意 RT-Thread 标准版和 Smart 版本的工具链是两套不同的版本,而且设置 `RTT_EXEC_PATH` 的路径名时要一直到 `bin`。
-
-如果一直使用的话,建议将这三个环境变量在 `.bashrc` 文件中 export。
-
-## 2.3. 下载内核
-
-假设工作路径是 `$WORKSPACE`。
-
-```shell
-$ cd $WORKSPACE
-$ git clone [email protected]:RT-Thread/rt-thread.git
-```
-
-进入 qemu-virt64-riscv 所在 BSP 目录,后面的操作不做另外介绍,默认就在这个目录下。
-
-```shell
-$ cd $WORKSPACE/rt-thread/bsp/qemu-virt64-riscv
-```
-
-## 2.4. 配置内核
-
-第一次编译前先刷新一下配置文件。
-
-```shell
-$ scons --menuconfig
-```
-
-默认配置就是 RT-Thread 标准版,所以如果没有什么特别需求,什么都不要改动,直接保存退出即可。
-
-如果要使用 RT-Thread Smart 版,进入配置菜单后至少要打开 `RT_USING_SMART` 这个选项(见下图),其他的看自己的需求。
-
-```
-(Top) → RT-Thread Kernel
- RT-Thread Project Configuration
-(24) The maximal size of kernel object name
-[ ] Use the data types defined in ARCH_CPU
-[*] Enable RT-Thread Smart (microkernel on kernel/userland)
-[ ] Enable RT-Thread Nano
-...
-```
-
-修改后保存退出。
-
-## 2.5. 编译内核
-
-如果以前编译后,可以清理一下:
-
-```shell
-$ scons --clean
-```
-
-或者直接编译:
-
-```shell
-$ scons -j$(nproc)
-```
-
-在 `$WORKSPACE/rt-thread/bsp/qemu-virt64-riscv` 路径下会生成内核的二进制文件 `rtthread.bin`。
-
-# 3. 运行
-
-## 3.1. 安装 QEMU
-
-```shell
-$ sudo apt update
-$ sudo apt install qemu-system-misc
+scons --menuconfig
+scons -j$(nproc)
```
-安装完毕后可以看一下版本。
+位宽在 `RISC-V XLEN` 中选择。重新生成配置后会更新 `rtconfig.h`,编译产物为
+`rtthread.elf` 和 `rtthread.bin`。BSP 把 `ARCH_RAM_OFFSET` 设为 `0x80000000`,
+RV32 使用 4 MiB image offset,RV64 使用 2 MiB image offset,与 QEMU/OpenSBI
+的默认装载地址保持一致,不需要 BSP 本地链接脚本。
-```shell
-$ qemu-system-riscv64 --version
-QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.24)
-Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
-```
-
-## 3.2. 运行 QEMU
-
-仓库里已经提供了现成的执行脚本,可以直接执行:
-
-```shell
-$ ./run.sh
-```
-
-### 3.2.1. 运行 RT-Thread 标准版
-
-示例如下:
-
-```shell
-$ ./run.sh
-
-OpenSBI v0.9
- ____ _____ ____ _____
- / __ \ / ____| _ \_ _|
- | | | |_ __ ___ _ __ | (___ | |_) || |
- | | | | '_ \ / _ \ '_ \ \___ \| _ < | |
- | |__| | |_) | __/ | | |____) | |_) || |_
- \____/| .__/ \___|_| |_|_____/|____/_____|
- | |
- |_|
-
-Platform Name : riscv-virtio,qemu
-Platform Features : timer,mfdeleg
-Platform HART Count : 1
-Firmware Base : 0x80000000
-Firmware Size : 100 KB
-Runtime SBI Version : 0.2
-
-Domain0 Name : root
-Domain0 Boot HART : 0
-Domain0 HARTs : 0*
-Domain0 Region00 : 0x0000000080000000-0x000000008001ffff ()
-Domain0 Region01 : 0x0000000000000000-0xffffffffffffffff (R,W,X)
-Domain0 Next Address : 0x0000000080200000
-Domain0 Next Arg1 : 0x000000008f000000
-Domain0 Next Mode : S-mode
-Domain0 SysReset : yes
+## 运行
-Boot HART ID : 0
-Boot HART Domain : root
-Boot HART ISA : rv64imafdcsu
-Boot HART Features : scounteren,mcounteren,time
-Boot HART PMP Count : 16
-Boot HART PMP Granularity : 4
-Boot HART PMP Address Bits: 54
-Boot HART MHPM Count : 0
-Boot HART MHPM Count : 0
-Boot HART MIDELEG : 0x0000000000000222
-Boot HART MEDELEG : 0x000000000000b109
-heap: [0x8028d8a8 - 0x8428d8a8]
-
- \ | /
-- RT - Thread Operating System
- / | \ 5.2.0 build Nov 14 2024 15:41:57
- 2006 - 2024 Copyright by RT-Thread team
-lwIP-2.0.3 initialized!
-[I/sal.skt] Socket Abstraction Layer initialize success.
-[I/utest] utest is initialize success.
-[I/utest] total utest testcase num: (0)
-file system initialization done!
-Hello RISC-V
-msh />
+```sh
+./qemu.py
```
-### 3.2.2. 运行 RT-Thread Smart 版
-
-示例如下:
-
-```shell
-$ ./run.sh
+RV32 和 RV64 都默认启用 QEMU user 网络和一个 virtio block 磁盘。RV64
+另外默认启用 AIA(APLIC/IMSIC)、NVMe、virtio-console 和 PCI serial。
+RV32 默认使用 PLIC/ACLINT 和 legacy virtio-mmio,不默认挂载 NVMe 和两个
+附加控制台。缺失的 qcow2 镜像会自动创建,存储设备只保留 virtio block
+与 NVMe 两类。
-OpenSBI v0.9
- ____ _____ ____ _____
- / __ \ / ____| _ \_ _|
- | | | |_ __ ___ _ __ | (___ | |_) || |
- | | | | '_ \ / _ \ '_ \ \___ \| _ < | |
- | |__| | |_) | __/ | | |____) | |_) || |_
- \____/| .__/ \___|_| |_|_____/|____/_____|
- | |
- |_|
+在 QEMU 10.1 与 OpenSBI 1.5.1 组合下,RV32 S-mode AIA 能进入 IMSIC 初始化,
+但访问 `siselect/sireg` 时会触发非法指令。`-aia` 参数仍可用于测试新版
+模拟器和固件组合,但不作为 RV32 默认值。
-Platform Name : riscv-virtio,qemu
-Platform Features : timer,mfdeleg
-Platform HART Count : 1
-Firmware Base : 0x80000000
-Firmware Size : 100 KB
-Runtime SBI Version : 0.2
+常用参数:
-Domain0 Name : root
-Domain0 Boot HART : 0
-Domain0 HARTs : 0*
-Domain0 Region00 : 0x0000000080000000-0x000000008001ffff ()
-Domain0 Region01 : 0x0000000000000000-0xffffffffffffffff (R,W,X)
-Domain0 Next Address : 0x0000000080200000
-Domain0 Next Arg1 : 0x000000008f000000
-Domain0 Next Mode : S-mode
-Domain0 SysReset : yes
-
-Boot HART ID : 0
-Boot HART Domain : root
-Boot HART ISA : rv64imafdcsu
-Boot HART Features : scounteren,mcounteren,time
-Boot HART PMP Count : 16
-Boot HART PMP Granularity : 4
-Boot HART PMP Address Bits: 54
-Boot HART MHPM Count : 0
-Boot HART MHPM Count : 0
-Boot HART MIDELEG : 0x0000000000000222
-Boot HART MEDELEG : 0x000000000000b109
-heap: [0x002ef030 - 0x042ef030]
-
- \ | /
-- RT - Thread Smart Operating System
- / | \ 5.2.0 build Nov 14 2024 15:48:43
- 2006 - 2024 Copyright by RT-Thread team
-lwIP-2.0.3 initialized!
-[I/sal.skt] Socket Abstraction Layer initialize success.
-[I/utest] utest is initialize success.
-[I/utest] total utest testcase num: (0)
-[I/drivers.serial] Using /dev/ttyS0 as default console
-file system initialization done!
-Hello RISC-V
-msh />
+```sh
+./qemu.py -no-aia
+./qemu.py -no-net -no-nvme
+./qemu.py -nvme -virtio-console -pci-serial
+./qemu.py -pci
+./qemu.py -graphic
+./qemu.py -dumpdtb qemu-virt.dtb
+./qemu.py -dry-run
```
-### 3.2.3. 运行 RT-Thread Smart 版 + 根文件系统
+QEMU 核数必须与内核配置中的 `RT_CPUS_NR` 一致。调整 `-smp` 前应先修改
+`RT_CPUS_NR` 并重新编译;当前内核没有独立的 online CPU mask,因此脚本会拒绝
+核数不匹配的启动方式。
-对于 Smart 版本的内核,也可以在执行 `run.sh` 脚本时指定根文件系统镜像文件的路径在启动过程中挂载根文件系统。
+启用 `ARCH_RISCV_VECTOR` 后,脚本会从 `rtconfig.h` 读取 VLEN 并同步配置
+QEMU。内核未启用 Vector 时,也可以用 `-v` 强制 QEMU 使用默认的 128-bit
+Vector 配置。
-需要注意的是,内核默认支持 fat, 如果要挂载 ext4 的文件系统,则还需要额外安装 lwext4 软件包,即使能 `PKG_USING_LWEXT4`(具体 menuconfig 路径是 (Top) -> RT-Thread online packages -> system packages -> lwext4: an excellent choice of ext2/3/4 filesystem for microcontrollers.)。如果在菜单中找不到该软件包,可以退出 menuconfig 并执行 `pkgs --upgrade` 更新软件包索引后再尝试使能软件包。
+## 调试
-勾选该选项后还需要执行如下操作更新软件并安装源码到 bsp 的 packages 目录下(该操作只要执行一次即可):
+让 QEMU 暂停等待 GDB:
-```shell
-$ source ~/.env/env.sh
-$ pkgs --update
+```sh
+./qemu.py -debug
+riscv64-linux-gnu-gdb rtthread.elf -ex "target remote :1234"
```
-保存后重新编译内核。
-
-有关如何制作根文件系统,请参考 <https://github.com/RT-Thread/userapps/blob/main/README.md>,这里不再赘述。
-
-示例如下:
-
-```shell
-$ ./run.sh /home/u/ws/duo/userapps/apps/build/ext4.img
-
-OpenSBI v0.9
- ____ _____ ____ _____
- / __ \ / ____| _ \_ _|
- | | | |_ __ ___ _ __ | (___ | |_) || |
- | | | | '_ \ / _ \ '_ \ \___ \| _ < | |
- | |__| | |_) | __/ | | |____) | |_) || |_
- \____/| .__/ \___|_| |_|_____/|____/_____|
- | |
- |_|
-
-Platform Name : riscv-virtio,qemu
-Platform Features : timer,mfdeleg
-Platform HART Count : 1
-Firmware Base : 0x80000000
-Firmware Size : 100 KB
-Runtime SBI Version : 0.2
-
-Domain0 Name : root
-Domain0 Boot HART : 0
-Domain0 HARTs : 0*
-Domain0 Region00 : 0x0000000080000000-0x000000008001ffff ()
-Domain0 Region01 : 0x0000000000000000-0xffffffffffffffff (R,W,X)
-Domain0 Next Address : 0x0000000080200000
-Domain0 Next Arg1 : 0x000000008f000000
-Domain0 Next Mode : S-mode
-Domain0 SysReset : yes
-
-Boot HART ID : 0
-Boot HART Domain : root
-Boot HART ISA : rv64imafdcsu
-Boot HART Features : scounteren,mcounteren,time
-Boot HART PMP Count : 16
-Boot HART PMP Granularity : 4
-Boot HART PMP Address Bits: 54
-Boot HART MHPM Count : 0
-Boot HART MHPM Count : 0
-Boot HART MIDELEG : 0x0000000000000222
-Boot HART MEDELEG : 0x000000000000b109
-heap: [0x00326438 - 0x04326438]
-
- \ | /
-- RT - Thread Smart Operating System
- / | \ 5.2.0 build Dec 17 2024 11:49:39
- 2006 - 2024 Copyright by RT-Thread team
-lwIP-2.0.3 initialized!
-[I/sal.skt] Socket Abstraction Layer initialize success.
-[I/utest] utest is initialize success.
-[I/utest] total utest testcase num: (0)
-[I/drivers.serial] Using /dev/ttyS0 as default console
-[W/DFS.fs] mount / failed with file system type: elm
-file system initialization done!
-Hello RISC-V
-msh />[E/sal.skt] not find network interface device by protocol family(1).
-[E/sal.skt] SAL socket protocol family input failed, return error -3.
-/ # ls
-bin lib proc sbin tmp
-dev lost+found root services usr
-etc mnt run tc var
-/ #
-```
-
-# 4. 如何使用 rv64ilp32 工具链
-
-- 工具链地址:https://github.com/ruyisdk/riscv-gnu-toolchain-rv64ilp32/tags
-
-- 使用方法:
-
- - 配置工具链路径
-
- - 修改ABI参数为:`-mabi=ilp32d`
-
- - 然后执行常规编译
-
- - 使用 [脚本](./qemu-rv64ilp32-nographic.sh) 启动 QEMU (INFO: QEMU 二进制同样在工具链目录)
-
-- 使用传统 64 位工具链与使用新 32 位工具链编译相同工程的固件大小对比:
-
- 传统 64 位工具链固件大小:
-
- ```bash
- Memory region Used Size Region Size %age Used
- SRAM: 225856 B 16 MB 1.35%
- riscv64-unknown-elf-objcopy -O binary rtthread.elf rtthread.bin
- riscv64-unknown-elf-size rtthread.elf
- text data bss dec hex filename
- 150907 3664 71268 225839 3722f rtthread.elf
- ```
-
- 新 32 位工具链固件大小:
-
- ```bash
- Memory region Used Size Region Size %age Used
- SRAM: 209376 B 16 MB 1.25%
- riscv64-unknown-elf-objcopy -O binary rtthread.elf rtthread.bin
- riscv64-unknown-elf-size rtthread.elf
- text data bss dec hex filename
- 138739 1356 69276 209371 331db rtthread.elf
- ```
-
-# 5. 联系人信息
-
-维护人:[bernard][1]
-
-[1]: https://github.com/BernardXiong
-
-
-
+RV32 构建应使用与对应位宽和工具链匹配的 GDB。
diff --git a/bsp/qemu-virt64-riscv/SConstruct b/bsp/qemu-virt64-riscv/SConstruct
index 06d2a468df..cf25bd5ecc 100644
--- a/bsp/qemu-virt64-riscv/SConstruct
+++ b/bsp/qemu-virt64-riscv/SConstruct
@@ -21,45 +21,9 @@ env['ASCOM'] = env['ASPPCOM']
Export('RTT_ROOT')
Export('rtconfig')
-rtconfig.CPU='virt64'
-rtconfig.ARCH='risc-v'
# prepare building environment
objs = PrepareBuilding(env, RTT_ROOT, has_libcpu = False)
-if GetDepend('ENABLE_VECTOR'):
- env['ASFLAGS'] = str(env['ASFLAGS']).replace('-march=rv64imafdc ', '-march=rv64imafdcv ')
-
-stack_size = 4096
-
-if GetDepend('RT_USING_SMART'):
- # use smart link.lds
- env['LINKFLAGS'] = env['LINKFLAGS'].replace('link.lds', 'link_smart.lds')
-
-stack_lds = open('link_stacksize.lds', 'w')
-if GetDepend('__STACKSIZE__'): stack_size = GetDepend('__STACKSIZE__')
-stack_lds.write('__STACKSIZE__ = %d;\n' % stack_size)
-stack_lds.close()
-
-# Obtain the number of harts from rtconfig.h and write
-# it into link_cpus.lds for the linker script
-try:
- with open('rtconfig.h', 'r') as f:
- rtconfig_content = f.readlines()
-except FileNotFoundError:
- cpus_nr = 1
-else:
- cpus_nr = 1 # default value
- for line in rtconfig_content:
- line = line.strip()
- if line.startswith('#define') and 'RT_CPUS_NR' in line:
- parts = line.split()
- if len(parts) >= 3 and parts[2].isdigit():
- cpus_nr = int(parts[2])
- break
-
-with open('link_cpus.lds', 'w') as cpus_lds:
- cpus_lds.write(f'RT_CPUS_NR = {cpus_nr};\n')
-
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/qemu-virt64-riscv/applications/mnt.c b/bsp/qemu-virt64-riscv/applications/mnt.c
deleted file mode 100644
index ccf2b39809..0000000000
--- a/bsp/qemu-virt64-riscv/applications/mnt.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2006-2021, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2021/08/19 bernard the first version
- */
-
-#include <rtthread.h>
-
-#ifdef RT_USING_DFS
-#include <dfs_fs.h>
-#include <rtdbg.h>
-
-int mnt_init(void)
-{
- if (rt_device_find("virtio-blk0"))
- {
- /* mount virtio-blk as root directory */
- if (dfs_mount("virtio-blk0", "/", "elm", 0, RT_NULL) == 0)
- {
- rt_kprintf("file system initialization done!\n");
- }
- else
- {
- if (dfs_mount("virtio-blk0", "/", "ext", 0, RT_NULL) == 0)
- {
- rt_kprintf("file system initialization done!\n");
- }
- else
- {
- rt_kprintf("file system initialization fail!\n");
- }
- }
- }
-
- return 0;
-}
-INIT_ENV_EXPORT(mnt_init);
-#endif
diff --git a/bsp/qemu-virt64-riscv/driver/Kconfig b/bsp/qemu-virt64-riscv/driver/Kconfig
index 9f314e3c47..4782fe57dd 100644
--- a/bsp/qemu-virt64-riscv/driver/Kconfig
+++ b/bsp/qemu-virt64-riscv/driver/Kconfig
@@ -1,33 +1,9 @@
-menu "RISC-V QEMU virt64 configs"
+config RT_GRAPHIC_ROMFB_WIDTH
+ int "ROM FB width"
+ depends on RT_GRAPHIC_FB
+ default 800
-config BSP_USING_VIRTIO_BLK
- bool "Using VirtIO BLK"
- select RT_USING_LEGACY_VIRTIO
- select RT_USING_VIRTIO_BLK
- default y
-
-config BSP_USING_VIRTIO_NET
- bool "Using VirtIO NET"
- select RT_USING_LEGACY_VIRTIO
- select RT_USING_VIRTIO_NET
- default y
-
-config BSP_USING_VIRTIO_CONSOLE
- bool "Using VirtIO Console"
- select RT_USING_LEGACY_VIRTIO
- select RT_USING_VIRTIO_CONSOLE
- default y
-
-config BSP_USING_VIRTIO_GPU
- bool "Using VirtIO GPU"
- select RT_USING_LEGACY_VIRTIO
- select RT_USING_VIRTIO_GPU
- default y
-
-config BSP_USING_VIRTIO_INPUT
- bool "Using VirtIO Input"
- select RT_USING_LEGACY_VIRTIO
- select RT_USING_VIRTIO_INPUT
- default y
-
-endmenu
+config RT_GRAPHIC_ROMFB_HEIGHT
+ int "ROM FB height"
+ depends on RT_GRAPHIC_FB
+ default 600
diff --git a/bsp/qemu-virt64-riscv/driver/SConscript b/bsp/qemu-virt64-riscv/driver/SConscript
index faea9c1bd9..4b2321ae5a 100644
--- a/bsp/qemu-virt64-riscv/driver/SConscript
+++ b/bsp/qemu-virt64-riscv/driver/SConscript
@@ -3,17 +3,12 @@
from building import *
cwd = GetCurrentDir()
-src = Glob('*.c')
+src = ['board.c']
CPPPATH = [cwd]
-group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
-
-objs = [group]
+if GetDepend(['RT_GRAPHIC_FB']):
+ src += ['drv_romfb.c']
-list = os.listdir(cwd)
-
-for item in list:
- if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
- objs = objs + SConscript(os.path.join(item, 'SConscript'))
+group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
-Return('objs')
+Return('group')
diff --git a/bsp/qemu-virt64-riscv/driver/asm/sbiasm.h b/bsp/qemu-virt64-riscv/driver/asm/sbiasm.h
deleted file mode 100644
index 4639fba68c..0000000000
--- a/bsp/qemu-virt64-riscv/driver/asm/sbiasm.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef _SBI_ASM_H
-#define _SBI_ASM_H
-
-.macro SBI_CALL which
- li a7, \which
- ecall
- nop
-.endm
-
-#endif /* _SBI_ASM_H */
diff --git a/bsp/qemu-virt64-riscv/driver/asm/sbidef.h b/bsp/qemu-virt64-riscv/driver/asm/sbidef.h
deleted file mode 100644
index 5bcf58ade7..0000000000
--- a/bsp/qemu-virt64-riscv/driver/asm/sbidef.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2019-2020, Xim
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- */
-#ifndef _ASM_SBI_DEF_H
-#define _ASM_SBI_DEF_H
-
-#define SBI_SET_TIMER 0
-#define SBI_CONSOLE_PUTCHAR 1
-#define SBI_CONSOLE_GETCHAR 2
-#define SBI_CLEAR_IPI 3
-#define SBI_SEND_IPI 4
-#define SBI_REMOTE_FENCE_I 5
-#define SBI_REMOTE_SFENCE_VMA 6
-#define SBI_REMOTE_SFENCE_VMA_ASID 7
-#define SBI_SHUTDOWN 8
-
-#define SBI_CONSOLE_PUTSTR 9
-
-#define SBI_SD_WRITE 10
-#define SBI_SD_READ 11
-#define SBI_NET_WRITE 12
-#define SBI_NET_READ 13
-
-#endif /* _ASM_SBI_DEF_H */
diff --git a/bsp/qemu-virt64-riscv/driver/board.c b/bsp/qemu-virt64-riscv/driver/board.c
index 7250159e30..f3f1a56af1 100644
--- a/bsp/qemu-virt64-riscv/driver/board.c
+++ b/bsp/qemu-virt64-riscv/driver/board.c
@@ -1,122 +1,12 @@
/*
- * Copyright (c) 2006-2020, RT-Thread Development Team
+ * Copyright (c) 2006-2025, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2021-01-30 lizhirui first version
*/
-#include <rthw.h>
-#include <rtthread.h>
-#include <rtdevice.h>
-
-#include "board.h"
-#include "mm_aspace.h"
-#include "tick.h"
-
-#include "drv_uart.h"
-#include "encoding.h"
-#include "stack.h"
-#include "sbi.h"
-#include "riscv.h"
-#include "plic.h"
-#include "stack.h"
-
-#ifdef RT_USING_SMP
-#include "interrupt.h"
-#endif /* RT_USING_SMP */
-
-#ifdef RT_USING_SMART
-#include "riscv_mmu.h"
-#include "mmu.h"
-#include "page.h"
-#include "lwp_arch.h"
-
-rt_region_t init_page_region = {(rt_size_t)RT_HW_PAGE_START, (rt_size_t)RT_HW_PAGE_END};
-
-extern size_t MMUTable[];
-
-struct mem_desc platform_mem_desc[] = {
- {KERNEL_VADDR_START, (rt_size_t)RT_HW_PAGE_END - 1, (rt_size_t)ARCH_MAP_FAILED, NORMAL_MEM},
-};
-
-#define NUM_MEM_DESC (sizeof(platform_mem_desc) / sizeof(platform_mem_desc[0]))
-
-#endif
-
-rt_uint64_t rt_hw_get_clock_timer_freq(void)
-{
- return 10000000ULL;
-}
-
-void primary_cpu_entry(void)
-{
- /* disable global interrupt */
- rt_hw_interrupt_disable();
-
- entry();
-}
-
-#define IOREMAP_SIZE (1ul << 30)
-
-#ifndef ARCH_REMAP_KERNEL
-#define IOREMAP_VEND USER_VADDR_START
-#else
-#define IOREMAP_VEND 0ul
-#endif /* ARCH_REMAP_KERNEL */
+#include <setup.h>
void rt_hw_board_init(void)
{
-#ifdef RT_USING_SMART
- /* init data structure */
- rt_hw_mmu_map_init(&rt_kernel_space, (void *)(IOREMAP_VEND - IOREMAP_SIZE), IOREMAP_SIZE, (rt_size_t *)MMUTable, PV_OFFSET);
-
- /* init page allocator */
- rt_page_init(init_page_region);
-
- /* setup region, and enable MMU */
- rt_hw_mmu_setup(&rt_kernel_space, platform_mem_desc, NUM_MEM_DESC);
-#endif
-
-#ifdef RT_USING_HEAP
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-#endif
-
- plic_init();
-
- rt_hw_interrupt_init();
-
- rt_hw_uart_init();
-
-#ifdef RT_USING_CONSOLE
- /* set console device */
- rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
-#endif /* RT_USING_CONSOLE */
-
- rt_hw_tick_init();
-
-#ifdef RT_USING_SMP
- /* ipi init */
- rt_hw_ipi_init();
-#endif /* RT_USING_SMP */
-
-#ifdef RT_USING_COMPONENTS_INIT
- rt_components_board_init();
-#endif
-
-#ifdef RT_USING_HEAP
- rt_kprintf("heap: [0x%08x - 0x%08x]\n", (rt_ubase_t)RT_HW_HEAP_BEGIN, (rt_ubase_t)RT_HW_HEAP_END);
-#endif /* RT_USING_HEAP */
-}
-
-void rt_hw_cpu_reset(void)
-{
- sbi_shutdown();
-
- while (1)
- ;
+ rt_hw_common_setup();
}
-MSH_CMD_EXPORT_ALIAS(rt_hw_cpu_reset, reboot, reset machine);
diff --git a/bsp/qemu-virt64-riscv/driver/board.h b/bsp/qemu-virt64-riscv/driver/board.h
index 9c74ae6b26..e5d4619c13 100644
--- a/bsp/qemu-virt64-riscv/driver/board.h
+++ b/bsp/qemu-virt64-riscv/driver/board.h
@@ -1,11 +1,7 @@
/*
- * Copyright (c) 2006-2020, RT-Thread Development Team
+ * Copyright (c) 2006-2025, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2021-01-30 lizhirui first version
*/
#ifndef BOARD_H__
@@ -13,22 +9,9 @@
#include <rtconfig.h>
-extern unsigned int __bss_start;
-extern unsigned int __bss_end;
-
-#ifndef RT_USING_SMART
-#define KERNEL_VADDR_START 0x0
-#endif
-
-#define VIRT64_SBI_MEMSZ (0x200000)
-
-#define RT_HW_HEAP_BEGIN ((void *)&__bss_end)
-#define RT_HW_HEAP_END ((void *)(RT_HW_HEAP_BEGIN + 64 * 1024 * 1024))
-#define RT_HW_PAGE_START RT_HW_HEAP_END
-#define RT_HW_PAGE_END ((void *)(KERNEL_VADDR_START + (128 * 1024 * 1024 - VIRT64_SBI_MEMSZ)))
+extern unsigned char __bss_start;
+extern unsigned char __bss_end;
void rt_hw_board_init(void);
-void rt_init_user_mem(struct rt_thread *thread, const char *name,
- unsigned long *entry);
#endif
diff --git a/bsp/qemu-virt64-riscv/driver/drv_romfb.c b/bsp/qemu-virt64-riscv/driver/drv_romfb.c
new file mode 100644
index 0000000000..785658f96c
--- /dev/null
+++ b/bsp/qemu-virt64-riscv/driver/drv_romfb.c
@@ -0,0 +1,13 @@
+/*
+ * Copyright (c) 2006-2025, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include <rtthread.h>
+
+void platform_get_ramfb_params(rt_uint32_t *width, rt_uint32_t *height)
+{
+ *width = RT_GRAPHIC_ROMFB_WIDTH;
+ *height = RT_GRAPHIC_ROMFB_HEIGHT;
+}
diff --git a/bsp/qemu-virt64-riscv/driver/drv_uart.c b/bsp/qemu-virt64-riscv/driver/drv_uart.c
deleted file mode 100644
index 5e2a33e76c..0000000000
--- a/bsp/qemu-virt64-riscv/driver/drv_uart.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2006-2020, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- */
-
-#include <rthw.h>
-#include <rtdevice.h>
-#include <rtthread.h>
-
-#include "board.h"
-#include "drv_uart.h"
-
-#include <stdio.h>
-#ifdef RT_USING_SMART
-#include <ioremap.h>
-#endif
-#include "sbi.h"
-
-struct device_uart
-{
- rt_ubase_t hw_base;
- rt_uint32_t irqno;
-};
-
-void *uart0_base = (void*)0x10000000;
-struct rt_serial_device serial0;
-struct device_uart uart0;
-
-void uart_init(void)
-{
- rt_uint32_t div = UART_REFERENCE_CLOCK / (UART_DEFAULT_BAUDRATE * 16);
-
- write8_uart0(UART_IER, 0x00);
- write8_uart0(UART_LCR, UART_LCR_BAUD_LATCH);
-
- // LSB
- write8_uart0(0, div & 0xff);
- // MSB
- write8_uart0(1, (div >> 8) & 0xff);
-
- // set word length to 8 bits, no parity
- write8_uart0(UART_LCR, UART_LCR_EIGHT_BITS);
-
- write8_uart0(UART_FCR, UART_FCR_FIFO_ENABLE | UART_FCR_FIFO_CLEAR);
-
- return;
-}
-
-static rt_err_t _uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
-{
- return (RT_EOK);
-}
-
-static rt_err_t _uart_control(struct rt_serial_device *serial, int cmd, void *arg)
-{
- struct device_uart *uart = (struct device_uart*)serial->parent.user_data;
-
- switch (cmd)
- {
- case RT_DEVICE_CTRL_CLR_INT:
- if ((size_t)arg == RT_DEVICE_FLAG_INT_RX)
- {
- rt_uint8_t value = read8_uart0(UART_IER);
- write8_uart0(UART_IER, value & ~UART_IER_RX_ENABLE);
- }
- break;
-
- case RT_DEVICE_CTRL_SET_INT:
- if ((size_t)arg == RT_DEVICE_FLAG_INT_RX)
- {
- rt_uint8_t value = read8_uart0(UART_IER);
- write8_uart0(UART_IER, value | UART_IER_RX_ENABLE);
- }
- break;
- }
-
- return (RT_EOK);
-}
-
-static int _uart_putc(struct rt_serial_device *serial, char c)
-{
- struct device_uart *uart;
- uart = (struct device_uart*)serial->parent.user_data;
-
- // wait for Transmit Holding Empty to be set in LSR.
- while((read8_uart0(UART_LSR) & UART_LSR_TX_IDLE) == 0)
- ;
- write8_uart0(UART_THR, c);
-
- return (1);
-}
-
-static int _uart_getc(struct rt_serial_device *serial)
-{
- struct device_uart *uart;
- volatile rt_uint32_t lsr;
- int ch = -1;
-
- uart = (struct device_uart*)serial->parent.user_data;
- lsr = read8_uart0(UART_LSR);
-
- if (lsr & UART_LSR_RX_READY)
- {
- ch = read8_uart0(UART_RHR);
- }
- return ch;
-}
-
-const struct rt_uart_ops _uart_ops = {
- _uart_configure,
- _uart_control,
- _uart_putc,
- _uart_getc,
- // TODO: add DMA support
- RT_NULL};
-
-static void rt_hw_uart_isr(int irqno, void *param)
-{
- rt_ubase_t level = rt_hw_interrupt_disable();
-
- struct rt_serial_device *serial = (struct rt_serial_device *)param;
-
- rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
-
- rt_hw_interrupt_enable(level);
-}
-
-/*
- * UART Initiation
- */
-int rt_hw_uart_init(void)
-{
- struct rt_serial_device *serial;
- struct device_uart *uart;
- struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
-#ifdef RT_USING_SMART
- uart0_base = rt_ioremap(uart0_base, 4096);
-#endif
- // register device
- serial = &serial0;
- uart = &uart0;
-
- serial->ops = &_uart_ops;
- serial->config = config;
- serial->config.baud_rate = UART_DEFAULT_BAUDRATE;
- uart->hw_base = (rt_ubase_t)uart0_base;
- uart->irqno = 0x0a;
-
- rt_hw_serial_register(serial,
- RT_CONSOLE_DEVICE_NAME,
- RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
- uart);
- rt_hw_interrupt_install(uart->irqno, rt_hw_uart_isr, serial, RT_CONSOLE_DEVICE_NAME);
- rt_hw_interrupt_umask(uart->irqno);
- return 0;
-}
-
-/* WEAK for SDK 0.5.6 */
-rt_weak void uart_debug_init(int uart_channel)
-{
-}
diff --git a/bsp/qemu-virt64-riscv/driver/drv_uart.h b/bsp/qemu-virt64-riscv/driver/drv_uart.h
deleted file mode 100644
index faba48c8a6..0000000000
--- a/bsp/qemu-virt64-riscv/driver/drv_uart.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2006-2020, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- */
-
-#ifndef __DRV_UART_H__
-#define __DRV_UART_H__
-
-#include "riscv_io.h"
-
-/**
- * uart ns16550a
- * http://byterunner.com/16550.html
- */
-
-/* TRANSMIT AND RECEIVE HOLDING REGISTER */
-#define UART_RHR 0
-#define UART_THR 0
-
-/* INTERRUPT ENABLE REGISTER */
-#define UART_IER 1
-#define UART_IER_RX_ENABLE (1 << 0)
-#define UART_IER_TX_ENABLE (1 << 1)
-
-/* FIFO CONTROL REGISTER */
-#define UART_FCR 2
-#define UART_FCR_FIFO_ENABLE (1 << 0)
-#define UART_FCR_FIFO_CLEAR (3 << 1)
-
-/* INTERRUPT STATUS REGISTER */
-#define UART_ISR 2
-
-/* LINE CONTROL REGISTER */
-#define UART_LCR 3
-#define UART_LCR_EIGHT_BITS (3 << 0)
-// special mode to set baud rate
-#define UART_LCR_BAUD_LATCH (1 << 7)
-
-/* LINE STATUS REGISTER */
-#define UART_LSR 5
-// input is waiting to be read from RHR
-#define UART_LSR_RX_READY (1 << 0)
-// THR can accept another character to send
-#define UART_LSR_TX_IDLE (1 << 5)
-
-#define UART_REFERENCE_CLOCK 1843200
-#define UART_DEFAULT_BAUDRATE 115200
-
-extern void *uart0_base;
-
-#define write8_uart0(idx, value) __raw_writeb(((rt_uint8_t)value), (void*)((size_t)uart0_base + (idx)))
-#define read8_uart0(idx) __raw_readb((void*)((size_t)uart0_base + (idx)))
-
-void rt_hw_uart_start_rx_thread();
-int rt_hw_uart_init(void);
-void drv_uart_puts(char *str); // for syscall
-
-#endif /* __DRV_UART_H__ */
diff --git a/bsp/qemu-virt64-riscv/driver/drv_virtio.c b/bsp/qemu-virt64-riscv/driver/drv_virtio.c
deleted file mode 100644
index 0b9787810e..0000000000
--- a/bsp/qemu-virt64-riscv/driver/drv_virtio.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2006-2021, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2021-11-11 GuEe-GUI the first version
- */
-
-#include <rtthread.h>
-#include <virt.h>
-
-#ifdef RT_USING_LEGACY_VIRTIO
-
-#include <virtio.h>
-#ifdef BSP_USING_VIRTIO_BLK
-#include <virtio_blk.h>
-#endif
-#ifdef BSP_USING_VIRTIO_NET
-#include <virtio_net.h>
-#endif
-#ifdef BSP_USING_VIRTIO_CONSOLE
-#include <virtio_console.h>
-#endif
-#ifdef BSP_USING_VIRTIO_GPU
-#include <virtio_gpu.h>
-#endif
-#ifdef BSP_USING_VIRTIO_INPUT
-#include <virtio_input.h>
-#endif
-
-#include <board.h>
-
-static virtio_device_init_handler virtio_device_init_handlers[] =
-{
-#ifdef BSP_USING_VIRTIO_BLK
- [VIRTIO_DEVICE_ID_BLOCK] = rt_virtio_blk_init,
-#endif
-#ifdef BSP_USING_VIRTIO_NET
- [VIRTIO_DEVICE_ID_NET] = rt_virtio_net_init,
-#endif
-#ifdef BSP_USING_VIRTIO_CONSOLE
- [VIRTIO_DEVICE_ID_CONSOLE] = rt_virtio_console_init,
-#endif
-#ifdef BSP_USING_VIRTIO_GPU
- [VIRTIO_DEVICE_ID_GPU] = rt_virtio_gpu_init,
-#endif
-#ifdef BSP_USING_VIRTIO_INPUT
- [VIRTIO_DEVICE_ID_INPUT] = rt_virtio_input_init,
-#endif
- [VIRTIO_DEVICE_TYPE_SIZE] = RT_NULL
-};
-
-int rt_virtio_devices_init(void)
-{
- int i;
- rt_uint32_t irq = VIRTIO_IRQ_BASE;
- rt_ubase_t mmio_base = VIRTIO_MMIO_BASE;
- struct virtio_mmio_config *mmio_config;
- virtio_device_init_handler init_handler;
-
- if (sizeof(virtio_device_init_handlers) == 0)
- {
- /* The compiler will optimize the codes after here. */
- return 0;
- }
-
-#ifdef RT_USING_SMART
- mmio_base = (rt_ubase_t)rt_ioremap((void *)mmio_base, VIRTIO_MMIO_SIZE * VIRTIO_MAX_NR);
-
- if (mmio_base == RT_NULL)
- {
- return -RT_ERROR;
- }
-#endif
-
- for (i = 0; i < VIRTIO_MAX_NR; ++i, ++irq, mmio_base += VIRTIO_MMIO_SIZE)
- {
- mmio_config = (struct virtio_mmio_config *)mmio_base;
-
- if (mmio_config->magic != VIRTIO_MAGIC_VALUE ||
- mmio_config->version != RT_USING_VIRTIO_VERSION ||
- mmio_config->vendor_id != VIRTIO_VENDOR_ID)
- {
- continue;
- }
-
- init_handler = virtio_device_init_handlers[mmio_config->device_id];
-
- if (init_handler != RT_NULL)
- {
- init_handler((rt_ubase_t *)mmio_base, irq);
- }
- }
-
- return 0;
-}
-INIT_DEVICE_EXPORT(rt_virtio_devices_init);
-#endif /* RT_USING_LEGACY_VIRTIO */
diff --git a/bsp/qemu-virt64-riscv/driver/drv_virtio.h b/bsp/qemu-virt64-riscv/driver/drv_virtio.h
deleted file mode 100644
index 954338a386..0000000000
--- a/bsp/qemu-virt64-riscv/driver/drv_virtio.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright (c) 2006-2021, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2021-11-11 GuEe-GUI the first version
- */
-
-#ifndef __DRV_VIRTIO_H__
-#define __DRV_VIRTIO_H__
-
-int rt_virtio_devices_init(void);
-
-#endif /* __DRV_VIRTIO_H__ */
diff --git a/bsp/qemu-virt64-riscv/driver/virt.h b/bsp/qemu-virt64-riscv/driver/virt.h
deleted file mode 100644
index f059feb50e..0000000000
--- a/bsp/qemu-virt64-riscv/driver/virt.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2006-2021, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2021-02-17 GuEe-GUI the first version
- */
-
-#ifndef VIRT_H__
-#define VIRT_H__
-
-#include <rtdef.h>
-
-#ifdef RT_USING_SMART
-#include <mmu.h>
-#include <ioremap.h>
-
-#endif
-
-/* VirtIO */
-#define VIRTIO_MMIO_BASE 0x10001000
-#define VIRTIO_MMIO_SIZE 0x00001000
-#define VIRTIO_MAX_NR 8
-#define VIRTIO_IRQ_BASE 1
-#define VIRTIO_VENDOR_ID 0x554d4551 /* "QEMU" */
-
-#define MAX_HANDLERS 128
-#endif
diff --git a/bsp/qemu-virt64-riscv/link.lds b/bsp/qemu-virt64-riscv/link.lds
deleted file mode 100644
index da750aca9b..0000000000
--- a/bsp/qemu-virt64-riscv/link.lds
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (c) 2006-2023, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2020/12/12 bernard The first version
- */
-
-INCLUDE "link_stacksize.lds"
-INCLUDE "link_cpus.lds"
-
-OUTPUT_ARCH( "riscv" )
-
-/*
- * Memory layout:
- * 0x80000000 - 0x80200000: SBI
- * 0x80200000 - 0x81200000: Kernel
- */
-
-MEMORY
-{
- SRAM : ORIGIN = 0x80200000, LENGTH = 0x1000000
-}
-
-ENTRY(_start)
-SECTIONS
-{
- . = 0x80200000 ;
-
- /* __STACKSIZE__ = 4096; */
- __text_start = .;
- .start :
- {
- *(.start);
- } > SRAM
-
- . = ALIGN(8);
-
- .text :
- {
- *(.text) /* remaining code */
- *(.text.*) /* remaining code */
- *(.rodata) /* read-only data (constants) */
- *(.rodata*)
- *(.glue_7)
- *(.glue_7t)
- *(.gnu.linkonce.t*)
-
- /* section information for finsh shell */
- . = ALIGN(8);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(8);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(8);
-
- /* section information for initial. */
- . = ALIGN(8);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(8);
-
- __rt_utest_tc_tab_start = .;
- KEEP(*(UtestTcTab))
- __rt_utest_tc_tab_end = .;
-
- . = ALIGN(8);
- _etext = .;
- } > SRAM
-
- .eh_frame_hdr :
- {
- *(.eh_frame_hdr)
- *(.eh_frame_entry)
- } > SRAM
- .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } > SRAM
-
- . = ALIGN(8);
- __text_end = .;
- __text_size = __text_end - __text_start;
-
- .data :
- {
- *(.data)
- *(.data.*)
-
- *(.data1)
- *(.data1.*)
-
- . = ALIGN(8);
- PROVIDE( __global_pointer$ = . + 0x800 );
-
- *(.sdata)
- *(.sdata.*)
- } > SRAM
-
- . = ALIGN(8);
- .ctors :
- {
- PROVIDE(__ctors_start__ = .);
- KEEP(*(SORT(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__ctors_end__ = .);
- } > SRAM
-
- .dtors :
- {
- PROVIDE(__dtors_start__ = .);
- KEEP(*(SORT(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__dtors_end__ = .);
- } > SRAM
-
- /* stack for dual core */
- .stack :
- {
- . = ALIGN(64);
- __stack_start__ = .;
- /* Dynamically allocate stack areas according to RT_CPUS_NR */
- . += (__STACKSIZE__ * RT_CPUS_NR);
- __stack_end__ = .;
- } > SRAM
-
- .sbss :
- {
- __bss_start = .;
- *(.sbss)
- *(.sbss.*)
- *(.dynsbss)
- *(.scommon)
- } > SRAM
-
- .percpu (NOLOAD) :
- {
- /* 2MB Align for MMU early map */
- . = ALIGN(0x200000);
- PROVIDE(__percpu_start = .);
-
- *(.percpu)
-
- /* 2MB Align for MMU early map */
- . = ALIGN(0x200000);
-
- PROVIDE(__percpu_end = .);
-
- /* Clone the area */
- . = __percpu_end + (__percpu_end - __percpu_start) * (RT_CPUS_NR - 1);
- PROVIDE(__percpu_real_end = .);
- } > SRAM
-
- .bss :
- {
- *(.bss)
- *(.bss.*)
- *(.dynbss)
- *(COMMON)
- __bss_end = .;
- } > SRAM
-
- _end = .;
-
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
- /* DWARF debug sections.
- * Symbols in the DWARF debugging sections are relative to the beginning
- * of the section so we begin them at 0. */
- /* DWARF 1 */
- .debug 0 : { *(.debug) }
- .line 0 : { *(.line) }
- /* GNU DWARF 1 extensions */
- .debug_srcinfo 0 : { *(.debug_srcinfo) }
- .debug_sfnames 0 : { *(.debug_sfnames) }
- /* DWARF 1.1 and DWARF 2 */
- .debug_aranges 0 : { *(.debug_aranges) }
- .debug_pubnames 0 : { *(.debug_pubnames) }
- /* DWARF 2 */
- .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
- .debug_abbrev 0 : { *(.debug_abbrev) }
- .debug_line 0 : { *(.debug_line) }
- .debug_frame 0 : { *(.debug_frame) }
- .debug_str 0 : { *(.debug_str) }
- .debug_loc 0 : { *(.debug_loc) }
- .debug_macinfo 0 : { *(.debug_macinfo) }
- /* SGI/MIPS DWARF 2 extensions */
- .debug_weaknames 0 : { *(.debug_weaknames) }
- .debug_funcnames 0 : { *(.debug_funcnames) }
- .debug_typenames 0 : { *(.debug_typenames) }
- .debug_varnames 0 : { *(.debug_varnames) }
-}
diff --git a/bsp/qemu-virt64-riscv/link_cpus.lds b/bsp/qemu-virt64-riscv/link_cpus.lds
deleted file mode 100644
index e4cd5b8871..0000000000
--- a/bsp/qemu-virt64-riscv/link_cpus.lds
+++ /dev/null
@@ -1 +0,0 @@
-RT_CPUS_NR = 1;
diff --git a/bsp/qemu-virt64-riscv/link_smart.lds b/bsp/qemu-virt64-riscv/link_smart.lds
deleted file mode 100644
index 29d33fdbb1..0000000000
--- a/bsp/qemu-virt64-riscv/link_smart.lds
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (c) 2006-2023, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2020/12/12 bernard The first version
- */
-
-INCLUDE "link_stacksize.lds"
-INCLUDE "link_cpus.lds"
-
-OUTPUT_ARCH( "riscv" )
-
-/*
- * Memory layout:
- * 0x80000000 - 0x80200000: SBI
- * 0x80200000 - 0x81200000: Kernel
- */
-
-MEMORY
-{
- SRAM : ORIGIN = 0xFFFFFFC000200000, LENGTH = 0x1000000 - 0x200000
-}
-
-ENTRY(_start)
-SECTIONS
-{
- /* . = 0x80200000 ; */
- . = 0xFFFFFFC000200000;
-
- /* __STACKSIZE__ = 4096; */
- __text_start = .;
- .start :
- {
- *(.start);
- } > SRAM
-
- . = ALIGN(8);
-
- .text :
- {
- *(.text) /* remaining code */
- *(.text.*) /* remaining code */
- *(.rodata) /* read-only data (constants) */
- *(.rodata*)
- *(.glue_7)
- *(.glue_7t)
- *(.gnu.linkonce.t*)
-
- /* section information for finsh shell */
- . = ALIGN(8);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(8);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(8);
-
- /* section information for initial. */
- . = ALIGN(8);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(8);
-
- __rt_utest_tc_tab_start = .;
- KEEP(*(UtestTcTab))
- __rt_utest_tc_tab_end = .;
-
- . = ALIGN(8);
- _etext = .;
- } > SRAM
-
- .eh_frame_hdr :
- {
- *(.eh_frame_hdr)
- *(.eh_frame_entry)
- } > SRAM
- .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } > SRAM
-
- . = ALIGN(8);
- __text_end = .;
- __text_size = __text_end - __text_start;
-
- .data :
- {
- *(.data)
- *(.data.*)
-
- *(.data1)
- *(.data1.*)
-
- . = ALIGN(8);
- PROVIDE( __global_pointer$ = . + 0x800 );
-
- *(.sdata)
- *(.sdata.*)
- } > SRAM
-
- . = ALIGN(8);
- .ctors :
- {
- PROVIDE(__ctors_start__ = .);
- KEEP(*(SORT(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__ctors_end__ = .);
- } > SRAM
-
- .dtors :
- {
- PROVIDE(__dtors_start__ = .);
- KEEP(*(SORT(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__dtors_end__ = .);
- } > SRAM
-
- /* stack for dual core */
- .stack :
- {
- . = ALIGN(64);
- __stack_start__ = .;
- /* Dynamically allocate stack areas according to RT_CPUS_NR */
- . += (__STACKSIZE__ * RT_CPUS_NR);
- __stack_end__ = .;
- } > SRAM
-
- .sbss :
- {
- __bss_start = .;
- *(.sbss)
- *(.sbss.*)
- *(.dynsbss)
- *(.scommon)
- } > SRAM
-
- .percpu (NOLOAD) :
- {
- /* 2MB Align for MMU early map */
- . = ALIGN(0x200000);
- PROVIDE(__percpu_start = .);
-
- *(.percpu)
-
- /* 2MB Align for MMU early map */
- . = ALIGN(0x200000);
-
- PROVIDE(__percpu_end = .);
-
- /* Clone the area */
- . = __percpu_end + (__percpu_end - __percpu_start) * (RT_CPUS_NR - 1);
- PROVIDE(__percpu_real_end = .);
- } > SRAM
-
- .bss :
- {
- *(.bss)
- *(.bss.*)
- *(.dynbss)
- *(COMMON)
- __bss_end = .;
- } > SRAM
-
- _end = .;
-
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
- /* DWARF debug sections.
- * Symbols in the DWARF debugging sections are relative to the beginning
- * of the section so we begin them at 0. */
- /* DWARF 1 */
- .debug 0 : { *(.debug) }
- .line 0 : { *(.line) }
- /* GNU DWARF 1 extensions */
- .debug_srcinfo 0 : { *(.debug_srcinfo) }
- .debug_sfnames 0 : { *(.debug_sfnames) }
- /* DWARF 1.1 and DWARF 2 */
- .debug_aranges 0 : { *(.debug_aranges) }
- .debug_pubnames 0 : { *(.debug_pubnames) }
- /* DWARF 2 */
- .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
- .debug_abbrev 0 : { *(.debug_abbrev) }
- .debug_line 0 : { *(.debug_line) }
- .debug_frame 0 : { *(.debug_frame) }
- .debug_str 0 : { *(.debug_str) }
- .debug_loc 0 : { *(.debug_loc) }
- .debug_macinfo 0 : { *(.debug_macinfo) }
- /* SGI/MIPS DWARF 2 extensions */
- .debug_weaknames 0 : { *(.debug_weaknames) }
- .debug_funcnames 0 : { *(.debug_funcnames) }
- .debug_typenames 0 : { *(.debug_typenames) }
- .debug_varnames 0 : { *(.debug_varnames) }
-}
diff --git a/bsp/qemu-virt64-riscv/link_stacksize.lds b/bsp/qemu-virt64-riscv/link_stacksize.lds
deleted file mode 100644
index 14c2aad91f..0000000000
--- a/bsp/qemu-virt64-riscv/link_stacksize.lds
+++ /dev/null
@@ -1 +0,0 @@
-__STACKSIZE__ = 16384;
diff --git a/bsp/qemu-virt64-riscv/qemu-dbg.sh b/bsp/qemu-virt64-riscv/qemu-dbg.sh
deleted file mode 100755
index 69f62e7f6f..0000000000
--- a/bsp/qemu-virt64-riscv/qemu-dbg.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-QEMU_CMD="qemu-system-riscv64 -nographic -machine virt -m 256M -kernel rtthread.bin -s -S"
-
-if grep -q "#define RT_USING_SMP" ./rtconfig.h 2>/dev/null; then
- hart_num=$(grep "RT_CPUS_NR = [0-9]*;" ./link_cpus.lds | awk -F'[=;]' '{gsub(/ /, "", $2); print $2}')
- if [ -z "$hart_num" ]; then
- hart_num=1
- fi
- QEMU_CMD="$QEMU_CMD -smp $hart_num"
-fi
-
-QEMU_CMD="$QEMU_CMD \
--drive if=none,file=sd.bin,format=raw,id=blk0 -device virtio-blk-device,drive=blk0,bus=virtio-mmio-bus.0 \
--netdev user,id=tap0 -device virtio-net-device,netdev=tap0,bus=virtio-mmio-bus.1 \
--device virtio-serial-device -chardev socket,host=127.0.0.1,port=4321,server=on,wait=off,telnet=on,id=console0 -device virtserialport,chardev=console0"
-
-eval $QEMU_CMD \ No newline at end of file
diff --git a/bsp/qemu-virt64-riscv/qemu-dumpdtb.sh b/bsp/qemu-virt64-riscv/qemu-dumpdtb.sh
deleted file mode 100755
index 12068b571a..0000000000
--- a/bsp/qemu-virt64-riscv/qemu-dumpdtb.sh
+++ /dev/null
@@ -1 +0,0 @@
-qemu-system-riscv64 -nographic -machine virt,dumpdtb=virt.dtb -m 256M -kernel rtthread.bin
diff --git a/bsp/qemu-virt64-riscv/qemu-nographic.bat b/bsp/qemu-virt64-riscv/qemu-nographic.bat
deleted file mode 100644
index df55b35e84..0000000000
--- a/bsp/qemu-virt64-riscv/qemu-nographic.bat
+++ /dev/null
@@ -1,9 +0,0 @@
-@echo off
-if exist sd.bin goto run
-qemu-img create -f raw sd.bin 64M
-
-:run
-qemu-system-riscv64 -nographic -machine virt -m 256M -kernel rtthread.bin ^
--drive if=none,file=sd.bin,format=raw,id=blk0 -device virtio-blk-device,drive=blk0,bus=virtio-mmio-bus.0 ^
--netdev user,id=tap0 -device virtio-net-device,netdev=tap0,bus=virtio-mmio-bus.1 ^
--device virtio-serial-device -chardev socket,host=127.0.0.1,port=4321,server=on,wait=off,telnet=on,id=console0 -device virtserialport,chardev=console0
diff --git a/bsp/qemu-virt64-riscv/qemu-rv64ilp32-nographic.sh b/bsp/qemu-virt64-riscv/qemu-rv64ilp32-nographic.sh
deleted file mode 100755
index 798cb9d3d7..0000000000
--- a/bsp/qemu-virt64-riscv/qemu-rv64ilp32-nographic.sh
+++ /dev/null
@@ -1 +0,0 @@
-qemu-system-riscv64ilp32 -cpu rv64 -M virt -m 256M -nographic -kernel rtthread.elf
diff --git a/bsp/qemu-virt64-riscv/qemu-v-dbg.sh b/bsp/qemu-virt64-riscv/qemu-v-dbg.sh
deleted file mode 100644
index d22af856cb..0000000000
--- a/bsp/qemu-virt64-riscv/qemu-v-dbg.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-qemu-system-riscv64 -nographic -machine virt -cpu rv64,v=true,vlen=128,vext_spec=v1.0 -m 256M -kernel rtthread.bin \
--drive if=none,file=sd.bin,format=raw,id=blk0 -device virtio-blk-device,drive=blk0,bus=virtio-mmio-bus.0 \
--netdev user,id=tap0 -device virtio-net-device,netdev=tap0,bus=virtio-mmio-bus.1 -s -S \
--device virtio-serial-device -chardev socket,host=127.0.0.1,port=4321,server=on,wait=off,telnet=on,id=console0 -device virtserialport,chardev=console0
diff --git a/bsp/qemu-virt64-riscv/qemu-v-nographic.sh b/bsp/qemu-virt64-riscv/qemu-v-nographic.sh
deleted file mode 100644
index 068ff4fa6c..0000000000
--- a/bsp/qemu-virt64-riscv/qemu-v-nographic.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-if [ ! -f "sd.bin" ]; then
-dd if=/dev/zero of=sd.bin bs=1024 count=65536
-mkfs.fat sd.bin
-fi
-
-qemu-system-riscv64 -nographic -machine virt -cpu rv64,v=true,vlen=128,vext_spec=v1.0 -m 256M -kernel rtthread.bin \
--drive if=none,file=sd.bin,format=raw,id=blk0 -device virtio-blk-device,drive=blk0,bus=virtio-mmio-bus.0 \
--netdev user,id=tap0 -device virtio-net-device,netdev=tap0,bus=virtio-mmio-bus.1 \
--device virtio-serial-device -chardev socket,host=127.0.0.1,port=4321,server=on,wait=off,telnet=on,id=console0 -device virtserialport,chardev=console0
diff --git a/bsp/qemu-virt64-riscv/qemu.py b/bsp/qemu-virt64-riscv/qemu.py
new file mode 100755
index 0000000000..110ee26cd1
--- /dev/null
+++ b/bsp/qemu-virt64-riscv/qemu.py
@@ -0,0 +1,356 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+import argparse
+import os
+import re
+import shlex
+import shutil
+import subprocess
+import sys
+
+
+def read_default_cpus():
+ try:
+ with open("rtconfig.h", "r", encoding="utf-8") as f:
+ rtconfig = f.read()
+ except OSError:
+ return 1
+
+ match = re.search(r"#define\s+RT_CPUS_NR\s+(\d+)", rtconfig)
+ return int(match.group(1)) if match else 1
+
+
+def read_riscv_xlen():
+ try:
+ with open("rtconfig.h", "r", encoding="utf-8") as f:
+ rtconfig = f.read()
+ except OSError:
+ return 64
+
+ return 64 if re.search(r"#define\s+ARCH_RISCV64\b", rtconfig) else 32
+
+
+def read_vector_vlen():
+ try:
+ with open("rtconfig.h", "r", encoding="utf-8") as f:
+ rtconfig = f.read()
+ except OSError:
+ return None
+
+ if not re.search(r"#define\s+ARCH_RISCV_VECTOR\b", rtconfig):
+ return None
+
+ match = re.search(r"#define\s+ARCH_VECTOR_VLEN_(128|256|512|1024|2048|4096)\b", rtconfig)
+ return int(match.group(1)) if match else 128
+
+
+def using_rt_smart():
+ try:
+ with open("rtconfig.h", "r", encoding="utf-8") as f:
+ rtconfig = f.read()
+ except OSError:
+ return False
+
+ return re.search(r"#define\s+RT_USING_SMART\b", rtconfig) is not None
+
+
+def qemu_tool(name):
+ root = os.getenv("RTT_QEMU_ROOT", "")
+ return os.path.join(root, name) if root else name
+
+
+def qemu_version(qemu):
+ try:
+ output = subprocess.check_output(
+ [qemu, "--version"],
+ stderr=subprocess.STDOUT,
+ text=True,
+ )
+ except (OSError, subprocess.SubprocessError):
+ return None
+
+ match = re.search(r"version\s+(\d+)\.(\d+)\.(\d+)", output)
+ if not match:
+ return None
+
+ return tuple(int(v) for v in match.groups())
+
+
+def version_to_string(version):
+ if version is None:
+ return "unknown"
+ return ".".join(str(v) for v in version)
+
+
+def qcow2_image(name):
+ return name if name.endswith(".qcow2") else "{}.qcow2".format(name)
+
+
+def ensure_qcow2(name, size_mb, create=True):
+ image = qcow2_image(name)
+
+ if create and not os.path.exists(image):
+ subprocess.run(
+ [qemu_tool("qemu-img"), "create", "-f", "qcow2", image, "{}M".format(size_mb)],
+ check=True,
+ )
+
+ return image
+
+
+def add_cpu_options(cpu, options):
+ if not options:
+ return cpu
+ return "{},{}".format(cpu, ",".join(options))
+
+
+def virtio_device(name, args, params=""):
+ if args.pci:
+ device = "virtio-{}-pci,disable-legacy=on".format(name)
+ else:
+ device = "virtio-{}-device".format(name)
+
+ return "{},{}".format(device, params) if params else device
+
+
+def dump_dtb_to_dts(dtb):
+ dtc = shutil.which("dtc")
+ if not dtc:
+ print("Warning: dtc not found, skip {} -> dts conversion".format(dtb))
+ return
+
+ dts = re.sub(r"\.dtbo?$", ".dts", dtb)
+ if dts == dtb:
+ dts = "{}.dts".format(dtb)
+
+ subprocess.run([dtc, "-I", "dtb", "-O", "dts", dtb, "-o", dts], check=False)
+
+
+def parse_args():
+ parser = argparse.ArgumentParser(description="Run RT-Thread on QEMU virt RISC-V.")
+
+ parser.add_argument("-smp", type=int, default=read_default_cpus())
+ parser.add_argument("-mem", type=int, default=256)
+ parser.add_argument("-cpu", default="max")
+ parser.add_argument("-kernel", default="rtthread.bin")
+ parser.add_argument("-debug", action="store_true", help="Wait for GDB on :1234.")
+ parser.add_argument("-dumpdtb", metavar="FILE", help="Dump QEMU generated DTB and exit.")
+ parser.add_argument("-dtb", metavar="FILE", help="Use an external DTB.")
+ parser.add_argument(
+ "-bootargs",
+ default="console=ttyS0 earlycon=sbi cma=8M coherent_pool=2M root=vda0 rootfstype=elm rootwait rw",
+ )
+ parser.add_argument("-initrd", metavar="FILE")
+
+ parser.add_argument("-graphic", action="store_true")
+ parser.add_argument("-gl", metavar="BACKEND", help="Enable OpenGL display backend, for example gtk or sdl.")
+ parser.add_argument("-sound", choices=["none", "hda", "virtio"], default="none")
+
+ parser.add_argument("-net", dest="net", action="store_true", default=True,
+ help="Attach virtio-net using QEMU user networking. This is enabled by default.")
+ parser.add_argument("-no-net", dest="net", action="store_false", help="Disable virtio-net.")
+ parser.add_argument("-tap", action="store_true", help="Attach virtio-net to tap0.")
+ parser.add_argument("-ssh", type=int, default=12055)
+ parser.add_argument("-9p", dest="host_9p", metavar="PATH")
+
+ parser.add_argument("-pci", action="store_true", help="Use virtio PCI devices instead of virtio-mmio devices.")
+ parser.add_argument("-virtio-console", dest="virtio_console", action="store_true", default=None,
+ help="Expose virtio-console on localhost:4321. This is enabled by default for RV64.")
+ parser.add_argument("-no-virtio-console", dest="virtio_console", action="store_false", default=None,
+ help="Disable virtio-console.")
+ parser.add_argument("-pci-serial", dest="pci_serial", action="store_true", default=None,
+ help="Expose PCI serial on localhost:4322. This is enabled by default for RV64.")
+ parser.add_argument("-no-pci-serial", dest="pci_serial", action="store_false", default=None,
+ help="Disable PCI serial.")
+
+ parser.add_argument("-block", "-virtio-block", dest="block", default="virtio")
+ parser.add_argument("-nvme", nargs="?", const="nvme", default=argparse.SUPPRESS, metavar="NAME",
+ help="Attach an NVMe disk. This is enabled by default for RV64.")
+ parser.add_argument("-no-nvme", dest="nvme", action="store_const", const=None,
+ default=argparse.SUPPRESS, help="Disable NVMe disk.")
+ parser.add_argument("-watchdog", dest="watchdog", action="store_true", default=False,
+ help="Attach i6300esb watchdog.")
+ parser.add_argument("-no-watchdog", dest="watchdog", action="store_false", help="Disable watchdog.")
+ parser.add_argument("-edu", dest="edu", action="store_true", default=False,
+ help="Attach QEMU edu PCI test device.")
+ parser.add_argument("-no-edu", dest="edu", action="store_false", help="Disable QEMU edu device.")
+
+ parser.add_argument("-rv64ilp32", action="store_true")
+ parser.add_argument("-v", action="store_true", help="Enable QEMU vector CPU option even if disabled in rtconfig.h.")
+ parser.add_argument("-aia", dest="aia", action="store_true", default=None,
+ help="Use AIA APLIC/IMSIC instead of PLIC/ACLINT. This is enabled by default for RV64.")
+ parser.add_argument("-no-aia", dest="aia", action="store_false", help="Use PLIC/CLINT instead of AIA.")
+ parser.add_argument("-no-msi", action="store_true", help="Compatibility option; same as disabling AIA.")
+ parser.add_argument("-dry-run", action="store_true", help="Print QEMU command without running it.")
+
+ return parser.parse_args()
+
+
+def main():
+ args = parse_args()
+
+ configured_cpus = read_default_cpus()
+ if args.smp != configured_cpus:
+ print(
+ "Error: -smp {} does not match RT_CPUS_NR={} in rtconfig.h. "
+ "Reconfigure and rebuild the kernel before changing the CPU count.".format(
+ args.smp, configured_cpus
+ )
+ )
+ return 1
+
+ xlen = read_riscv_xlen()
+ if args.aia is None:
+ args.aia = xlen == 64
+ if not hasattr(args, "nvme"):
+ args.nvme = "nvme" if xlen == 64 and args.aia and not args.no_msi else None
+ if args.virtio_console is None:
+ args.virtio_console = xlen == 64
+ if args.pci_serial is None:
+ args.pci_serial = xlen == 64
+
+ qemu = qemu_tool("qemu-system-riscv{}".format(xlen))
+ virtio_mmio_legacy = "true" if xlen == 32 else "false"
+ if args.rv64ilp32:
+ if xlen != 64:
+ print("Error: -rv64ilp32 requires an RV64 kernel configuration.")
+ return 1
+ qemu = qemu_tool("qemu-system-rv64ilp32")
+
+ if args.gl and not args.graphic:
+ print("Error: -gl requires -graphic")
+ return 1
+
+ if args.tap and not args.net:
+ print("Error: -tap conflicts with -no-net")
+ return 1
+
+ qemu_ver = qemu_version(qemu)
+ if args.sound == "virtio" and qemu_ver is not None and qemu_ver < (8, 2, 0):
+ print("Error: virtio sound requires QEMU >= 8.2.0, current {}".format(version_to_string(qemu_ver)))
+ return 1
+
+ aia = "aia=aplic-imsic" if args.aia and not args.no_msi else "aia=none"
+ machine = "virt,acpi=on,aclint=on,{}".format(aia)
+
+ if args.dumpdtb:
+ machine += ",dumpdtb={}".format(args.dumpdtb)
+
+ cpu_options = []
+ if using_rt_smart() and args.cpu in ("max", "rv64"):
+ cpu_options += ["sv57=off", "sv48=off"]
+
+ vector_vlen = read_vector_vlen()
+ if args.v or vector_vlen:
+ cpu_options += ["v=true", "vlen={}".format(vector_vlen or 128), "vext_spec=v1.0"]
+ cpu = add_cpu_options(args.cpu, cpu_options)
+
+ create_images = not args.dry_run
+ block = ensure_qcow2(args.block, 64, create_images)
+
+ if args.tap:
+ netdev = "tap,ifname=tap0,script=no,downscript=no,id=net0"
+ else:
+ netdev = "user,hostfwd=tcp::{}-:22,id=net0".format(args.ssh)
+
+ bootargs = args.bootargs
+ if args.host_9p:
+ bootargs += " 9p.tag=hostshare 9p.mount=host"
+
+ cmd = [
+ qemu,
+ "-M", machine,
+ "-cpu", cpu,
+ "-smp", str(args.smp),
+ "-m", str(args.mem),
+ "-kernel", args.kernel,
+ "-append", bootargs,
+ "-serial", "mon:stdio",
+ "-global", "virtio-mmio.force-legacy={}".format(virtio_mmio_legacy),
+ "-drive", "if=none,file={},format=qcow2,id=blk0".format(block),
+ "-device", virtio_device("blk", args, "drive=blk0"),
+ "-device", virtio_device("rng", args),
+ "-device", virtio_device("crypto", args, "cryptodev=vcrypto0"),
+ "-object", "cryptodev-backend-builtin,id=vcrypto0",
+ ]
+
+ if args.dtb:
+ cmd += ["-dtb", args.dtb]
+
+ if args.net:
+ cmd += [
+ "-netdev", netdev,
+ "-device", virtio_device("net", args, "netdev=net0,speed=800000"),
+ ]
+
+ if args.virtio_console:
+ cmd += [
+ "-device", virtio_device("serial", args),
+ "-chardev", "socket,host=127.0.0.1,port=4321,server=on,wait=off,telnet=on,id=console0",
+ "-device", "virtserialport,chardev=console0,name=org.rt-thread.console",
+ ]
+
+ if args.pci_serial:
+ cmd += [
+ "-chardev", "socket,host=127.0.0.1,port=4322,server=on,wait=off,telnet=on,id=console1",
+ "-device", "pci-serial,chardev=console1",
+ ]
+
+ if args.nvme:
+ nvme = ensure_qcow2(args.nvme, 64, create_images)
+ cmd += [
+ "-device", "nvme,id=nvme-ctrl-0,serial=deadbeef",
+ "-drive", "if=none,file={},format=qcow2,id=nvme0".format(nvme),
+ "-device", "nvme-ns,drive=nvme0",
+ ]
+
+ if args.sound == "hda":
+ cmd += ["-device", "intel-hda", "-device", "hda-duplex"]
+ elif args.sound == "virtio":
+ cmd += ["-device", "virtio-sound-pci,audiodev=vsnd", "-audiodev", "alsa,id=vsnd"]
+
+ if args.watchdog:
+ cmd += ["-device", "i6300esb", "-watchdog-action", "reset"]
+
+ if args.edu:
+ cmd += ["-device", "edu,dma_mask=0xffffffff"]
+
+ if args.initrd:
+ cmd += ["-initrd", args.initrd]
+
+ if args.debug:
+ cmd += ["-S", "-s"]
+
+ if args.graphic:
+ cmd += ["-device", "ramfb"]
+ if args.gl:
+ cmd += ["-device", "virtio-gpu-gl-pci", "-display", "{},gl=on".format(args.gl)]
+ else:
+ cmd += ["-device", virtio_device("gpu", args)]
+ cmd += [
+ "-device", "virtio-keyboard-device",
+ "-device", "virtio-tablet-device",
+ ]
+ else:
+ cmd += ["-nographic"]
+
+ if args.host_9p:
+ cmd += [
+ "-fsdev", "local,security_model=passthrough,id=fsdev0,path={}".format(args.host_9p),
+ "-device", virtio_device("9p", args, "fsdev=fsdev0,mount_tag=hostshare"),
+ ]
+
+ if args.dry_run:
+ print(" ".join(shlex.quote(arg) for arg in cmd))
+ return 0
+
+ ret = subprocess.call(cmd)
+ if ret == 0 and args.dumpdtb:
+ dump_dtb_to_dts(args.dumpdtb)
+
+ return ret
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/bsp/qemu-virt64-riscv/rtconfig.h b/bsp/qemu-virt64-riscv/rtconfig.h
index 4de066e34c..16f7436f47 100644
--- a/bsp/qemu-virt64-riscv/rtconfig.h
+++ b/bsp/qemu-virt64-riscv/rtconfig.h
@@ -1,6 +1,10 @@
#ifndef RT_CONFIG_H__
#define RT_CONFIG_H__
+#define BSP_QEMU_RISCV64
+#define ARCH_TEXT_OFFSET 0x200000
+#define ARCH_RAM_OFFSET 0x80000000
+
/* RT-Thread Kernel */
/* klibc options */
@@ -8,16 +12,6 @@
/* rt_vsnprintf options */
#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
-#define RT_KLIBC_USING_VSNPRINTF_STANDARD
-#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
-#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
-#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
-#define RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER
-#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
-#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
-#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
-#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
-#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -73,7 +67,8 @@
/* end of rt_strnlen options */
/* end of klibc options */
#define RT_NAME_MAX 24
-#define RT_CPUS_NR 1
+#define RT_USING_SMP
+#define RT_CPUS_NR 4
#define RT_ALIGN_SIZE 8
#define RT_THREAD_PRIORITY_32
#define RT_THREAD_PRIORITY_MAX 32
@@ -84,6 +79,7 @@
#define RT_USING_IDLE_HOOK
#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 16384
+#define SYSTEM_THREAD_STACK_SIZE 16384
#define RT_USING_TIMER_SOFT
#define RT_TIMER_THREAD_PRIO 4
#define RT_TIMER_THREAD_STACK_SIZE 16384
@@ -118,6 +114,7 @@
/* end of Memory Management */
#define RT_USING_DEVICE
#define RT_USING_DEVICE_OPS
+#define RT_USING_INTERRUPT_INFO
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 256
#define RT_CONSOLE_DEVICE_NAME "uart0"
@@ -126,15 +123,26 @@
#define RT_USING_STDC_ATOMIC
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
+#define ARCH_SECONDARY_CPU_STACK_SIZE 4096
+#define ARCH_HEAP_SIZE 0x4000000
+#define ARCH_INIT_PAGE_SIZE 0x200000
#define ARCH_CPU_64BIT
#define RT_USING_CACHE
+#define RT_USING_HW_ATOMIC
+#define RT_USING_CPU_FFS
#define ARCH_MM_MMU
#define ARCH_RISCV
#define ARCH_RISCV_FPU
+#define ARCH_RISCV_VECTOR
+#define ARCH_VECTOR_VLEN_128
+#define ARCH_RISCV_FPU_D
#define ARCH_RISCV64
+
+/* RISC-V Architecture Configuration */
+
+#define RT_USING_RISCV_NEW_COMMON
+/* end of RISC-V Architecture Configuration */
#define ARCH_USING_NEW_CTX_SWITCH
-#define ARCH_USING_RISCV_COMMON64
-#define ARCH_REMAP_KERNEL
/* RT-Thread Components */
@@ -186,6 +194,7 @@
/* Device Drivers */
+#define RT_USING_DM
#define RT_USING_DEVICE_IPC
#define RT_UNAMED_PIPE_NUMBER 64
#define RT_USING_SYSTEM_WORKQUEUE
@@ -195,14 +204,118 @@
#define RT_USING_SERIAL_V1
#define RT_SERIAL_USING_DMA
#define RT_SERIAL_RB_BUFSZ 64
+#define RT_USING_SERIAL_BYPASS
+#define RT_SERIAL_8250
+#define RT_SERIAL_8250_PCI
+#define RT_SERIAL_VIRTUAL
+#define RT_SERIAL_VIRTUAL_FONT_UNI2_FIXED16
+#define RT_SERIAL_EARLY_SBI
#define RT_USING_CLOCK_TIME
#define CLOCK_TIMER_FREQ 0
+#define RT_USING_ETHERNET
#define RT_USING_NULL
#define RT_USING_ZERO
#define RT_USING_RANDOM
#define RT_USING_RTC
-#define RT_USING_SOFT_RTC
-#define RT_USING_PIN
+#define RT_USING_ALARM
+#define RT_ALARM_STACK_SIZE 16384
+#define RT_ALARM_TIMESLICE 5
+#define RT_ALARM_PRIORITY 10
+#define RT_RTC_GOLDFISH
+#define RT_USING_WDT
+#define RT_WDT_I6300ESB
+#define RT_USING_AUDIO
+#define RT_AUDIO_REPLAY_MP_BLOCK_SIZE 4096
+#define RT_AUDIO_REPLAY_MP_BLOCK_COUNT 2
+#define RT_AUDIO_RECORD_PIPE_SIZE 2048
+#define RT_AUDIO_INTEL_HDA
+#define RT_USING_TOUCH
+#define RT_USING_LCD
+#define RT_USING_GRAPHIC
+#define RT_GRAPHIC_FB
+#define RT_GRAPHIC_LOGO
+#define RT_GRAPHIC_LOGO_RT_THREAD_CLUT224
+#define RT_USING_HWCRYPTO
+#define RT_HWCRYPTO_DEFAULT_NAME "hwcryto"
+#define RT_HWCRYPTO_IV_MAX_SIZE 16
+#define RT_HWCRYPTO_KEYBIT_MAX_SIZE 256
+#define RT_HWCRYPTO_USING_AES
+#define RT_HWCRYPTO_USING_AES_ECB
+#define RT_HWCRYPTO_USING_AES_CBC
+#define RT_HWCRYPTO_USING_AES_CTR
+#define RT_HWCRYPTO_USING_DES
+#define RT_HWCRYPTO_USING_DES_ECB
+#define RT_HWCRYPTO_USING_DES_CBC
+#define RT_HWCRYPTO_USING_3DES
+#define RT_HWCRYPTO_USING_3DES_ECB
+#define RT_HWCRYPTO_USING_3DES_CBC
+#define RT_HWCRYPTO_USING_RC4
+#define RT_HWCRYPTO_USING_RNG
+#define RT_USING_INPUT
+#define RT_INPUT_POWER
+#define RT_INPUT_KEYBOARD
+#define RT_INPUT_TOUCHSCREEN
+#define RT_USING_NVME
+#define RT_USING_NVME_IO_QUEUE 4
+#define RT_NVME_PCI
+#define RT_USING_BLK
+
+/* Partition Types */
+
+#define RT_BLK_PARTITION_DFS
+#define RT_BLK_PARTITION_EFI
+/* end of Partition Types */
+#define RT_USING_FIRMWARE
+#define RT_FIRMWARE_QEMU_FW_CFG
+#define RT_USING_RESET
+
+/* Power Management (PM) Domains device drivers */
+
+/* end of Power Management (PM) Domains device drivers */
+#define RT_USING_POWER_RESET
+#define RT_POWER_RESET_SYSCON_POWEROFF
+#define RT_POWER_RESET_SYSCON_REBOOT
+#define RT_USING_VIRTIO
+#define RT_VIRTIO_TRANSPORT_MMIO
+#define RT_VIRTIO_TRANSPORT_PCI
+#define RT_VIRTIO_NET
+#define RT_VIRTIO_BLK
+#define RT_VIRTIO_CONSOLE
+#define RT_VIRTIO_RNG
+#define RT_VIRTIO_RPROC_SERIAL
+#define RT_VIRTIO_GPU
+#define RT_VIRTIO_INPUT
+#define RT_VIRTIO_CRYPTO
+#define RT_VIRTIO_SOUND
+#define RT_USING_DMA
+#define RT_USING_MFD
+#define RT_MFD_EDU
+#define RT_MFD_SYSCON
+#define RT_USING_OFW
+#define RT_FDT_EARLYCON_MSG_SIZE 128
+#define RT_USING_OFW_BUS_RANGES_NUMBER 8
+#define RT_USING_PCI
+#define RT_PCI_MSI
+#define RT_PCI_SYS_64BIT
+#define RT_PCI_CACHE_LINE_SIZE 8
+
+/* PCI Device Drivers */
+
+#define RT_PCI_ECAM
+#define RT_PCI_HOST_COMMON
+#define RT_PCI_HOST_GENERIC
+#define RT_USING_PIC
+#define MAX_HANDLERS 512
+#define RT_PIC_RISCV_AIA
+#define RT_PIC_RISCV_INTC
+#define RT_PIC_SIFIVE_PLIC
+#define RT_USING_CLK
+
+/* SoC (System on Chip) Drivers */
+
+#define RT_GRAPHIC_ROMFB_WIDTH 800
+#define RT_GRAPHIC_ROMFB_HEIGHT 600
+/* end of SoC (System on Chip) Drivers */
/* end of Device Drivers */
/* C/C++ and POSIX layer */
@@ -322,8 +435,11 @@
/* Memory management */
+#define RT_PAGE_MPR_SIZE_DYNAMIC
#define RT_PAGE_AFFINITY_BLOCK_SIZE 0x1000
#define RT_PAGE_MAX_ORDER 11
+#define RT_USING_MEMBLOCK
+#define RT_INIT_MEMORY_REGIONS 128
/* Debugging */
@@ -437,6 +553,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -468,6 +588,14 @@
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -547,25 +675,6 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
-
-/* RISC-V QEMU virt64 configs */
-
-#define RT_USING_LEGACY_VIRTIO
-#define RT_USING_VIRTIO10
-#define RT_USING_VIRTIO_BLK
-#define RT_USING_VIRTIO_NET
-#define RT_USING_VIRTIO_CONSOLE
-#define RT_USING_VIRTIO_CONSOLE_PORT_MAX_NR 4
-#define RT_USING_VIRTIO_GPU
-#define RT_USING_VIRTIO_INPUT
-#define BSP_USING_VIRTIO_BLK
-#define BSP_USING_VIRTIO_NET
-#define BSP_USING_VIRTIO_CONSOLE
-#define BSP_USING_VIRTIO_GPU
-#define BSP_USING_VIRTIO_INPUT
-/* end of RISC-V QEMU virt64 configs */
-#define BOARD_QEMU_VIRT_RV64
-#define ENABLE_FPU
-#define __STACKSIZE__ 16384
+#define BSP_USING_QEMU_RISCV_VIRT
#endif
diff --git a/bsp/qemu-virt64-riscv/rtconfig.py b/bsp/qemu-virt64-riscv/rtconfig.py
index 09d530af4a..c5d41b2fd9 100644
--- a/bsp/qemu-virt64-riscv/rtconfig.py
+++ b/bsp/qemu-virt64-riscv/rtconfig.py
@@ -1,9 +1,33 @@
import os
+import subprocess
+
+def config_enabled(name):
+ try:
+ with open('rtconfig.h', 'r') as config:
+ return '#define {}'.format(name) in config.read()
+ except OSError:
+ return False
+
+
+def compiler_accepts(compiler, options):
+ try:
+ result = subprocess.run(
+ [compiler] + options + ['-x', 'c', '-c', '-o', os.devnull, '-'],
+ input=b'',
+ stdout=subprocess.DEVNULL,
+ stderr=subprocess.DEVNULL,
+ check=False,
+ )
+ except OSError:
+ return False
+
+ return result.returncode == 0
# toolchains options
ARCH ='risc-v'
-CPU ='virt64'
+CPU =''
CROSS_TOOL ='gcc'
+RISCV_ABI = os.getenv('RTT_RISCV_ABI')
RTT_ROOT = os.getenv('RTT_ROOT') or os.path.join(os.getcwd(), '..', '..')
@@ -24,6 +48,7 @@ if PLATFORM == 'gcc':
PREFIX = os.getenv('RTT_CC_PREFIX') or 'riscv64-unknown-elf-'
CC = PREFIX + 'gcc'
CXX = PREFIX + 'g++'
+ CPP = PREFIX + 'cpp'
AS = PREFIX + 'gcc'
AR = PREFIX + 'ar'
LINK = PREFIX + 'gcc'
@@ -32,7 +57,35 @@ if PLATFORM == 'gcc':
OBJDUMP = PREFIX + 'objdump'
OBJCPY = PREFIX + 'objcopy'
- DEVICE = ' -mcmodel=medany -march=rv64imafdc -mabi=lp64 '
+ xlen = '64' if config_enabled('ARCH_RISCV64') else '32'
+ abi_base = 'lp64' if xlen == '64' else 'ilp32'
+ extensions = 'imac'
+
+ if config_enabled('ARCH_RISCV_FPU_D'):
+ extensions = 'imafdc'
+ elif config_enabled('ARCH_RISCV_FPU_S'):
+ extensions = 'imafc'
+
+ abi = RISCV_ABI
+ if not abi and (xlen == '32' or config_enabled('RT_USING_SMART')):
+ abi = abi_base
+
+ march_base = 'rv{}{}'.format(xlen, extensions)
+ march_modern = '{}_zicsr_zifencei'.format(march_base)
+ compiler = os.path.join(EXEC_PATH, CC)
+ if not os.path.isfile(compiler):
+ compiler = CC
+ # Preserve the toolchain ABI unless it requires unavailable ISA extensions.
+ if not abi and not any(compiler_accepts(compiler, ['-march=' + candidate])
+ for candidate in (march_modern, march_base)):
+ abi = abi_base
+ abi_option = ['-mabi={}'.format(abi)] if abi else []
+ march = march_modern if compiler_accepts(
+ compiler, ['-march={}'.format(march_modern)] + abi_option) else march_base
+ DEVICE = ' -mcmodel=medany -march={} '.format(march)
+ if abi:
+ DEVICE += ' -mabi={} '.format(abi)
+ CPPFLAGS= ' -nostdinc -undef -E -P -x assembler-with-cpp'
CFLAGS = DEVICE + '-ffreestanding -flax-vector-conversions -Wno-cpp -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -fdiagnostics-color=always'
AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__ '
LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,_start -T link.lds' + ' -lsupc++ -lgcc -static'
diff --git a/bsp/qemu-virt64-riscv/run.sh b/bsp/qemu-virt64-riscv/run.sh
deleted file mode 100755
index c332915098..0000000000
--- a/bsp/qemu-virt64-riscv/run.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/bash
-
-usage ()
-{
- echo "Usage:"
- echo "./run.sh [<path_to_image>]"
- echo "Note: if <path_to_image> is not provided, will create a 'sd.bin'"
- echo "in the current directory and load it by default."
-}
-
-path_image=${1}
-
-if [ -z $path_image ]; then
- path_image="./sd.bin"
- if [ ! -f $path_image ]; then
- dd if=/dev/zero of=$path_image bs=1024 count=65536
- mkfs.fat $path_image
- fi
-fi
-
-if [ ! -f $path_image ]; then
- echo "ERROR: $path_image does not exist!"
- usage
- exit
-fi
-
-QEMU_CMD="qemu-system-riscv64 -nographic -machine virt -m 256M -kernel rtthread.bin"
-
-if grep -q "#define RT_USING_SMP" ./rtconfig.h 2>/dev/null; then
- hart_num=$(grep "RT_CPUS_NR = [0-9]*;" ./link_cpus.lds 2>/dev/null | awk -F'[=;]' '{gsub(/ /, "", $2); print $2}')
- if [ -z "$hart_num" ] || [ "$hart_num" -lt 1 ]; then
- echo "Warning: Invalid or missing RT_CPUS_NR, defaulting to 1"
- hart_num=1
- fi
- QEMU_CMD="$QEMU_CMD -smp $hart_num"
-fi
-
-QEMU_CMD="$QEMU_CMD \
--drive if=none,file=$path_image,format=raw,id=blk0 -device virtio-blk-device,drive=blk0,bus=virtio-mmio-bus.0 \
--netdev user,id=tap0 -device virtio-net-device,netdev=tap0,bus=virtio-mmio-bus.1 \
--device virtio-serial-device -chardev socket,host=127.0.0.1,port=4321,server=on,wait=off,telnet=on,id=console0 -device virtserialport,chardev=console0"
-
-eval $QEMU_CMD \ No newline at end of file