# C -> WASM WASI_ROOT := /opt/wasi-sdk WASI_CC := ${WASI_ROOT}/bin/clang WASI_CFLAGS := \ --target=wasm32 \ --sysroot=${WASI_ROOT}/share/wasi-sysroot \ -z stack-size=4096 \ -O0 \ -nostdlib \ -Wl,--no-entry \ -Wl,--export-all \ -Wl,--no-gc-sections \ -Wl,--initial-memory=65536 \ -Wl,--export=__heap_base \ -Wl,--export=__data_end # WASM -> Baremetal WAMR := /opt/wamr WAMRC := /opt/wamr-wamrc/wamrc WAMRCFLAGS := \ --target=i386 \ --cpu=generic XXD := busybox xxd # NOTE: make build-sum: "error: bp cannot be used in ‘asm’ here" # could remove "ebp" from the clobber list (ARCH_ASM_CLOBBER_ALL) or # use the -fomit-frame-pointer flag to tell gcc it shouldn't rely on ebp for enter/leave... CC := /opt/crosscompiler/bin/i686-elf-gcc CFLAGS := \ -I. \ -O0 \ -m32 \ -ffunction-sections \ -fomit-frame-pointer \ -ggdb IWASM_LIB := /opt/wamr-libiwasm # Baremetal LDFLAGS = \ -Wl,-T linker.ld \ $^ \ -Wl,--build-id=none \ -static \ -nostdlib \ -m32 \ -Wl,-rpath,${IWASM_LIB} \ -L${IWASM_LIB} \ -liwasm \ -lc \ -lgcc INCL := \ -I${WAMR}/core/iwasm/include \ -I${WAMR}/core/shared/utils \ -I${WAMR}/core/shared/platform/baremetal \ -I/opt/crosscompiler/i686-elf/include CC_LINUX := gcc CFLAGS_LINUX := \ -I. \ -O0 \ -m32 \ -ffunction-sections \ -ggdb IWASM_LIB_LINUX := /opt/wamr-libiwasm-linux LDFLAGS_LINUX = \ $^ \ -m32 \ -Wl,-rpath,${IWASM_LIB_LINUX} \ -L${IWASM_LIB_LINUX} \ -liwasm \ -lm INCL_LINUX := \ -I${WAMR}/core/iwasm/include \ -I${WAMR}/core/shared/utils \ -I${WAMR}/core/shared/platform/linux ################################################################ # C -> WASM ${BUILD_DIR}/%/module.wasm: %.c mkdir -p $(shell dirname $@) ${WASI_CC} ${WASI_CFLAGS} $< -o $@ ################################################################ # WASM -> Native Object File # ${BUILD_DIR}/%/system.o: ${BUILD_DIR}/%/module.wasm # ${WAMRC} --target=i386 --format=object -o ${BUILD_DIR}/$*/system.o ${BUILD_DIR}/$*/module.wasm # # ${BUILD_DIR}/startup.o: arch/bochs/startup.s # ${CC} $< ${CFLAGS} -c -o $@ # # ${BUILD_DIR}/%/system.elf: ${BUILD_DIR}/%/system.o ${BUILD_DIR}/startup.o # ${CC} ${LDFLAGS} -o $@ ################################################################ # WASM -> AOT -> Loaded by Runtime (FAIL) ${BUILD_DIR}/%/module.aot: ${BUILD_DIR}/%/module.wasm ${WAMRC} ${WAMRCFLAGS} -o $@ $< ${BUILD_DIR}/%/module_wasm.c: ${BUILD_DIR}/%/module.aot ${XXD} -i $< > $@ ${BUILD_DIR}/%/system.o: ${BUILD_DIR}/%/module_wasm.c cp embed/host.c ${BUILD_DIR}/$*/module_host.c sed -i \ -e "s/__WASM_ARRAY_FILE__/module_wasm.c/g" \ -e "s/__WASM_ARRAY__/build_bochs_$*_module_aot/g" \ -e "s/__WASM_ARRAY_LEN__/build_bochs_$*_module_aot_len/g" \ ${BUILD_DIR}/$*/module_host.c ${CC} ${CFLAGS} ${INCL} -c ${BUILD_DIR}/$*/module_host.c -o $@ ${BUILD_DIR}/startup.o: arch/bochs/startup.s ${CC} $< ${CFLAGS} -c -o $@ ${BUILD_DIR}/syscalls.o: syscalls.c ${CC} $< ${CFLAGS} -c -o $@ ${BUILD_DIR}/%/system.elf: ${BUILD_DIR}/%/system.o ${BUILD_DIR}/syscalls.o ${BUILD_DIR}/startup.o ${CC} ${LDFLAGS} -o $@ ################################################################ # WASM -> AOT -> Loaded by Runtime (Host/Linux) ${BUILD_DIR}/%/system-linux.o: ${BUILD_DIR}/%/module_wasm.c cp embed/host-linux.c ${BUILD_DIR}/$*/module_host-linux.c sed -i \ -e "s/__WASM_ARRAY_FILE__/module_wasm.c/g" \ -e "s/__WASM_ARRAY__/build_bochs_$*_module_aot/g" \ -e "s/__WASM_ARRAY_LEN__/build_bochs_$*_module_aot_len/g" \ ${BUILD_DIR}/$*/module_host-linux.c ${CC_LINUX} ${CFLAGS_LINUX} ${INCL_LINUX} -c ${BUILD_DIR}/$*/module_host-linux.c -o $@ ${BUILD_DIR}/%/system-linux.elf: ${BUILD_DIR}/%/system-linux.o ${CC_LINUX} ${LDFLAGS_LINUX} -o $@ ################################################################ # Bochs ${BUILD_DIR}/%/system.iso: ${BUILD_DIR}/%/system.elf rm -rf $(shell dirname $<)/grub mkdir -p $(shell dirname $<)/grub/boot/grub cp arch/bochs/grub.cfg $(shell dirname $<)/grub/boot/grub cp $< $(shell dirname $<)/grub/boot/system.elf grub-mkrescue -o $@ $(shell dirname $<)/grub BOCHS_RUNNER_ARGS = \ -V arch/bochs/vgabios.bin \ -b arch/bochs/BIOS-bochs-latest \ # Don't depend on system.iso so we can run the trace target from the fail docker image that does not have any wamr/wasi stuff # ${BUILD_DIR}/%/trace.pb: ${BUILD_DIR}/%/system.iso ${BUILD_DIR}/%/trace.pb: ${BOCHS_RUNNER} ${BOCHS_RUNNER_ARGS} -1 \ -f ${FAIL_TRACE} \ -e ${BUILD_DIR}/$*/system.elf \ -i ${BUILD_DIR}/$*/system.iso \ -- \ -Wf,--state-file=${BUILD_DIR}/state \ -Wf,--trace-file=${BUILD_DIR}/trace.pb \ -Wf,--start-symbol=start_trace \ -Wf,--end-symbol=stop_trace \ -Wf,--check-bounds client-%: ${BOCHS_RUNNER} ${BOCHS_RUNNER_ARGS} \ -f ${FAIL_INJECT} \ -e ${BUILD_DIR}/$(subst client-,,$@)/system.elf \ -i ${BUILD_DIR}/$(subst client-,,$@)/system.iso \ -j $(shell getconf _NPROCESSORS_ONLN) \ -- \ -Wf,--state-dir=${BUILD_DIR}/$(subst client-,,$@)/state \ -Wf,--trap \ -Wf,--timeout=10 \ -Wf,--ok-marker=ok_marker \ -Wf,--fail-marker=fail_marker \ -Wf,--catch-write-textsegment \ -Wf,--catch-outerspace \ 2>/dev/null | grep -B 2 -A 8 'INJECT' inject-%: ${BOCHS_RUNNER} ${BOCHS_RUNNER_ARGS} -1 \ -f ${FAIL_INJECT} \ -e ${BUILD_DIR}/$(subst inject-,,$@)/system.elf \ -i ${BUILD_DIR}/$(subst inject-,,$@)/system.iso \ -j 1 -- \ -Wf,--state-dir=${BUILD_DIR}/$(subst inject-,,$@)/state \ -Wf,--trap \ -Wf,--timeout=10 \ -Wf,--ok-marker=ok_marker \ -Wf,--fail-marker=fail_marker \ -Wf,--catch-write-textsegment \ -Wf,--catch-outerspace # TODO: Command line interface changed import-arch-%: ${BUILD_DIR}/%/trace.pb ${HOME}/.my.cnf # ${FAIL_IMPORT} -v ${ARCH}/$(patsubst import-arch-%,%,$@) -b mem -t $< -e $(shell dirname $<)/system.elf -i mem --memory-type ram # ${FAIL_IMPORT} -v ${ARCH}/$(patsubst import-arch-%,%,$@) -b regs-trace -t $< -e $(shell dirname $<)/system.elf -i mem --memory-type register # ${FAIL_IMPORT} -v ${ARCH}/$(patsubst import-arch-%,%,$@) -b regs -t $< -e $(shell dirname $<)/system.elf -i regs # ${FAIL_IMPORT} -v ${ARCH}/$(patsubst import-arch-%,%,$@) -b ip -t $< -e $(shell dirname $<)/system.elf -i regs --no-gp --ip # ${FAIL_PRUNE} -v ${ARCH}/$(patsubst import-arch-%,%,$@) -b %% --overwrite ${FAIL_IMPORT} -v ${ARCH}/$(patsubst import-arch-%,%,$@) -b mem -t $< -e $(shell dirname $<)/system.elf -i MemoryImporter ${FAIL_IMPORT} -v ${ARCH}/$(patsubst import-arch-%,%,$@) -b regs-trace -t $< -e $(shell dirname $<)/system.elf -i MemoryImporter ${FAIL_IMPORT} -v ${ARCH}/$(patsubst import-arch-%,%,$@) -b regs -t $< -e $(shell dirname $<)/system.elf -i RegisterImporter ${FAIL_IMPORT} -v ${ARCH}/$(patsubst import-arch-%,%,$@) -b ip -t $< -e $(shell dirname $<)/system.elf -i RegisterImporter --no-gp --ip ${FAIL_PRUNE} -v ${ARCH}/$(patsubst import-arch-%,%,$@) -b %% --overwrite define arch-make-targets build-$1: ${BUILD_DIR}/$1/system.iso trace-$1: ${BUILD_DIR}/$1/trace.pb objdump-$1: objdump --disassemble --disassembler-options intel --disassembler-color=off --source ${BUILD_DIR}/$1/system.elf | less linux-build-$1: ${BUILD_DIR}/$1/system-linux.elf linux-run-$1: ${BUILD_DIR}/$1/system-linux.elf ${BUILD_DIR}/$1/system-linux.elf linux-gdb-$1: ${BUILD_DIR}/$1/system-linux.elf gdb --tui ${BUILD_DIR}/$1/system-linux.elf bochs-run-$1: ${BUILD_DIR}/$1/system.iso bochs -q -f arch/bochs/bochsrc-docker.txt endef