User Tools

Site Tools


risc-v

This is an old revision of the document!


STUFF

  • Peruse runqemu, clarify how it creates command for qemuriscv64.

Links

OE-Core layer

meta-riscv layer [abbreviated]

Resources

Building for qemuriscv64

qemuriscv64

Note that, for the QEMU build, there is no need for the meta-riscv layer, just openembedded-core.

$ MACHINE=qemuriscv64 bitbake core-image-full-cmdline
$ runqemu nographic

qemuriscv.sh

To invoke your own script, remove -device bochs-display added by runqemu.

$ sudo qemu-system-riscv64 \
  -device virtio-net-device,netdev=net0,mac=52:54:00:12:34:02 \
  -netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
  -object rng-random,filename=/dev/urandom,id=rng0 \
  -device virtio-rng-pci,rng=rng0 \
  -drive id=disk0,file=/home/rpjday/oe/builds/oe_qemuriscv64/tmp/deploy/images/qemuriscv64/core-image-minimal-qemuriscv64.ext4,if=none,format=raw \
  -device virtio-blk-device,drive=disk0 \
  -device virtio-mouse-pci \
  -device virtio-keyboard-pci \
  -machine virt \
  -smp 4 \
  -m 256 \
  -serial mon:stdio \
  -serial null \
  -nographic \
  -bios /home/rpjday/oe/builds/oe_qemuriscv64/tmp/deploy/images/qemuriscv64/fw_jump.elf \
  -kernel /home/rpjday/oe/builds/oe_qemuriscv64/tmp/deploy/images/qemuriscv64/Image-qemuriscv64.bin \
  -append 'root=/dev/vda rw  mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0::eth0:off:8.8.8.8 console=ttyS0 console=hvc0 earlycon=sbi '

Why create a kernel containing-payload if you don't use it? Also, appears that the serial console is ttyS0, and you can drop the console=hvc0 earlycon=sbi stuff, still works.

tmp/deploy/images/qemuriscv64

Note which generated artifacts are used in the call to QEMU:

