cvw/linux/Makefile

132 lines
4.2 KiB
Makefile

# .SECONDEXPANSION:
BUILDROOT := buildroot
IMAGES := ${BUILDROOT}/output/images
WALLYLINUX := $(WALLY)/linux
DIS := ${IMAGES}/disassembly
BR2_EXTERNAL_TREE := $(WALLYLINUX)/br2-external-tree
LINUX_TEST_VECTORS := $(RISCV)/linux-testvectors
# set sudo if needed depending on $RISCV
SUDO := $(shell mkdir -p $(RISCV)/.test > /dev/null 2>&1 || echo sudo)
# Device tree files
DTS ?= $(wildcard devicetree/*.dts)
DTB := $(foreach name, $(DTS:%.dts=%.dtb), $(IMAGES)/$(notdir $(name)))
# Disassembly stuff
BINARIES := fw_jump.elf vmlinux busybox
OBJDUMPS := $(foreach name, $(basename $(BINARIES) .elf), $(DIS)/$(name).objdump)
.PHONY: all check_environment check_write_permissions config Image disassemble generate install dumptvs clean cleanDTB
all: check_write_permissions clean config Image disassemble install dumptvs
check_environment: $(RISCV)
ifeq ($(findstring :$(RISCV)/lib:,:$(LD_LIBRARY_PATH):),)
@(echo "ERROR: Your environment variables are not set correctly." >&2 \
&& echo "Make sure to source setup.sh or install buildroot using the wally-tool-chain-install.sh script." >&2 \
&& exit 1)
endif
check_write_permissions: check_environment
ifeq ($(SUDO), sudo)
@echo "Cannot write to '$(RISCV)'." \
"Using sudo (you may be prompted for your password several times throughout the install)"
endif
@$(SUDO) mkdir -p $(RISCV)/.test || \
(echo "ERROR: Still unable to write to '$(RISCV)'." >&2 \
&& exit 1)
@$(SUDO) rm -r $(RISCV)/.test
Image: check_environment $(BUILDROOT)
bash -c "unset LD_LIBRARY_PATH; $(MAKE) -C $(BUILDROOT)"
# $(MAKE) generate
@echo "Buildroot Image successfully generated."
install: check_write_permissions
$(SUDO) rm -rf $(RISCV)/$(BUILDROOT)
$(SUDO) mv $(BUILDROOT) $(RISCV)/$(BUILDROOT)
@echo "Buildroot successfully installed."
TCP_PORT=1235
RAW_RAM_FILE=${LINUX_TEST_VECTORS}/ramGDB.bin
RAM_FILE=${LINUX_TEST_VECTORS}/ram.bin
RAW_BOOTMEM_FILE=${LINUX_TEST_VECTORS}/bootmemGDB.bin
BOOTMEM_FILE=${LINUX_TEST_VECTORS}/bootmem.bin
MEM_FILES=${RAM_FILE} ${BOOTMEM_FILE}
dumptvs: check_write_permissions ${MEM_FILES}
${LINUX_TEST_VECTORS}/%.bin: ${LINUX_TEST_VECTORS}/%GDB.bin
truncate -s %8 $^ # Extend file to 8 byte multiple
objcopy --reverse-bytes=8 -F binary $^ $@ # Reverse bytes
${LINUX_TEST_VECTORS}/%GDB.bin: | $(LINUX_TEST_VECTORS)
${WALLYLINUX}/qemuBoot.sh --gdb ${TCP_PORT} &
riscv64-unknown-elf-gdb -batch \
-ex "target remote :${TCP_PORT}" \
-ex "maintenance packet Qqemu.PhyMemMode:1" \
-ex "printf \"Creating ${RAW_BOOTMEM_FILE}\n\"" \
-ex "dump binary memory ${RAW_BOOTMEM_FILE} 0x1000 0x1fff" \
-ex "printf \"Creating ${RAW_RAM_FILE}\n\"" \
-ex "dump binary memory ${RAW_RAM_FILE} 0x80000000 0x8fffffff" \
-ex "kill" \
generate: $(DTB) $(IMAGES)
$(IMAGES)/%.dtb: ${WALLYLINUX}/devicetree/%.dts
dtc -I dts -O dtb $< > $@
$(IMAGES):
@ echo "No output/images directory in buildroot."
@ echo "Run make --jobs in buildroot directory before generating device tree binaries."; exit 1
$(RISCV):
@ echo "ERROR: No $(RISCV) directory. Make sure you have installed the Wally Toolchain."
@ echo "and sourced setup.sh"
# Disassembly rules ---------------------------------------------------
disassemble: check_environment
cp $(BUILDROOT)/output/build/linux-*/vmlinux $(IMAGES)
$(MAKE) $(OBJDUMPS) $(DIS)/rootfs
$(DIS)/rootfs: $(IMAGES)/rootfs.cpio
@echo "Ignore error about dev/console when extracting rootfs from rootfs.cpio"
mkdir -p $(DIS)/rootfs
-cpio -i -D $(DIS)/rootfs < $(IMAGES)rootfs.cpio
$(DIS)/%.objdump: $(IMAGES)/%.elf | $(DIS)
riscv64-unknown-elf-objdump -DS $< >> $@
$(WALLY)/bin/extractFunctionRadix.sh $@
$(DIS)/%.objdump: $(IMAGES)/% | $(DIS)
riscv64-unknown-elf-objdump -S $< >> $@
$(WALLY)/bin/extractFunctionRadix.sh $@
$(IMAGES)/vmlinux:
cp $(BUILDROOT)/output/build/linux-*/vmlinux $@
$(IMAGES)/busybox:
cp $(BUILDROOT)/output/build/busybox-*/busybox $@
config: $(BUILDROOT) $(BR2_EXTERNAL_TREE)/configs/wally_defconfig
$(MAKE) -C $(BUILDROOT) wally_defconfig BR2_EXTERNAL=$(BR2_EXTERNAL_TREE)
$(BUILDROOT):
git clone https://github.com/buildroot/buildroot.git $@
cd $@; git checkout 2024.11.x
$(LINUX_TEST_VECTORS):
$(SUDO) mkdir -p $@
$(DIS):
mkdir -p $@
cleanDTB:
rm -f $(IMAGES)/*.dtb
clean:
rm -rf $(BUILDROOT)