138 lines
5.0 KiB
Makefile
138 lines
5.0 KiB
Makefile
RISCV_PREFIX ?= riscv64-unknown-elf-
|
|
CC := $(RISCV_PREFIX)gcc
|
|
OBJCOPY := $(RISCV_PREFIX)objcopy
|
|
OBJDUMP := $(RISCV_PREFIX)objdump
|
|
SIZE := $(RISCV_PREFIX)size
|
|
NM := $(RISCV_PREFIX)nm
|
|
READELF := $(RISCV_PREFIX)readelf
|
|
HOSTCC ?= cc
|
|
|
|
LOCAL_ENV_ROOT := $(abspath ../../../../../edu/rv32i-hazard3-student-env)
|
|
RV_ENV_ROOT ?= $(if $(wildcard /opt/rv-env/vendor/Hazard3),/opt/rv-env,$(LOCAL_ENV_ROOT))
|
|
H3_COMMON := $(RV_ENV_ROOT)/vendor/Hazard3/test/sim/common
|
|
H3_INIT := $(H3_COMMON)/init.S
|
|
LDSCRIPT := $(H3_COMMON)/link_hazard3.ld
|
|
TB ?= $(RV_ENV_ROOT)/vendor/Hazard3/test/sim/tb_verilator/tb
|
|
|
|
FREERTOS := vendor/FreeRTOS-Kernel
|
|
FREERTOS_PORT := $(FREERTOS)/portable/GCC/RISC-V
|
|
BUILD := build
|
|
|
|
ARCH ?= rv32i_zicsr_zifencei
|
|
ABI ?= ilp32
|
|
CPPFLAGS := -Iinclude -Isrc/common -I$(FREERTOS)/include -I$(FREERTOS_PORT)
|
|
TARGET_FLAGS := -march=$(ARCH) -mabi=$(ABI) -Og -g3 -ffreestanding -fno-builtin -fno-stack-protector -ffunction-sections -fdata-sections -Wall -Wextra
|
|
CFLAGS := -std=c11 $(TARGET_FLAGS) $(CPPFLAGS)
|
|
ASFLAGS := -march=$(ARCH) -mabi=$(ABI) -g3 $(CPPFLAGS)
|
|
LDFLAGS := -march=$(ARCH) -mabi=$(ABI) -nostdlib -nostartfiles -T$(LDSCRIPT) -Wl,--no-relax -Wl,--gc-sections
|
|
LIBS := -lgcc
|
|
|
|
TASKS := task01_first_task
|
|
COMMON_OBJS := $(BUILD)/common/init.o $(BUILD)/common/crt0.o $(BUILD)/common/lab_io.o
|
|
KERNEL_OBJS := \
|
|
$(COMMON_OBJS) \
|
|
$(BUILD)/common/lab_freertos.o \
|
|
$(BUILD)/common/hazard3_freertos_traps.o \
|
|
$(BUILD)/common/memops.o \
|
|
$(BUILD)/kernel/tasks.o \
|
|
$(BUILD)/kernel/list.o \
|
|
$(BUILD)/kernel/heap_4.o \
|
|
$(BUILD)/kernel/port.o \
|
|
$(BUILD)/kernel/portASM.o
|
|
|
|
.PHONY: all tasks check check-contracts check-abi check-pair host-test sim check-determinism \
|
|
container-check pdf clean check-support task1 t1
|
|
|
|
all: tasks
|
|
tasks: $(addprefix $(BUILD)/,$(addsuffix /prog.bin,$(TASKS)))
|
|
task1 t1: $(BUILD)/task01_first_task/prog.bin
|
|
|
|
check-support:
|
|
@test -f "$(H3_INIT)" || { echo "missing $(H3_INIT); set RV_ENV_ROOT" >&2; exit 1; }
|
|
@test -f "$(LDSCRIPT)" || { echo "missing $(LDSCRIPT)" >&2; exit 1; }
|
|
|
|
$(BUILD)/common/init.o: $(H3_INIT) | check-support
|
|
mkdir -p $(@D)
|
|
$(CC) $(ASFLAGS) -c $< -o $@
|
|
$(BUILD)/common/crt0.o: src/common/crt0.S
|
|
mkdir -p $(@D)
|
|
$(CC) $(ASFLAGS) -c $< -o $@
|
|
$(BUILD)/common/hazard3_freertos_traps.o: src/common/hazard3_freertos_traps.S
|
|
mkdir -p $(@D)
|
|
$(CC) $(ASFLAGS) -c $< -o $@
|
|
$(BUILD)/common/lab_io.o: src/common/lab_io.c src/common/lab_io.h
|
|
mkdir -p $(@D)
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
$(BUILD)/common/lab_freertos.o: src/common/lab_freertos.c src/common/lab_freertos.h
|
|
mkdir -p $(@D)
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
$(BUILD)/common/memops.o: src/common/memops.c
|
|
mkdir -p $(@D)
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
$(BUILD)/kernel/tasks.o: $(FREERTOS)/tasks.c
|
|
mkdir -p $(@D)
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
$(BUILD)/kernel/list.o: $(FREERTOS)/list.c
|
|
mkdir -p $(@D)
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
$(BUILD)/kernel/heap_4.o: $(FREERTOS)/portable/MemMang/heap_4.c
|
|
mkdir -p $(@D)
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
$(BUILD)/kernel/port.o: $(FREERTOS_PORT)/port.c
|
|
mkdir -p $(@D)
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
$(BUILD)/kernel/portASM.o: $(FREERTOS_PORT)/portASM.S
|
|
mkdir -p $(@D)
|
|
$(CC) $(ASFLAGS) -c $< -o $@
|
|
|
|
$(BUILD)/task01_first_task/app.o: src/tasks/task01_first_task.c include/task01_first_task.h include/task01_workload.h
|
|
mkdir -p $(@D)
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
$(BUILD)/task01_first_task/task01_first_task.s: src/tasks/task01_first_task.c include/task01_first_task.h include/task01_workload.h
|
|
mkdir -p $(@D)
|
|
$(CC) $(CFLAGS) -S $< -o $@
|
|
$(BUILD)/task01_first_task/prog.elf: $(KERNEL_OBJS) $(BUILD)/task01_first_task/app.o
|
|
$(CC) $(LDFLAGS) -Wl,-Map,$(BUILD)/task01_first_task/prog.map -o $@ $^ $(LIBS)
|
|
$(SIZE) -A -x $@
|
|
$(BUILD)/task01_first_task/prog.bin: $(BUILD)/task01_first_task/prog.elf $(BUILD)/task01_first_task/task01_first_task.s
|
|
$(OBJCOPY) -O binary $< $@
|
|
$(OBJDUMP) -d -M no-aliases,numeric $< > $(BUILD)/task01_first_task/prog.lst
|
|
|
|
check-contracts:
|
|
mkdir -p $(BUILD)/contracts
|
|
$(CC) $(CFLAGS) -c tests/context_contract.c -o $(BUILD)/contracts/context_contract.o
|
|
@$(NM) --defined-only $(BUILD)/contracts/context_contract.o | grep -Fq task01_wrong_context_cast_exhibit
|
|
@echo "PASS C contract: explicit context layout; wrong void* cast remains a compile-only hazard"
|
|
|
|
host-test:
|
|
mkdir -p $(BUILD)/host
|
|
$(HOSTCC) -std=c11 -Wall -Wextra -Werror -Iinclude tests/workload_host.c -o $(BUILD)/host/workload_host
|
|
$(BUILD)/host/workload_host
|
|
@echo "PASS workload: sum 1..20000 = 200010000"
|
|
|
|
check-abi: $(BUILD)/task01_first_task/prog.elf
|
|
RISCV_NM=$(NM) RISCV_READELF=$(READELF) ./scripts/check_abi.sh
|
|
|
|
check-pair:
|
|
./scripts/check_pair.sh
|
|
|
|
sim: tasks
|
|
@test -x "$(TB)" || { echo "missing simulator $(TB)" >&2; exit 1; }
|
|
./scripts/run_sim.sh "$(TB)" "$(BUILD)"
|
|
|
|
check-determinism: tasks
|
|
@test -x "$(TB)" || { echo "missing simulator $(TB)" >&2; exit 1; }
|
|
./scripts/check_determinism.sh "$(TB)" "$(BUILD)"
|
|
|
|
check: tasks check-contracts host-test check-abi sim check-determinism
|
|
|
|
container-check:
|
|
docker run --rm --entrypoint bash -v "$(CURDIR):/work" -w /work edu-inf/rv32i-hazard3-env:latest -lc 'make clean check RV_ENV_ROOT=/opt/rv-env'
|
|
|
|
pdf: tasks
|
|
./scripts/render_pdf.sh
|
|
|
|
clean:
|
|
rm -rf $(BUILD)
|