-rw-r--r--. 2 rpjday rpjday      4526 Feb 26 13:21 core-image-full-cmdline.env
-rw-r--r--. 2 rpjday rpjday      1682 Feb 26 13:21 core-image-full-cmdline-qemuriscv64-20220226161907.qemuboot.conf
-rw-r--r--. 2 rpjday rpjday 184259584 Feb 26 14:02 core-image-full-cmdline-qemuriscv64-20220226161907.rootfs.ext4
-rw-r--r--. 2 rpjday rpjday     14723 Feb 26 13:21 core-image-full-cmdline-qemuriscv64-20220226161907.rootfs.manifest
-rw-r--r--. 2 rpjday rpjday  43832694 Feb 26 13:21 core-image-full-cmdline-qemuriscv64-20220226161907.rootfs.tar.bz2
-rw-r--r--. 2 rpjday rpjday 136642560 Feb 26 13:21 core-image-full-cmdline-qemuriscv64-20220226161907.rootfs.wic.qcow2
-rw-r--r--. 2 rpjday rpjday    189565 Feb 26 13:21 core-image-full-cmdline-qemuriscv64-20220226161907.testdata.json
lrwxrwxrwx. 2 rpjday rpjday        62 Feb 26 13:21 core-image-full-cmdline-qemuriscv64.ext4 -> core-image-full-cmdline-qemuriscv64-20220226161907.rootfs.ext4
lrwxrwxrwx. 2 rpjday rpjday        66 Feb 26 13:21 core-image-full-cmdline-qemuriscv64.manifest -> core-image-full-cmdline-qemuriscv64-20220226161907.rootfs.manifest
lrwxrwxrwx. 2 rpjday rpjday        64 Feb 26 13:21 core-image-full-cmdline-qemuriscv64.qemuboot.conf -> core-image-full-cmdline-qemuriscv64-20220226161907.qemuboot.conf
lrwxrwxrwx. 2 rpjday rpjday        65 Feb 26 13:21 core-image-full-cmdline-qemuriscv64.tar.bz2 -> core-image-full-cmdline-qemuriscv64-20220226161907.rootfs.tar.bz2
lrwxrwxrwx. 2 rpjday rpjday        64 Feb 26 13:21 core-image-full-cmdline-qemuriscv64.testdata.json -> core-image-full-cmdline-qemuriscv64-20220226161907.testdata.json
lrwxrwxrwx. 2 rpjday rpjday        67 Feb 26 13:21 core-image-full-cmdline-qemuriscv64.wic.qcow2 -> core-image-full-cmdline-qemuriscv64-20220226161907.rootfs.wic.qcow2
-rwxr-xr-x. 2 rpjday rpjday     96496 Feb 26 13:17 fw_dynamic.bin
-rwxr-xr-x. 2 rpjday rpjday    938520 Feb 26 13:17 fw_dynamic.elf
-rwxr-xr-x. 2 rpjday rpjday     96496 Feb 26 13:17 fw_jump.bin
-rwxr-xr-x. 2 rpjday rpjday    938104 Feb 26 13:17 fw_jump.elf
-rwxr-xr-x. 2 rpjday rpjday  24799752 Feb 26 13:17 fw_payload.bin
-rwxr-xr-x. 2 rpjday rpjday  23640912 Feb 26 13:17 fw_payload.elf
lrwxrwxrwx. 2 rpjday rpjday        75 Feb 26 13:15 Image -> Image--5.15.22+git0+2d38a472b2_7f685244af-r0-qemuriscv64-20220226161907.bin
-rw-r--r--. 2 rpjday rpjday  22702592 Feb 26 13:15 Image--5.15.22+git0+2d38a472b2_7f685244af-r0-qemuriscv64-20220226161907.bin
lrwxrwxrwx. 2 rpjday rpjday        75 Feb 26 13:15 Image-qemuriscv64.bin -> Image--5.15.22+git0+2d38a472b2_7f685244af-r0-qemuriscv64-20220226161907.bin
-rw-r--r--. 2 rpjday rpjday   2647632 Feb 26 13:16 modules--5.15.22+git0+2d38a472b2_7f685244af-r0-qemuriscv64-20220226161907.tgz
lrwxrwxrwx. 2 rpjday rpjday        77 Feb 26 13:16 modules-qemuriscv64.tgz -> modules--5.15.22+git0+2d38a472b2_7f685244af-r0-qemuriscv64-20220226161907.tgz
lrwxrwxrwx. 2 rpjday rpjday        33 Feb 26 13:19 u-boot.bin -> u-boot-qemuriscv64-2022.01-r0.bin
lrwxrwxrwx. 2 rpjday rpjday        33 Feb 26 13:19 u-boot.elf -> u-boot-qemuriscv64-2022.01-r0.elf
lrwxrwxrwx. 2 rpjday rpjday        41 Feb 26 13:19 u-boot-initial-env -> u-boot-initial-env-qemuriscv64-2022.01-r0
lrwxrwxrwx. 2 rpjday rpjday        41 Feb 26 13:19 u-boot-initial-env-qemuriscv64 -> u-boot-initial-env-qemuriscv64-2022.01-r0
-rw-r--r--. 2 rpjday rpjday      4155 Feb 26 13:19 u-boot-initial-env-qemuriscv64-2022.01-r0
-rw-r--r--. 2 rpjday rpjday    616024 Feb 26 13:19 u-boot-qemuriscv64-2022.01-r0.bin
-rw-r--r--. 2 rpjday rpjday   5967056 Feb 26 13:19 u-boot-qemuriscv64-2022.01-r0.elf
lrwxrwxrwx. 2 rpjday rpjday        33 Feb 26 13:19 u-boot-qemuriscv64.bin -> u-boot-qemuriscv64-2022.01-r0.bin
lrwxrwxrwx. 2 rpjday rpjday        33 Feb 26 13:19 u-boot-qemuriscv64.elf -> u-boot-qemuriscv64-2022.01-r0.elf
lrwxrwxrwx. 2 rpjday rpjday        76 Feb 26 13:15 uImage -> uImage--5.15.22+git0+2d38a472b2_7f685244af-r0-qemuriscv64-20220226161907.bin
-rw-r--r--. 2 rpjday rpjday   6720345 Feb 26 13:15 uImage--5.15.22+git0+2d38a472b2_7f685244af-r0-qemuriscv64-20220226161907.bin
lrwxrwxrwx. 2 rpjday rpjday        76 Feb 26 13:15 uImage-qemuriscv64.bin -> uImage--5.15.22+git0+2d38a472b2_7f685244af-r0-qemuriscv64-20220226161907.bin

