Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 132 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,24 @@ all: workloads
MULTIHART ?= 0
PLATFORM ?= $(if $(filter 1,$(MULTIHART)),qemu,nemu)
HARTS ?= 2
VIRT_BUILD ?= 0
QEMU_DEFAULT_DTB ?= xiangshan-qemu-nemu-mem2g
DTS_ISA_CONFIG ?= kunminghu-v3
DTS_DIR := build/generated-dts
export DTS_ISA_CONFIG

ifneq ($(strip $(VIRTUALIZATION)),)
$(error VIRTUALIZATION was removed; build the Linux image first, then run 'make virt bin=<input.bin-or-directory>')
endif

ifeq ($(filter $(PLATFORM),nemu qemu),)
$(error PLATFORM must be either nemu or qemu)
endif
ifeq ($(filter 1,$(VIRT_BUILD)),1)
ifneq ($(filter 1,$(MULTIHART)),)
$(error VIRT_BUILD=1 does not accept MULTIHART=1; use VIRT_GUEST_HARTS)
endif
endif
ifeq ($(filter $(DTS_ISA_CONFIG),kunminghu-v2 kunminghu-v3),)
$(error DTS_ISA_CONFIG must be either kunminghu-v2 or kunminghu-v3)
endif
Expand All @@ -22,9 +32,12 @@ endif

