diff --git a/repos/base-hw/board/imx53_qsb/arch b/repos/base-hw/board/imx53_qsb/arch new file mode 100644 index 0000000000..16c61114d8 --- /dev/null +++ b/repos/base-hw/board/imx53_qsb/arch @@ -0,0 +1 @@ +arm_v7a diff --git a/repos/base-hw/board/imx53_qsb_tz/arch b/repos/base-hw/board/imx53_qsb_tz/arch new file mode 100644 index 0000000000..16c61114d8 --- /dev/null +++ b/repos/base-hw/board/imx53_qsb_tz/arch @@ -0,0 +1 @@ +arm_v7a diff --git a/repos/base-hw/board/imx6q_sabrelite/arch b/repos/base-hw/board/imx6q_sabrelite/arch new file mode 100644 index 0000000000..16c61114d8 --- /dev/null +++ b/repos/base-hw/board/imx6q_sabrelite/arch @@ -0,0 +1 @@ +arm_v7a diff --git a/repos/base-hw/board/imx7d_sabre/arch b/repos/base-hw/board/imx7d_sabre/arch new file mode 100644 index 0000000000..16c61114d8 --- /dev/null +++ b/repos/base-hw/board/imx7d_sabre/arch @@ -0,0 +1 @@ +arm_v7a diff --git a/repos/base-hw/board/imx8q_evk/arch b/repos/base-hw/board/imx8q_evk/arch new file mode 100644 index 0000000000..ae398b9a2e --- /dev/null +++ b/repos/base-hw/board/imx8q_evk/arch @@ -0,0 +1 @@ +arm_v8a diff --git a/repos/base-hw/board/nit6_solox/arch b/repos/base-hw/board/nit6_solox/arch new file mode 100644 index 0000000000..16c61114d8 --- /dev/null +++ b/repos/base-hw/board/nit6_solox/arch @@ -0,0 +1 @@ +arm_v7a diff --git a/repos/base-hw/board/pbxa9/arch b/repos/base-hw/board/pbxa9/arch new file mode 100644 index 0000000000..16c61114d8 --- /dev/null +++ b/repos/base-hw/board/pbxa9/arch @@ -0,0 +1 @@ +arm_v7a diff --git a/repos/base-hw/board/pc/arch b/repos/base-hw/board/pc/arch new file mode 100644 index 0000000000..1c09346681 --- /dev/null +++ b/repos/base-hw/board/pc/arch @@ -0,0 +1 @@ +x86_64 diff --git a/repos/base-hw/board/riscv_qemu/arch b/repos/base-hw/board/riscv_qemu/arch new file mode 100644 index 0000000000..d569162349 --- /dev/null +++ b/repos/base-hw/board/riscv_qemu/arch @@ -0,0 +1 @@ +riscv diff --git a/repos/base-hw/board/rpi/arch b/repos/base-hw/board/rpi/arch new file mode 100644 index 0000000000..45d74d270a --- /dev/null +++ b/repos/base-hw/board/rpi/arch @@ -0,0 +1 @@ +arm_v6 diff --git a/repos/base-hw/board/rpi3/arch b/repos/base-hw/board/rpi3/arch new file mode 100644 index 0000000000..ae398b9a2e --- /dev/null +++ b/repos/base-hw/board/rpi3/arch @@ -0,0 +1 @@ +arm_v8a diff --git a/repos/base-hw/board/usb_armory/arch b/repos/base-hw/board/usb_armory/arch new file mode 100644 index 0000000000..16c61114d8 --- /dev/null +++ b/repos/base-hw/board/usb_armory/arch @@ -0,0 +1 @@ +arm_v7a diff --git a/repos/base-hw/board/virt_qemu/arch b/repos/base-hw/board/virt_qemu/arch new file mode 100644 index 0000000000..16c61114d8 --- /dev/null +++ b/repos/base-hw/board/virt_qemu/arch @@ -0,0 +1 @@ +arm_v7a diff --git a/repos/base-hw/board/wand_quad/arch b/repos/base-hw/board/wand_quad/arch new file mode 100644 index 0000000000..16c61114d8 --- /dev/null +++ b/repos/base-hw/board/wand_quad/arch @@ -0,0 +1 @@ +arm_v7a diff --git a/repos/base-hw/board/zynq_qemu/arch b/repos/base-hw/board/zynq_qemu/arch new file mode 100644 index 0000000000..16c61114d8 --- /dev/null +++ b/repos/base-hw/board/zynq_qemu/arch @@ -0,0 +1 @@ +arm_v7a diff --git a/repos/base-hw/recipes/src/base-hw-imx53_qsb/content.mk b/repos/base-hw/recipes/src/base-hw-imx53_qsb/content.mk index aafceac37d..31319dcaf1 100644 --- a/repos/base-hw/recipes/src/base-hw-imx53_qsb/content.mk +++ b/repos/base-hw/recipes/src/base-hw-imx53_qsb/content.mk @@ -1,3 +1 @@ -BOARD = imx53_qsb - include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw-imx53_qsb_tz/content.mk b/repos/base-hw/recipes/src/base-hw-imx53_qsb_tz/content.mk index df38abb77d..cf571d6154 100644 --- a/repos/base-hw/recipes/src/base-hw-imx53_qsb_tz/content.mk +++ b/repos/base-hw/recipes/src/base-hw-imx53_qsb_tz/content.mk @@ -1,3 +1,4 @@ -BOARD = imx53_qsb_tz +CONTENT += src/core/board/imx53_qsb \ + src/bootstrap/board/imx53_qsb include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw-imx6q_sabrelite/content.mk b/repos/base-hw/recipes/src/base-hw-imx6q_sabrelite/content.mk index 94c7c8e2fd..31319dcaf1 100644 --- a/repos/base-hw/recipes/src/base-hw-imx6q_sabrelite/content.mk +++ b/repos/base-hw/recipes/src/base-hw-imx6q_sabrelite/content.mk @@ -1,3 +1 @@ -BOARD = imx6q_sabrelite - include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw-imx7d_sabre/content.mk b/repos/base-hw/recipes/src/base-hw-imx7d_sabre/content.mk index 135981d663..31319dcaf1 100644 --- a/repos/base-hw/recipes/src/base-hw-imx7d_sabre/content.mk +++ b/repos/base-hw/recipes/src/base-hw-imx7d_sabre/content.mk @@ -1,3 +1 @@ -BOARD = imx7d_sabre - include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw-imx8q_evk/content.mk b/repos/base-hw/recipes/src/base-hw-imx8q_evk/content.mk index 6ddaf5c86e..31319dcaf1 100644 --- a/repos/base-hw/recipes/src/base-hw-imx8q_evk/content.mk +++ b/repos/base-hw/recipes/src/base-hw-imx8q_evk/content.mk @@ -1,3 +1 @@ -BOARD = imx8q_evk - include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw-nit6_solox/content.mk b/repos/base-hw/recipes/src/base-hw-nit6_solox/content.mk index dc41e99cb9..31319dcaf1 100644 --- a/repos/base-hw/recipes/src/base-hw-nit6_solox/content.mk +++ b/repos/base-hw/recipes/src/base-hw-nit6_solox/content.mk @@ -1,3 +1 @@ -BOARD = nit6_solox - include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw-pbxa9/content.mk b/repos/base-hw/recipes/src/base-hw-pbxa9/content.mk index cf81fc0781..31319dcaf1 100644 --- a/repos/base-hw/recipes/src/base-hw-pbxa9/content.mk +++ b/repos/base-hw/recipes/src/base-hw-pbxa9/content.mk @@ -1,3 +1 @@ -BOARD = pbxa9 - include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw-pc/content.mk b/repos/base-hw/recipes/src/base-hw-pc/content.mk index aa6d5cb166..31319dcaf1 100644 --- a/repos/base-hw/recipes/src/base-hw-pc/content.mk +++ b/repos/base-hw/recipes/src/base-hw-pc/content.mk @@ -1,3 +1 @@ -BOARD = pc - include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw-rpi/content.mk b/repos/base-hw/recipes/src/base-hw-rpi/content.mk index 58bf77b875..31319dcaf1 100644 --- a/repos/base-hw/recipes/src/base-hw-rpi/content.mk +++ b/repos/base-hw/recipes/src/base-hw-rpi/content.mk @@ -1,3 +1 @@ -BOARD = rpi - include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw-rpi3/content.mk b/repos/base-hw/recipes/src/base-hw-rpi3/content.mk index c587367a88..31319dcaf1 100644 --- a/repos/base-hw/recipes/src/base-hw-rpi3/content.mk +++ b/repos/base-hw/recipes/src/base-hw-rpi3/content.mk @@ -1,3 +1 @@ -BOARD = rpi3 - include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw-virt_qemu/content.mk b/repos/base-hw/recipes/src/base-hw-virt_qemu/content.mk index a09b73090b..31319dcaf1 100644 --- a/repos/base-hw/recipes/src/base-hw-virt_qemu/content.mk +++ b/repos/base-hw/recipes/src/base-hw-virt_qemu/content.mk @@ -1,3 +1 @@ -BOARD = virt_qemu - include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw-zynq_qemu/content.mk b/repos/base-hw/recipes/src/base-hw-zynq_qemu/content.mk index 6f4158d13e..31319dcaf1 100644 --- a/repos/base-hw/recipes/src/base-hw-zynq_qemu/content.mk +++ b/repos/base-hw/recipes/src/base-hw-zynq_qemu/content.mk @@ -1,3 +1 @@ -BOARD = zynq_qemu - include $(GENODE_DIR)/repos/base-hw/recipes/src/base-hw_content.inc diff --git a/repos/base-hw/recipes/src/base-hw_content.inc b/repos/base-hw/recipes/src/base-hw_content.inc index 0883e66219..b817a10597 100644 --- a/repos/base-hw/recipes/src/base-hw_content.inc +++ b/repos/base-hw/recipes/src/base-hw_content.inc @@ -1,19 +1,182 @@ -include $(GENODE_DIR)/repos/base/recipes/src/base_content.inc +# +# Before including this file, the CONTENT variable may contain a list of +# repository-relative paths of content to include in the src archive in +# addition to the default content inferred for the given board. +# -content: src/bootstrap -src/bootstrap: +# +# Determine board name from the path to the src recipe's content.mk file +# + +# obtain directory name of src recipe w/o trailing slash +_BOARD := $(CONTENT_MK:/content.mk=) + +# strip all leading path elements, keeping only the src-recipe name +_BOARD := $(notdir $(_BOARD)) + +# remove "base-hw-" part of the src-recipe name, keeping only the board name +BOARD := $(patsubst base-hw-%,%,$(_BOARD)) + + +# +# Selection of ARCH-specific subdirectories and files +# + +LIB_MK_SPECS(arm_v6) := arm arm_v6 +LIB_MK_SPECS(arm_v7a) := arm arm_v7 cortex_a8 cortex_a9 cortex_a15 +LIB_MK_SPECS(arm_v8a) := arm_64 arm_v8 +LIB_MK_SPECS(x86_64) := x86_64 +LIB_MK_SPECS(riscv) := riscv + +SRC_BOOTSTRAP_SPECS(arm_v6) := arm +SRC_BOOTSTRAP_SPECS(arm_v7a) := arm +SRC_BOOTSTRAP_SPECS(arm_v8a) := arm_64 arm +SRC_BOOTSTRAP_SPECS(x86_64) := x86_64 +SRC_BOOTSTRAP_SPECS(riscv) := riscv + +SRC_CORE_SPECS(arm_v6) := arm arm_v6 +SRC_CORE_SPECS(arm_v7a) := arm arm_v7 cortex_a8 cortex_a9 cortex_a15 +SRC_CORE_SPECS(arm_v8a) := arm arm_v8 +SRC_CORE_SPECS(x86_64) := x86 x86_64 +SRC_CORE_SPECS(riscv) := riscv + +SRC_INCLUDE_HW_SPECS(arm_v6) := arm +SRC_INCLUDE_HW_SPECS(arm_v7a) := arm +SRC_INCLUDE_HW_SPECS(arm_v8a) := arm arm_64 +SRC_INCLUDE_HW_SPECS(x86_64) := x86_64 +SRC_INCLUDE_HW_SPECS(riscv) := riscv + +SRC_LIB_BASE_SPECS(arm_v6) := arm +SRC_LIB_BASE_SPECS(arm_v7a) := arm +SRC_LIB_BASE_SPECS(arm_v8a) := arm_64 +SRC_LIB_BASE_SPECS(x86_64) := x86_64 +SRC_LIB_BASE_SPECS(riscv) := riscv + +SRC_LIB_STARTUP_SPECS(arm_v6) := arm +SRC_LIB_STARTUP_SPECS(arm_v7a) := arm +SRC_LIB_STARTUP_SPECS(arm_v8a) := arm_64 +SRC_LIB_STARTUP_SPECS(x86_64) := x86_64 +SRC_LIB_STARTUP_SPECS(riscv) := riscv + +# location of hw-ld.mk file +LD_MK_DIR(arm_v6) := lib/mk/spec/arm +LD_MK_DIR(arm_v7a) := lib/mk/spec/arm +LD_MK_DIR(arm_v8a) := lib/mk/spec/arm_v8 +LD_MK_DIR(x86_64) := lib/mk/spec/x86_64 +LD_MK_DIR(riscv) := lib/mk/spec/riscv + + +# +# Defermine CPU architecture for the given BOARD +# + +BOARD_ARCH_PATH := $(REP_DIR)/board/$(BOARD)/arch + +ifeq ($(wildcard $(BOARD_ARCH_PATH)),) +content: arch_undefined +arch_undefined: + echo -n "\nError: CPU architecure for board $(BOARD) undefined\n\n" \ + " missing file $(BOARD_ARCH_PATH)\n\n" + false +else +ARCH := $(firstword $(shell cat $(BOARD_ARCH_PATH))) +endif + + +# +# Enumeration of package content +# + +BASE_DIR := $(GENODE_DIR)/repos/base +BASE_HW_DIR := $(GENODE_DIR)/repos/base-hw + +SRC_TIMER := target.inc include hw main.cc + +SRC_INCLUDE_HW += $(notdir $(wildcard $(BASE_HW_DIR)/src/include/hw/*.h)) \ + $(addprefix spec/,${SRC_INCLUDE_HW_SPECS(${ARCH})}) \ + uart + +SRC_BOOTSTRAP += hw env.cc init.cc lock.cc log.cc thread.cc \ + platform.cc platform.h \ + $(addprefix spec/,${SRC_BOOTSTRAP_SPECS(${ARCH})}) \ + $(addprefix board/,$(BOARD)) + +SRC_LIB_BASE += $(notdir $(wildcard $(BASE_HW_DIR)/src/lib/base/*.cc)) \ + $(notdir $(wildcard $(BASE_DIR)/src/lib/base/*.cc)) \ + ${SRC_LIB_BASE_SPECS(${ARCH})} + +SRC_LIB_STARTUP += init_main_thread.cc _main.cc \ + $(addprefix spec/,${SRC_LIB_STARTUP_SPECS(${ARCH})}) + +SRC_CORE += $(notdir $(wildcard $(BASE_HW_DIR)/src/core/*.cc)) \ + $(notdir $(wildcard $(BASE_HW_DIR)/src/core/*.h)) \ + $(notdir $(wildcard $(BASE_DIR)/src/core/*.cc)) \ + $(addprefix spec/,${SRC_CORE_SPECS(${ARCH})}) \ + $(addprefix board/,$(BOARD)) \ + version.inc target.inc include hw kernel + +LIB_MK := base-hw-common.mk base-hw.mk bootstrap-hw.inc core-hw.inc \ + timeout-hw.mk cxx.mk base.inc base-common.inc startup.inc \ + $(addprefix spec/,${LIB_MK_SPECS(${ARCH})}) + +CONTENT += $(addprefix src/timer/,$(SRC_TIMER)) \ + $(addprefix src/include/hw/,$(SRC_INCLUDE_HW)) \ + $(addprefix src/bootstrap/,$(SRC_BOOTSTRAP)) \ + $(addprefix lib/mk/,$(LIB_MK)) \ + $(addprefix src/lib/base/,$(SRC_LIB_BASE)) \ + $(addprefix src/lib/startup/,$(SRC_LIB_STARTUP)) \ + $(addprefix src/core/,$(SRC_CORE)) \ + src/lib/hw src/lib/ld src/lib/cxx \ + src/include/base/internal src/include/pager \ + include/drivers/uart + +# remove duplicates +CONTENT := $(sort $(CONTENT)) + + +# +# Utilities to aggregate content from base, base-hw, and rep directories +# + +_try_mirror_from = $(if $(wildcard $1/$2),mkdir -p $(dir $2); cp -r $1/$2 $(dir $2)) + +mirror_from_base_dir = $(call _try_mirror_from,$(GENODE_DIR)/repos/base,$@) +mirror_from_base_hw_dir = $(call _try_mirror_from,$(GENODE_DIR)/repos/base-hw,$@) +mirror_from_rep_dir = $(call _try_mirror_from,$(REP_DIR),$@) + + +# +# Rules +# + +content: $(CONTENT) + +$(CONTENT): + $(mirror_from_base_dir) + $(mirror_from_base_hw_dir) $(mirror_from_rep_dir) -content: generalize_target_names remove_other_board_libs +content: LICENSE +LICENSE: + cp $(GENODE_DIR)/LICENSE $@ -generalize_target_names: lib/mk src/lib src/timer - for spec in arm riscv x86_64; do \ - mv lib/mk/spec/$$spec/ld-hw.mk lib/mk/spec/$$spec/ld.mk; \ - done; +content: etc/specs.conf +etc/specs.conf: + $(mirror_from_base_hw_dir) + +content: generalize_target_names +generalize_target_names: $(CONTENT) + # apply kernel-agnostic convention of naming the timer and ld.lib.so + mv ${LD_MK_DIR(${ARCH})}/ld-hw.mk ${LD_MK_DIR(${ARCH})}/ld.mk sed -i "s/ld-hw/ld/" src/lib/ld/hw/target.mk sed -i "s/hw_timer_drv/timer/" src/timer/hw/target.mk + # supplement BOARD definition that normally comes form the build dir + sed -i "s/\?= unknown/:= $(BOARD)/" src/core/hw/target.mk + sed -i "s/\?= unknown/:= $(BOARD)/" src/bootstrap/hw/target.mk + # discharge targets when building for mismatching architecture + sed -i "1aREQUIRES := $(ARCH)" src/core/hw/target.mk + sed -i "1aREQUIRES := $(ARCH)" src/bootstrap/hw/target.mk + sed -i "/REQUIRES/s/hw/hw $(ARCH)/" src/timer/hw/target.mk + sed -i "1aREQUIRES := $(ARCH)" src/lib/ld/hw/target.mk -remove_other_board_libs: lib/mk - find lib/mk/spec -name core-hw-*.mk -o -name bootstrap-hw-*.mk |\ - grep -v "hw-$(BOARD).mk" | xargs rm -rf