The RISC-V kernel

linux-yocto_5.15.bb

Snippets:

KBRANCH:qemuriscv64  ?= "v5.15/standard/base"
SRCREV_machine:qemuriscv64 ?= "7f685244afb3acd13e94968312580b63d7296705"

SRC_URI = "git://git.yoctoproject.org/linux-yocto.git;name=machine;branch=${KBRANCH}; \
           git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-5.15;destsuffix=${KMETA}"
           
 # Functionality flags
KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
KERNEL_FEATURES:append = " ${KERNEL_EXTRA_FEATURES}"
KERNEL_FEATURES:append:qemuall=" cfg/virtio.scc features/drm-bochs/drm-bochs.scc"          

Generated RISC-V image/boot/ artifacts

-rw-r--r--. 1 rpjday rpjday    87068 Feb 26 12:10 config-5.15.22-yocto-standard
-rw-r--r--. 1 rpjday rpjday 22702592 Feb 26 12:10 Image-5.15.22-yocto-standard
-rw-r--r--. 1 rpjday rpjday   515147 Feb 26 12:10 Module.symvers-5.15.22-yocto-standard
-rw-r--r--. 1 rpjday rpjday  3984643 Feb 26 12:10 System.map-5.15.22-yocto-standard
-rw-r--r--. 1 rpjday rpjday  6720345 Feb 26 12:10 uImage-5.15.22-yocto-standard
-rw-r--r--. 1 rpjday rpjday 19733600 Feb 26 12:10 vmlinux-5.15.22-yocto-standard

Selected snippets from kernel-meta/

arch/riscv/

riscv.scc

if [ "$KARCH" = "riscv" ]; then
        kconf hardware riscv.cfg
        include cfg/timer/hz_100.scc
fi

riscv.cfg

CONFIG_RISCV=y
CONFIG_RISCV_ISA_C=y
CONFIG_RISCV_ISA_A=y

CONFIG_RISCV_TIMER=y

CONFIG_MMU=y

CONFIG_SERIAL_EARLYCON_RISCV_SBI=y    [not set in .config?]

bsp/qemuriscv64/

qemuriscv64.cfg

CONFIG_ARCH_RV64I=y
CONFIG_64BIT=y

#
# Platform type
#
CONFIG_MAXPHYSMEM_128GB=y
CONFIG_SMP=y
CONFIG_NR_CPUS=8
CONFIG_TUNE_GENERIC=y

#
# Bus support
#
CONFIG_PCI=y
CONFIG_PCI_ECAM=y
CONFIG_PCI_HOST_COMMON=y
CONFIG_PCI_HOST_GENERIC=y
CONFIG_PCIEPORTBUS=y

#
# Serial drivers
#
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_OF_PLATFORM=y

#
# Non-8250 serial port support
#
CONFIG_VIRTIO_CONSOLE=y

#
# IRQ chip support
#
CONFIG_SIFIVE_PLIC=y

qemuriscv64.scc

kconf hardware qemuriscv64.cfg

# Graphics support
include features/drm-bochs/drm-bochs.scc

qemuriscv64-standard.scc

define KMACHINE qemuriscv64
define KTYPE standard
define KARCH riscv64

include ktypes/standard/standard.scc

include cfg/virtio.scc
include qemuriscv64.scc

On the running QEMU session

root@qemuriscv64:/proc# gunzip -c /proc/config.gz | grep RISC
CONFIG_RISCV=y
CONFIG_RISCV_SBI=y
CONFIG_RISCV_ERRATA_ALTERNATIVE=y
CONFIG_RISCV_ISA_C=y
CONFIG_RISCV_BASE_PMU=y
CONFIG_RISCV_SBI_V01=y
# CONFIG_SERIAL_EARLYCON_RISCV_SBI is not set
# CONFIG_HVC_RISCV_SBI is not set
CONFIG_RISCV_TIMER=y
CONFIG_RISCV_INTC=y