LINUX_DEFAULT_DTB := $(if $(DEFAULT_DTB),$(DEFAULT_DTB),$(if $(filter 1,$(MULTIHART)),,$(if $(filter qemu,$(PLATFORM)),$(QEMU_DEFAULT_DTB),)))
LINUX_FIRMWARE_FILENAME := $(if $(filter qemu,$(PLATFORM)),fw_payload.qemu.bin,fw_payload.bin)
SBI_BUILD_DIR := $(if $(filter 1,$(MULTIHART)),build/opensbi-multihart,build/opensbi)
SBI_BIN := $(SBI_BUILD_DIR)/build/platform/generic/firmware/fw_jump.bin
LINUX_ROOTFS_BUILD_VARS_HASH := $(shell printf '%s\n' \
'multihart=$(if $(filter 1,$(MULTIHART)),1,0)' \
'harts=$(if $(filter 1,$(MULTIHART)),$(HARTS),1)' | sha256sum | cut -d ' ' -f 1)
'harts=$(if $(filter 1,$(MULTIHART)),$(HARTS),1)' \
'virt_build=$(VIRT_BUILD)' | sha256sum | cut -d ' ' -f 1)
LINUX_FIRMWARE_BUILD_VARS_HASH := $(shell printf '%s\n' \
'multihart=$(if $(filter 1,$(MULTIHART)),1,0)' \
'harts=$(if $(filter 1,$(MULTIHART)),$(HARTS),1)' \
Expand Down Expand Up @@ -69,11 +82,121 @@ $(LINUX_IMAGE): $(TOOLCHAIN_WRAPPER) br2-external/configs/nemu_defconfig br2-ext
$(MAKE) -C $(BUILDROOT_DIR) BR2_EXTERNAL=$(abspath br2-external) nemu_defconfig
$(MAKE) -C $(BUILDROOT_DIR) BR2_EXTERNAL=$(abspath br2-external)

ifeq ($(VIRT_BUILD),1)
virt: virt-inner
else
.PHONY: virt
virt:
@test -n "$(bin)" || { echo 'Usage: make virt bin=<input.bin-or-directory>' >&2; exit 2; }
@if test -d "$(bin)"; then \
found=0; \
for input in "$(abspath $(bin))"/*.bin; do \
test -f "$$input" || continue; \
found=1; \
$(MAKE) --no-print-directory VIRT_BUILD=1 bin="$$input" virt-inner || exit $$?; \
done; \
test "$$found" -eq 1 || { echo "No .bin inputs found in $(bin)" >&2; exit 2; }; \
elif test -f "$(bin)"; then \
$(MAKE) --no-print-directory VIRT_BUILD=1 bin="$(abspath $(bin))" $(if $(elf),elf="$(abspath $(elf))") virt-inner; \
else \
echo "Input is not a regular file or directory: $(bin)" >&2; \
exit 2; \
fi
endif

# Combine an existing image export with the per-case virtual packages without
# changing either source tree.
IMAGE_DIR ?= build/images/spec2006
VIRT_DIR ?= build/virt
VIRT_IMAGE_DIR ?= $(IMAGE_DIR)-virt
.PHONY: virt-images
virt-images:
@python3 scripts/merge-virt-image-dir.py --image-dir "$(IMAGE_DIR)" --virt-dir "$(VIRT_DIR)" --output-dir "$(VIRT_IMAGE_DIR)"

ifeq ($(VIRT_BUILD),1)
VIRT_GUEST_HARTS ?= 1
VIRT_GUEST_MEMORY ?= 8G
VIRT_QEMU_START_TIMEOUT ?= 120
VIRT_INNER_QEMU_VERSION := 11.0.0
VIRT_HOST_BUILDROOT_DIR ?= build/buildroot-virt-host
VIRT_HOST_CONFIG := $(VIRT_HOST_BUILDROOT_DIR)/.config
VIRT_HOST_DEFCONFIG := br2-external/configs/nemu_virt_host_defconfig
VIRT_HOST_LINUX_CONFIG := br2-external/board/openxiangshan/nemu/linux-virt-host.config
ifeq ($(filter qemu,$(PLATFORM)),qemu)
VIRT_HOST_DTB ?= xiangshan-qemu-nemu-mem16g
VIRT_OUTER_QEMU_ARGS := --outer-qemu-machine nemu --outer-qemu-cpu rv64,h=true,sstc=false --outer-qemu-harts 1 --outer-qemu-memory 16G
else
VIRT_HOST_DTB ?= xiangshan-fpga-noAIA-mem16g-novec
VIRT_OUTER_QEMU_ARGS :=
endif
VIRT_HOST_FIRMWARE := $(LINUX_FIRMWARE_FILENAME)
VIRT_HOST_MIN_MEMORY_BYTES ?= 17179869184
VIRT_HOST_BUILD_STAMP := $(VIRT_HOST_BUILDROOT_DIR)/.build-complete.stamp
VIRT_HOST_IMAGE := $(VIRT_HOST_BUILDROOT_DIR)/images/Image
VIRT_HOST_ROOTFS := $(VIRT_HOST_BUILDROOT_DIR)/images/rootfs.cpio
VIRT_HOST_QEMU := $(VIRT_HOST_BUILDROOT_DIR)/target/usr/bin/qemu-system-riscv64
VIRT_FAKEROOT := $(BUILDROOT_DIR)/output/host/bin/fakeroot
VIRT_GCPT_BUILD_DIR := build/LibCheckpointAlpha-virt
VIRT_GCPT_BIN := $(VIRT_GCPT_BUILD_DIR)/build/gcpt.bin
VIRT_GCPT_SOURCES := $(shell find bootloader/LibCheckpointAlpha -path '*/.git' -prune -o -type f -print 2>/dev/null)
VIRT_GCPT_DTS_SOURCES := dts/generate-nemu-board-dts.py dts/DTSGen.py dts/workload-builder-profiles.json
VIRT_GCPT_CONFIG_STAMP := build/LibCheckpointAlpha-virt-config/config.$(shell printf '%s\n' '$(VIRT_HOST_DTB)' | sha256sum | cut -d ' ' -f 1)
VIRT_BUILD_VARS_CONTENT := input=$(abspath $(bin))\nelf=$(if $(elf),$(abspath $(elf)))\nplatform=$(PLATFORM)\nguest_harts=$(VIRT_GUEST_HARTS)\nguest_memory=$(VIRT_GUEST_MEMORY)\nqemu_start_timeout=$(VIRT_QEMU_START_TIMEOUT)\ninner_qemu_version=$(VIRT_INNER_QEMU_VERSION)\nhost_dtb=$(VIRT_HOST_DTB)\nhost_min_memory=$(VIRT_HOST_MIN_MEMORY_BYTES)
VIRT_BUILD_VARS_HASH := $(shell printf '%b' '$(VIRT_BUILD_VARS_CONTENT)' | sha256sum | cut -d ' ' -f 1)

$(VIRT_HOST_CONFIG): $(BUILDROOT_DIR)/Makefile $(VIRT_HOST_DEFCONFIG) $(VIRT_HOST_LINUX_CONFIG)
mkdir -p "$(VIRT_HOST_BUILDROOT_DIR)"
@if test -f "$@"; then $(MAKE) -C $(BUILDROOT_DIR) O=$(abspath $(VIRT_HOST_BUILDROOT_DIR)) BR2_EXTERNAL=$(abspath br2-external) linux-dirclean qemu-dirclean; fi
$(MAKE) -C $(BUILDROOT_DIR) O=$(abspath $(VIRT_HOST_BUILDROOT_DIR)) BR2_EXTERNAL=$(abspath br2-external) nemu_virt_host_defconfig

$(VIRT_HOST_BUILD_STAMP): $(VIRT_HOST_CONFIG) $(VIRT_HOST_DEFCONFIG) $(VIRT_HOST_LINUX_CONFIG)
$(MAKE) -C $(BUILDROOT_DIR) O=$(abspath $(VIRT_HOST_BUILDROOT_DIR)) BR2_EXTERNAL=$(abspath br2-external)
test -s "$(VIRT_HOST_IMAGE)"
test -s "$(VIRT_HOST_ROOTFS)"
test -x "$(VIRT_HOST_QEMU)"
@test -n "$$(find "$(VIRT_HOST_BUILDROOT_DIR)/build" -maxdepth 1 -type d -name 'qemu-*' -print -quit)"
@host_kernel_config="$$(find "$(VIRT_HOST_BUILDROOT_DIR)/build" -path '*/linux-*/.config' -print -quit)"; test -n "$$host_kernel_config"; grep -qx 'CONFIG_VIRTUALIZATION=y' "$$host_kernel_config"; grep -qx 'CONFIG_KVM=y' "$$host_kernel_config"
touch "$@"

$(VIRT_GCPT_CONFIG_STAMP):
mkdir -p "$(@D)"
rm -f "$(@D)"/config.*
touch "$@"

$(VIRT_GCPT_BIN): scripts/build-gcpt.sh scripts/dts-config.sh $(TOOLCHAIN_WRAPPER) $(VIRT_GCPT_CONFIG_STAMP) $(VIRT_GCPT_SOURCES) $(VIRT_GCPT_DTS_SOURCES)
CROSS_COMPILE="$(abspath $(BUILDROOT_DIR)/output/host/bin)/riscv64-linux-" GCPT_IMPLEMENTATION=alpha DEFAULT_DTB="$(VIRT_HOST_DTB)" DTS_TEMPLATE_DIR="$(abspath $(DTS_DIR))" bash scripts/build-gcpt.sh bootloader/LibCheckpointAlpha $(VIRT_GCPT_BUILD_DIR)

VIRT_INPUT_NAME := $(notdir $(bin))
VIRT_INPUT_CASE := $(if $(filter fw_payload.bin fw_payload.qemu.bin,$(VIRT_INPUT_NAME)),$(notdir $(patsubst %/,%,$(dir $(bin)))),$(if $(filter %.fw_payload.qemu.bin,$(VIRT_INPUT_NAME)),$(patsubst %.fw_payload.qemu.bin,%,$(VIRT_INPUT_NAME)),$(if $(filter %.fw_payload.bin,$(VIRT_INPUT_NAME)),$(patsubst %.fw_payload.bin,%,$(VIRT_INPUT_NAME)),$(patsubst %.bin,%,$(VIRT_INPUT_NAME)))))
VIRT_INPUT_DIR := build/virt/$(VIRT_INPUT_CASE)
VIRT_INPUT_VARS := $(VIRT_INPUT_DIR)/vars.$(VIRT_BUILD_VARS_HASH).stamp
VIRT_INPUT_PACKAGE := $(VIRT_INPUT_DIR)/package.stamp
VIRT_INPUT_FIRMWARE := $(VIRT_INPUT_DIR)/host/$(VIRT_HOST_FIRMWARE)

$(VIRT_INPUT_VARS):
@mkdir -p "$(@D)"
@rm -f "$(@D)"/vars.*.stamp
@printf '%b\n' '$(VIRT_BUILD_VARS_CONTENT)' > "$@"

$(VIRT_INPUT_PACKAGE): $(bin) $(if $(elf),$(abspath $(elf))) $(VIRT_HOST_BUILD_STAMP) $(VIRT_INPUT_VARS) scripts/build-virtual-workload.py
@test -n "$(bin)" || { echo 'Usage: make virt bin=<input.bin>' >&2; exit 2; }
@mkdir -p "$(VIRT_INPUT_DIR)"
@$(VIRT_FAKEROOT) -- python3 scripts/build-virtual-workload.py input-package --input-bin "$(abspath $(bin))" $(if $(elf),--input-elf "$(abspath $(elf))") --host-rootfs "$(VIRT_HOST_ROOTFS)" --host-image "$(VIRT_HOST_IMAGE)" --guest-buildroot-output "$(BUILDROOT_DIR)/output" --host-buildroot-output "$(VIRT_HOST_BUILDROOT_DIR)" --out-dir "$(VIRT_INPUT_DIR)" --guest-harts "$(VIRT_GUEST_HARTS)" --guest-memory "$(VIRT_GUEST_MEMORY)" --qemu-start-timeout "$(VIRT_QEMU_START_TIMEOUT)"
@touch "$@"

$(VIRT_INPUT_FIRMWARE): $(VIRT_INPUT_PACKAGE) $(VIRT_GCPT_BIN) $(SBI_BIN) $(VIRT_GCPT_DTS_SOURCES) scripts/build-firmware-linux.sh scripts/dts-config.sh
@CROSS_COMPILE="$(abspath $(BUILDROOT_DIR)/output/host/bin)/riscv64-linux-" DTC="$(abspath $(BUILDROOT_DIR)/output/host/bin/dtc)" DEFAULT_DTB="$(VIRT_HOST_DTB)" DTB_MIN_MEMORY_BYTES="$(VIRT_HOST_MIN_MEMORY_BYTES)" INITRAMFS_OFFSET_ALIGNMENT_MB=2 MULTIHART=0 HARTS=1 FIRMWARE_OUTPUT="$@" bash scripts/build-firmware-linux.sh "$(VIRT_GCPT_BIN)" "$(SBI_BUILD_DIR)" "$(DTS_DIR)" "$(VIRT_INPUT_DIR)/host/Image" "$(VIRT_INPUT_DIR)/host"

$(VIRT_INPUT_DIR)/manifest.json: $(VIRT_INPUT_PACKAGE) $(VIRT_INPUT_FIRMWARE) scripts/build-virtual-workload.py
@$(VIRT_FAKEROOT) -- python3 scripts/build-virtual-workload.py manifest --out-dir "$(VIRT_INPUT_DIR)" --workload-name "$(VIRT_INPUT_CASE)" --platform "$(PLATFORM)" --guest-harts "$(VIRT_GUEST_HARTS)" --guest-memory "$(VIRT_GUEST_MEMORY)" --qemu-start-timeout "$(VIRT_QEMU_START_TIMEOUT)" --inner-qemu-version "$(VIRT_INNER_QEMU_VERSION)" --host-dtb "$(VIRT_HOST_DTB)" --host-min-memory-bytes "$(VIRT_HOST_MIN_MEMORY_BYTES)" $(VIRT_OUTER_QEMU_ARGS) --gcpt "$(VIRT_GCPT_BIN)" --opensbi "$(SBI_BIN)" --host-linux-revision "buildroot-selected" --opensbi-source bootloader/opensbi --opensbi-revision "$(shell git -C bootloader/opensbi rev-parse HEAD 2>/dev/null || printf unknown)" --host-defconfig "$(VIRT_HOST_DEFCONFIG)" --host-linux-config "$(VIRT_HOST_LINUX_CONFIG)" --guest-buildroot-output "$(BUILDROOT_DIR)/output" --host-buildroot-output "$(VIRT_HOST_BUILDROOT_DIR)" --buildroot-source "$(BUILDROOT_DIR)"

virt-inner: $(VIRT_INPUT_DIR)/manifest.json
@printf '[virt] Output written to %s\n' "$(abspath $(VIRT_INPUT_DIR))"

endif

# Build GCPT. Single-core firmware keeps LibCheckpointAlpha; LibCheckpoint is
# used for the QEMU multi-hart checkpoint format.
SBI_BUILD_DIR := $(if $(filter 1,$(MULTIHART)),build/opensbi-multihart,build/opensbi)
SBI_BIN := $(SBI_BUILD_DIR)/build/platform/generic/firmware/fw_jump.bin

GCPT_IMPLEMENTATION := $(if $(filter 1,$(MULTIHART)),libcheckpoint,alpha)
GCPT_SOURCE_DIR := $(if $(filter 1,$(MULTIHART)),bootloader/LibCheckpoint,bootloader/LibCheckpointAlpha)
GCPT_BUILD_DIR := $(if $(filter 1,$(MULTIHART)),build/LibCheckpoint,build/LibCheckpointAlpha)
Expand Down Expand Up @@ -191,9 +314,11 @@ AM_WORKLOAD_DIRS := $(patsubst workloads/am/%/build.sh,%,$(wildcard workloads/am
LINUX_GENERIC_WORKLOADS := $(sort $(filter-out $(LINUX_WORKLOAD_RULE_DIRS),$(LINUX_WORKLOAD_DIRS)))
AM_GENERIC_WORKLOADS := $(sort $(filter-out $(AM_WORKLOAD_RULE_DIRS),$(AM_WORKLOAD_DIRS)))
# QEMU support covers the Linux workloads with QEMU-compatible firmware flows.
# Virtualization consumes a prebuilt input and does not alter workload registration.
QEMU_SUPPORTED_LINUX_WORKLOADS := coremark spec2006 spec2017
LINUX_ENABLED_GENERIC_WORKLOADS := $(if $(filter qemu,$(PLATFORM)),$(filter $(QEMU_SUPPORTED_LINUX_WORKLOADS),$(LINUX_GENERIC_WORKLOADS)),$(LINUX_GENERIC_WORKLOADS))
LINUX_WORKLOAD_RULE_FILES := $(if $(filter qemu,$(PLATFORM)),$(wildcard $(foreach workload,$(QEMU_SUPPORTED_LINUX_WORKLOADS),workloads/linux/$(workload)/rules.mk)),$(wildcard workloads/linux/*/rules.mk))
LINUX_QEMU_SUPPORTED_ONLY := $(filter qemu,$(PLATFORM))
LINUX_ENABLED_GENERIC_WORKLOADS := $(if $(LINUX_QEMU_SUPPORTED_ONLY),$(filter $(QEMU_SUPPORTED_LINUX_WORKLOADS),$(LINUX_GENERIC_WORKLOADS)),$(LINUX_GENERIC_WORKLOADS))
LINUX_WORKLOAD_RULE_FILES := $(if $(LINUX_QEMU_SUPPORTED_ONLY),$(wildcard $(foreach workload,$(QEMU_SUPPORTED_LINUX_WORKLOADS),workloads/linux/$(workload)/rules.mk)),$(wildcard workloads/linux/*/rules.mk))

$(foreach workload,$(LINUX_ENABLED_GENERIC_WORKLOADS),$(eval $(call add_workload_linux,$(workload))))
$(foreach workload,$(AM_GENERIC_WORKLOADS),$(eval $(call add_workload_am,$(workload))))
Expand All @@ -220,7 +345,7 @@ source: $(BUILDROOT_DIR)/Makefile
make -C $(BUILDROOT_DIR) BR2_EXTERNAL=$(abspath br2-external) nemu_defconfig
make -C $(BUILDROOT_DIR) BR2_EXTERNAL=$(abspath br2-external) source

# Build all all-in-one firmware images
# Build all all-in-one firmware images, or their virtual counterparts
workloads: $(WORKLOADS_LINUX) $(WORKLOADS_AM_SENTINEL)

# Build all rootfs
Expand Down
56 changes: 56 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,62 @@ You can also build a single workload with:
- `make linux/workload_name` for a Linux workload.
- `make am/workload_name` for an AM workload.

To package an already-built Linux firmware, or a bare-metal binary linked for
the standard QEMU `virt` machine, as a nested KVM Guest, pass its bin explicitly
to the independent `virt` target. A directory processes each direct child
`*.bin` input independently:

```shell
make spec2006-images BENCH=bzip2 INPUT=chicken SPEC2006_ISO=/path/to/cpu2006.iso
make virt bin=build/images/spec2006/bin/bzip2_chicken.fw_payload.bin
make virt bin=build/images/spec2006/bin
```

To combine an existing image export and its matching virtual packages into a
new image directory, run:

```shell
make virt-images \
IMAGE_DIR=build/images/spec2006 \
VIRT_DIR=build/virt \
VIRT_IMAGE_DIR=build/images/spec2006-virt
```

The output keeps the original image layout. For each virtual case, `bin/`
contains the Host firmware, `kernel/`, `rootfs/`, and `dt/` contain its Host
components, while the workload ELF, command, configuration, and logs come from
the original image directory. Host GCPT and OpenSBI artifacts replace their
Guest counterparts. `manifest/<case>.json` describes the reorganized files and
links to the full virtual manifest under `manifest/virt/`. Virtual packages
without a matching `bin/<case>.fw_payload.bin` in `IMAGE_DIR` are ignored.
Neither source directory is modified. By default, the three paths above are
`build/images/spec2006`, `build/virt`, and `build/images/spec2006-virt`
respectively. `VIRT_IMAGE_DIR` must not already exist.

For Linux firmware, `virt` scans the supplied image for its RISC-V Linux Image,
FDT and initramfs addresses; it does not assume a fixed 4 MiB guest-image
offset. A bare-metal `.bin` is booted directly as the Guest kernel and must
already target QEMU `virt`, write its terminal status as
`VIRT_WORKLOAD_EXIT=<0..255>`. If a matching ELF is not present in the sibling
`elf/` directory, `virt` creates a minimal ELF load wrapper at `0x80000000` and
records it in `build/virt/<case>/`.
The input bin/ELF are consumed as-is and are never rebuilt by `virt`.

The images are exported with the usual SPEC CPU2006 image command:

```shell
make spec2006-images BENCH=bzip2 INPUT=chicken \
SPEC2006_ISO=/path/to/cpu2006.iso -jN
```

It writes the virtual Host firmware, device tree and manifest into
`build/virt/<case>/`. Inputs with the same case name share that output
directory.

`PLATFORM=nemu` uses the FPGA host DTB (`xiangshan-fpga-noAIA-mem16g-novec` by
default); `PLATFORM=qemu` uses the QEMU `nemu` host DTB
(`xiangshan-qemu-nemu-mem16g` by default). Override either with `VIRT_HOST_DTB`.

Single-core workloads default to NEMU. QEMU support covers CoreMark, SPEC
CPU2006, and SPEC CPU2017, which can be assembled with `PLATFORM=qemu`:

Expand Down
63 changes: 63 additions & 0 deletions br2-external/board/openxiangshan/nemu/linux-virt-host.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
CONFIG_SYSVIPC=y
CONFIG_NO_HZ_IDLE=y
CONFIG_HIGH_RES_TIMERS=y
# CONFIG_BPF_SYSCALL is not set
# CONFIG_CGROUPS is not set
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
# CONFIG_RD_GZIP is not set
# CONFIG_RD_BZIP2 is not set
# CONFIG_RD_LZMA is not set
# CONFIG_RD_XZ is not set
# CONFIG_RD_LZO is not set
# CONFIG_RD_LZ4 is not set
# CONFIG_RD_ZSTD is not set
# CONFIG_INITRAMFS_PRESERVE_MTIME is not set
CONFIG_NONPORTABLE=y
CONFIG_SMP=y
# CONFIG_RISCV_BOOT_SPINWAIT is not set
# CONFIG_COMPAT is not set
# CONFIG_EFI is not set
# CONFIG_SUSPEND is not set
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=y
CONFIG_JUMP_LABEL=y
# CONFIG_GCC_PLUGINS is not set
CONFIG_NET=y
CONFIG_UNIX=y
# CONFIG_PACKET is not set
# CONFIG_INET is not set
# CONFIG_WIRELESS is not set
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
# CONFIG_NETDEVICES is not set
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_DW=y
CONFIG_SERIAL_OF_PLATFORM=y
CONFIG_SERIAL_EARLYCON_RISCV_SBI=y
CONFIG_SERIAL_UARTLITE=y
CONFIG_SERIAL_SIFIVE=y
CONFIG_SERIAL_SIFIVE_CONSOLE=y
CONFIG_HVC_RISCV_SBI=y
# CONFIG_HW_RANDOM is not set
# CONFIG_I2C is not set
# CONFIG_FB is not set
# CONFIG_HID_SUPPORT is not set
# CONFIG_USB_SUPPORT is not set
# CONFIG_VIRTIO_MENU is not set
# CONFIG_VHOST_MENU is not set
# CONFIG_IOMMU_SUPPORT is not set
# CONFIG_RPMSG is not set
# CONFIG_EXT4_FS is not set
# CONFIG_FAT_FS is not set
CONFIG_TMPFS=y
# CONFIG_HUGETLBFS is not set
# CONFIG_CONFIGFS_FS is not set
# CONFIG_MISC_FILESYSTEMS is not set
# CONFIG_NLS is not set
CONFIG_PRINTK_TIME=y
# CONFIG_RUNTIME_KERNEL_TESTING_MENU is not set
# CONFIG_RUNTIME_TESTING_MENU is not set

19 changes: 19 additions & 0 deletions br2-external/configs/nemu_virt_host_defconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
BR2_riscv=y

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should name this file to xiangshan_virt_host_defconfig

BR2_RISCV_ISA_RVC=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TARGET_GENERIC_HOSTNAME="xiangshan-virt-host"
BR2_TARGET_GENERIC_ISSUE="Xiangshan NEMU virtualization host"
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL}/board/openxiangshan/nemu/linux-virt-host.config"
BR2_TARGET_ROOTFS_CPIO=y
BR2_TARGET_ROOTFS_CPIO_FULL=y
BR2_TARGET_ROOTFS_CPIO_NONE=y
BR2_PACKAGE_BUSYBOX_CONFIG_FRAGMENT_FILES="${BR2_EXTERNAL}/board/openxiangshan/nemu/busybox-taskset.fragment"
BR2_PACKAGE_NEMU_TRAP=y
BR2_PACKAGE_QEMU=y
BR2_PACKAGE_QEMU_SYSTEM=y
BR2_PACKAGE_QEMU_CHOOSE_TARGETS=y
BR2_PACKAGE_QEMU_TARGET_RISCV64=y


13 changes: 13 additions & 0 deletions scripts/build-firmware-linux.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ DEFAULT_DTB="${DEFAULT_DTB:-}"
DTB_MEMORY_PROFILE="${DTB_MEMORY_PROFILE:-}"
DTB_MIN_MEMORY_BYTES="${DTB_MIN_MEMORY_BYTES:-}"
DTB_REQUIRED_MIN_MEMORY_BYTES="${DTB_REQUIRED_MIN_MEMORY_BYTES:-}"
INITRAMFS_OFFSET_ALIGNMENT_MB="${INITRAMFS_OFFSET_ALIGNMENT_MB:-1}"
HARTS="${HARTS:-2}"
readonly MULTIHART_MAX_HARTS=128
readonly MULTIHART_KERNEL_OFFSET_MB=134
Expand Down Expand Up @@ -76,6 +77,18 @@ KERNEL_BEGIN_ADDR="$(dts_linux_kernel_address "$MEM_BEGIN" "$((KERNEL_MIN_OFFSET
KERNEL_END_ADDR=$(( KERNEL_BEGIN_ADDR + KERNEL_SIZE ))
KERNEL_OFFSET_KB=$(( (KERNEL_BEGIN_ADDR - MEM_BEGIN) / KILOBYTE ))
INITRAMFS_BEGIN_ADDR=$(( (KERNEL_END_ADDR + MEGABYTE - 1) / MEGABYTE * MEGABYTE ))
case "$INITRAMFS_OFFSET_ALIGNMENT_MB" in
''|*[!0-9]*) echo "INITRAMFS_OFFSET_ALIGNMENT_MB must be a positive integer" >&2; exit 1 ;;
esac
if [ "$INITRAMFS_OFFSET_ALIGNMENT_MB" -eq 0 ]; then
echo "INITRAMFS_OFFSET_ALIGNMENT_MB must be a positive integer" >&2
exit 1
fi
INITRAMFS_BEGIN_ADDR=$((
(INITRAMFS_BEGIN_ADDR + INITRAMFS_OFFSET_ALIGNMENT_MB * MEGABYTE - 1) /
(INITRAMFS_OFFSET_ALIGNMENT_MB * MEGABYTE) *
(INITRAMFS_OFFSET_ALIGNMENT_MB * MEGABYTE)
))
INITRAMFS_OFFSET_KB=$(( (INITRAMFS_BEGIN_ADDR - MEM_BEGIN) / KILOBYTE ))
INITRAMFS_SIZE=$(stat -c%s "$CPIO_ARCHIVE")
INITRAMFS_END_ADDR=$(( INITRAMFS_BEGIN_ADDR + INITRAMFS_SIZE ))
Expand Down
Loading
Loading