diff --git a/Makefile b/Makefile index 5c7a7f1..0267b20 100644 --- a/Makefile +++ b/Makefile @@ -24,8 +24,19 @@ $(LINUX_IMAGE): $(TOOLCHAIN_WRAPPER) br2-external/configs/nemu_defconfig br2-ext # Build LibCheckpointAlpha GCPT_BUILD_DIR := build/LibCheckpointAlpha GCPT_BIN := $(GCPT_BUILD_DIR)/build/gcpt.bin -$(GCPT_BIN): scripts/build-gcpt.sh $(TOOLCHAIN_WRAPPER) - CROSS_COMPILE="$(abspath $(BUILDROOT_DIR)/output/host/bin)/riscv64-linux-" bash scripts/build-gcpt.sh bootloader/LibCheckpointAlpha $(GCPT_BUILD_DIR) +GCPT_DEFAULT_DTB ?= $(if $(DEFAULT_DTB),$(DEFAULT_DTB),xiangshan) +GCPT_DEFAULT_DTS := dts/$(GCPT_DEFAULT_DTB).dts.in +GCPT_DEFAULT_DTB_STAMP := build/LibCheckpointAlpha-config/dtb.$(shell printf '%s\n' "$(GCPT_DEFAULT_DTB)" | sha256sum | cut -d ' ' -f 1) +GCPT_SOURCES := $(shell find bootloader/LibCheckpointAlpha -path '*/.git' -prune -o -type f -print 2>/dev/null) +$(GCPT_DEFAULT_DTB_STAMP): + mkdir -p "$(@D)" + rm -f build/LibCheckpointAlpha-config/dtb.* + touch "$@" +$(GCPT_BIN): scripts/build-gcpt.sh $(TOOLCHAIN_WRAPPER) $(GCPT_SOURCES) $(GCPT_DEFAULT_DTS) $(GCPT_DEFAULT_DTB_STAMP) + CROSS_COMPILE="$(abspath $(BUILDROOT_DIR)/output/host/bin)/riscv64-linux-" \ + DEFAULT_DTB="$(GCPT_DEFAULT_DTB)" \ + DTS_TEMPLATE_DIR="$(abspath dts)" \ + bash scripts/build-gcpt.sh bootloader/LibCheckpointAlpha $(GCPT_BUILD_DIR) # Build OpenSBI SBI_BUILD_DIR := build/opensbi diff --git a/bootloader/LibCheckpointAlpha b/bootloader/LibCheckpointAlpha index 492de34..58019e3 160000 --- a/bootloader/LibCheckpointAlpha +++ b/bootloader/LibCheckpointAlpha @@ -1 +1 @@ -Subproject commit 492de34e54a0450b096649b403d2f42b39235b8a +Subproject commit 58019e356e9cec8ef4310cc4fe710ae8af48e618 diff --git a/scripts/build-gcpt.sh b/scripts/build-gcpt.sh index cdacf27..988dc03 100644 --- a/scripts/build-gcpt.sh +++ b/scripts/build-gcpt.sh @@ -5,6 +5,45 @@ GCPT_SOURCE_DIR="$(realpath "$1")" GCPT_BUILD_DIR="$(realpath "$2")" BUILD_DIR="$(dirname "$GCPT_BUILD_DIR")" +extract_clint_mmio() { + local dts_template_dir="$1" + local default_dtb="$2" + local dts_template="$dts_template_dir/$default_dtb.dts.in" + + if ! [ -f "$dts_template" ]; then + echo "Default DTS template not found: $dts_template" >&2 + return 1 + fi + + perl -0777 -ne ' + while (/(?:[A-Za-z_][A-Za-z0-9_]*:\s*)?[A-Za-z0-9,_-]*clint@[^{]*\{(.*?)\};/sg) { + my $node = $1; + next unless $node =~ /compatible\s*=\s*[^;]*"riscv,clint0"/s; + next unless $node =~ /reg\s*=\s*<([^>]+)>/s; + my @cells = $1 =~ /(0x[0-9a-fA-F]+|\d+)/g; + next unless @cells >= 2; + my $addr = (hex_or_dec($cells[0]) << 32) + hex_or_dec($cells[1]); + printf "0x%x\n", $addr; + exit 0; + } + exit 1; + sub hex_or_dec { + my ($v) = @_; + return $v =~ /^0x/i ? hex($v) : int($v); + } + ' "$dts_template" +} + +if [ -z "${CLINT_MMIO:-}" ] && [ -n "${DTS_TEMPLATE_DIR:-}" ]; then + DTS_TEMPLATE_DIR="$(realpath "$DTS_TEMPLATE_DIR")" + DEFAULT_DTB="${DEFAULT_DTB:-xiangshan}" + CLINT_MMIO="$(extract_clint_mmio "$DTS_TEMPLATE_DIR" "$DEFAULT_DTB" || true)" +fi + +if [ -n "${CLINT_MMIO:-}" ]; then + export CFLAGS="${CFLAGS:-} -DCONFIG_CLINT_MMIO=$CLINT_MMIO" +fi + # prepare OpenSBI source mkdir -p "$BUILD_DIR" rm -rf "$GCPT_BUILD_DIR" diff --git a/workloads/linux/spec2006/rules.mk b/workloads/linux/spec2006/rules.mk index 5f60c2a..baf7c29 100644 --- a/workloads/linux/spec2006/rules.mk +++ b/workloads/linux/spec2006/rules.mk @@ -151,7 +151,7 @@ linux/spec2006: spec2006-check-spec-dir echo " or: make linux/spec2006 BENCH=astar_biglakes SPEC=/path/to/cpu2006 -jN"; \ exit 1; \ fi - @$(MAKE) --no-print-directory -f "$(SPEC2006_RECURSE_MAKEFILE)" $(SPEC2006_BUILD_DIR)/$(SPEC2006_CASE)/fw_payload.bin + @$(MAKE) --no-print-directory -f "$(SPEC2006_RECURSE_MAKEFILE)" GCPT_DEFAULT_DTB="$(SPEC2006_DEFAULT_DTB)" $(SPEC2006_BUILD_DIR)/$(SPEC2006_CASE)/fw_payload.bin spec2006-elf: spec2006-check-spec-dir @if [ -z "$(BENCH)" ]; then \ @@ -179,7 +179,7 @@ spec2006-images: spec2006-check-spec-dir i=0; \ for case in $(SPEC2006_IMAGE_CASES); do \ i=$$((i + 1)); \ - SPEC2006_PROGRESS_K="$$i" SPEC2006_PROGRESS_N="$$total" $(MAKE) --no-print-directory -f "$(SPEC2006_RECURSE_MAKEFILE)" "$(SPEC2006_IMAGE_DIR)/bin/$$case.fw_payload.bin" || exit $$?; \ + SPEC2006_PROGRESS_K="$$i" SPEC2006_PROGRESS_N="$$total" $(MAKE) --no-print-directory -f "$(SPEC2006_RECURSE_MAKEFILE)" GCPT_DEFAULT_DTB="$(SPEC2006_DEFAULT_DTB)" "$(SPEC2006_IMAGE_DIR)/bin/$$case.fw_payload.bin" || exit $$?; \ done @printf '[spec2006 %s/%s] Output written to %s\n' "$(words $(SPEC2006_IMAGE_CASES))" "$(words $(SPEC2006_IMAGE_CASES))" "$(abspath $(SPEC2006_IMAGE_DIR))"