opensbi

qemuriscv.inc variables

EXTRA_IMAGEDEPENDS += "opensbi"
RISCV_SBI_PLAT ?= "generic"
RISCV_SBI_PAYLOAD ?= "${KERNEL_IMAGETYPE}-${MACHINE}.bin"

UBOOT_ENTRYPOINT:riscv32 = "0x80400000"
UBOOT_ENTRYPOINT:riscv64 = "0x80200000"

opensbi-payloads.inc

def riscv_get_extra_oemake_image(d):
    sbi_payload = d.getVar('RISCV_SBI_PAYLOAD')
    deploy_dir = d.getVar('DEPLOY_DIR_IMAGE')

    if sbi_payload is None:
        return ""

    return "FW_PAYLOAD_PATH=" + deploy_dir + "/" + sbi_payload

def riscv_get_extra_oemake_fdt(d):
    sbi_fdt = d.getVar('RISCV_SBI_FDT')
    deploy_dir = d.getVar('DEPLOY_DIR_IMAGE')

    if sbi_fdt is None:
        return ""

    return "FW_FDT_PATH=" + deploy_dir + "/" + sbi_fdt

def riscv_get_do_compile_depends(d):
    sbi_payload = d.getVar('RISCV_SBI_PAYLOAD') or ""
    sbi_fdt = d.getVar('RISCV_SBI_FDT') or ""

    if sbi_payload == "" and sbi_fdt == "":
        return ""

    if sbi_fdt != "" and 'u-boot.bin' in sbi_payload:
        return "virtual/kernel:do_deploy virtual/bootloader:do_deploy"

    if 'linux' in sbi_payload or 'Image' in sbi_payload:
        return "virtual/kernel:do_deploy"
    if 'u-boot.bin' in sbi_payload:
        return "virtual/bootloader:do_deploy"
    if sbi_fdt != "":
        return "virtual/kernel:do_deploy"

    return ""

opensbi_1.0.bb [master branch]

require opensbi-payloads.inc

inherit autotools-brokensep deploy

SRCREV = "ce4c0188d96b2c20c2e08d24646a5e517fe15a4b"
SRC_URI = "git://github.com/riscv/opensbi.git;branch=master;protocol=https \
          "

S = "${WORKDIR}/git"

EXTRA_OEMAKE += "PLATFORM=${RISCV_SBI_PLAT} I=${D} FW_PIC=n CLANG_TARGET= "
# If RISCV_SBI_PAYLOAD is set then include it as a payload
EXTRA_OEMAKE:append = " ${@riscv_get_extra_oemake_image(d)}"
EXTRA_OEMAKE:append = " ${@riscv_get_extra_oemake_fdt(d)}"

# Required if specifying a custom payload
do_compile[depends] += "${@riscv_get_do_compile_depends(d)}"

do_install:append() {
        # In the future these might be required as a dependency for other packages.
        # At the moment just delete them to avoid warnings
        rm -r ${D}/include
        rm -r ${D}/lib*
        rm -r ${D}/share/opensbi/*/${RISCV_SBI_PLAT}/firmware/payloads
}

do_deploy () {
        install -m 755 ${D}/share/opensbi/*/${RISCV_SBI_PLAT}/firmware/fw_payload.* ${DEPLOYDIR}/
        install -m 755 ${D}/share/opensbi/*/${RISCV_SBI_PLAT}/firmware/fw_jump.* ${DEPLOYDIR}/
        install -m 755 ${D}/share/opensbi/*/${RISCV_SBI_PLAT}/firmware/fw_dynamic.* ${DEPLOYDIR}/
}

addtask deploy before do_build after do_install

FILES:${PN} += "/share/opensbi/*/${RISCV_SBI_PLAT}/firmware/fw_jump.*"
FILES:${PN} += "/share/opensbi/*/${RISCV_SBI_PLAT}/firmware/fw_payload.*"
FILES:${PN} += "/share/opensbi/*/${RISCV_SBI_PLAT}/firmware/fw_dynamic.*"

COMPATIBLE_HOST = "(riscv64|riscv32).*"
INHIBIT_PACKAGE_STRIP = "1"

SECURITY_CFLAGS = ""

bitbake -e opensbi

# $RISCV_SBI_PAYLOAD
#   set? /home/rpjday/oe/dist/layers/openembedded-core/meta/conf/machine/include/riscv/qemuriscv.inc:23
#     "${KERNEL_IMAGETYPE}-${MACHINE}.bin"
RISCV_SBI_PAYLOAD="Image-qemuriscv64.bin"
#
# $RISCV_SBI_PLAT
#   set? /home/rpjday/oe/dist/layers/openembedded-core/meta/conf/machine/include/riscv/qemuriscv.inc:22
#     "generic"
RISCV_SBI_PLAT="generic"

git/build/platform/generic/firmware

With (default) kernel payload:

-rwxr-xr-x. 1 rpjday rpjday    96496 Feb 27 05:28 fw_dynamic.bin
-rwxr-xr-x. 1 rpjday rpjday   938520 Feb 27 05:28 fw_dynamic.elf
-rwxr-xr-x. 1 rpjday rpjday    96496 Feb 27 05:28 fw_jump.bin
-rwxr-xr-x. 1 rpjday rpjday   938104 Feb 27 05:28 fw_jump.elf
-rwxr-xr-x. 1 rpjday rpjday 24799752 Feb 27 05:28 fw_payload.bin
-rwxr-xr-x. 1 rpjday rpjday 23640912 Feb 27 05:28 fw_payload.elf

With u-boot.bin payload (note much smaller payload files):

-rwxr-xr-x. 2 rpjday rpjday   96496 Mar  1 06:10 fw_dynamic.bin
-rwxr-xr-x. 2 rpjday rpjday  938520 Mar  1 06:10 fw_dynamic.elf
-rwxr-xr-x. 2 rpjday rpjday   96496 Mar  1 06:10 fw_jump.bin
-rwxr-xr-x. 2 rpjday rpjday  938104 Mar  1 06:10 fw_jump.elf
-rwxr-xr-x. 2 rpjday rpjday 2713192 Mar  1 06:10 fw_payload.bin
-rwxr-xr-x. 2 rpjday rpjday 1554336 Mar  1 06:10 fw_payload.elf

log.do_compile

make -j 8
  PLATFORM=generic
  I=/home/rpjday/oe/builds/oe_qemuriscv64/tmp-glibc/work/riscv64-oe-linux/opensbi/1.0-r0/image
  FW_PIC=n CLANG_TARGET= 
  FW_PAYLOAD_PATH=.../qemuriscv64/Image-qemuriscv64.bin

git/platform/generic/config.mk

# Compiler flags
platform-cppflags-y =
platform-cflags-y =
platform-asflags-y =
platform-ldflags-y =

# Command for platform specific "make run"
platform-runcmd = qemu-system-riscv$(PLATFORM_RISCV_XLEN) -M virt -m 256M \
  -nographic -bios $(build_dir)/platform/generic/firmware/fw_payload.elf

# Blobs to build
FW_TEXT_START=0x80000000
FW_DYNAMIC=y
FW_JUMP=y
ifeq ($(PLATFORM_RISCV_XLEN), 32)
  # This needs to be 4MB aligned for 32-bit system
  FW_JUMP_ADDR=$(shell printf "0x%X" $$(($(FW_TEXT_START) + 0x400000)))
else
  # This needs to be 2MB aligned for 64-bit system
  FW_JUMP_ADDR=$(shell printf "0x%X" $$(($(FW_TEXT_START) + 0x200000)))
endif
FW_JUMP_FDT_ADDR=$(shell printf "0x%X" $$(($(FW_TEXT_START) + 0x2200000)))
FW_PAYLOAD=y
ifeq ($(PLATFORM_RISCV_XLEN), 32)
  # This needs to be 4MB aligned for 32-bit system
  FW_PAYLOAD_OFFSET=0x400000
else
  # This needs to be 2MB aligned for 64-bit system
  FW_PAYLOAD_OFFSET=0x200000
endif
FW_PAYLOAD_FDT_ADDR=$(FW_JUMP_FDT_ADDR)
risc-v.1646143740.txt.gz · Last modified: 2022/03/01 14:09 by rpjday