From 77f7526a6e9b8782279c6ee1cacb65b42a923a28 Mon Sep 17 00:00:00 2001 From: Christian Dietrich Date: Mon, 16 Aug 2021 16:15:49 +0200 Subject: [PATCH] Multi-Arch Support: We support IA-32, RISCV-32, and RISCV-64 --- Makefile | 121 +++++++++----------------------- arch/bochs.mk | 53 +++++++++++++- arch/bochs/BIOS-bochs-latest | Bin 131072 -> 131072 bytes grub.cfg => arch/bochs/grub.cfg | 0 arch/bochs/vgabios.bin | Bin 40448 -> 40448 bytes arch/riscv-common.mk | 49 ++++++++++--- arch/riscv/lib.c | 2 +- arch/riscv32.mk | 2 +- arch/riscv64.mk | 5 ++ docker-compose.yml | 27 +++++++ long-trace.c | 17 +++++ main.c | 2 +- 12 files changed, 179 insertions(+), 99 deletions(-) rename grub.cfg => arch/bochs/grub.cfg (100%) create mode 100644 arch/riscv64.mk create mode 100644 docker-compose.yml create mode 100644 long-trace.c diff --git a/Makefile b/Makefile index 9fce2b6..6c775e4 100644 --- a/Makefile +++ b/Makefile @@ -6,12 +6,12 @@ all: help BUILD_DIR := build-${ARCH} FAIL_BIN ?= ${BUILD_DIR}/bin -BOCHS_RUNNER ?= ${FAIL_BIN}/bochs-experiment-runner FAIL_SERVER ?= ${FAIL_BIN}/generic-experiment-server FAIL_TRACE ?= ${FAIL_BIN}/fail-generic-tracing FAIL_INJECT ?= ${FAIL_BIN}/fail-generic-experiment -FAIL_IMPORT ?= ${FAIL_BIN}/import-trace --enable-sanitychecks +FAIL_IMPORT ?= ${FAIL_BIN}/import-trace --enable-sanitychecks FAIL_PRUNE ?= ${FAIL_BIN}/prune-trace +BOCHS_RUNNER ?= ${FAIL_BIN}/bochs-experiment-runner EXPERIMENTS := $(patsubst %.c,%,$(shell echo *.c)) @@ -33,11 +33,10 @@ help: docker: @echo Starting Docker with ARCH=$(ARCH) - docker run \ - -v ${PWD}:/home/fail/fail \ - -e ARCH=${ARCH} \ - -w /home/fail/fail \ - -it danceos/fail-ci-build + @echo "ARCH=${ARCH}" > .env.${ARCH} + docker-compose --env-file .env.${ARCH} up -d + docker-compose --env-file .env.${ARCH} run --entrypoint bash shell + ################################################################ # Download @@ -50,10 +49,10 @@ ${BUILD_DIR}/bin/fail-client: clean: - @rm -rf build + rm -rf ${BUILD_DIR} clean-%: - @rm -rf ${BUILD_DIR}/$(patsubst build-%,%,$@) + rm -rf ${BUILD_DIR}/$(patsubst clean-%,%,$@) build-%: @echo "****************************************************************\n\ @@ -65,36 +64,33 @@ build-%: ****************************************************************" -trace-%: %/system.elf %/system.iso - ${BOCHS_RUNNER} -e $< -i $(shell dirname $<)/system.iso -1 \ - -V vgabios.bin -b BIOS-bochs-latest \ - -f ${FAIL_TRACE} -- \ - -Wf,--start-symbol=os_main \ - -Wf,--save-symbol=os_main \ - -Wf,--end-symbol=stop_trace \ - -Wf,--check-bounds \ - -Wf,--state-file=$(shell dirname $<)/state \ - -Wf,--trace-file=$(shell dirname $<)/trace.pb -Wf,--elf-file=$< -q +trace-%: @echo "****************************************************************\n\ * The trace is now generated. It can be viewed with\n\ *\n\ -* $ dump-trace $(shell dirname $<)/trace.pb\n\ +* $ make dump-$(patsubst trace-%,%,$@)\n\ *\n\ * Next, we have to import the trace into the database\n\ *\n\ -* $ make import-$(shell dirname $<)\n\ +* $ make import-$(patsubst trace-%,%,$@)\n\ ****************************************************************" +dump-%: ${BUILD_DIR}/%/trace.pb + ${BUILD_DIR}/bin/dump-trace $(shell dirname $<)/trace.pb -import-%: %/trace.pb - ${FAIL_IMPORT} -t $< -i mem -e $(shell dirname $<)/system.elf -v $(shell dirname $<) -b mem - ${FAIL_IMPORT} -t $< -i regs -e $(shell dirname $<)/system.elf -v $(shell dirname $<) -b regs --flags - ${FAIL_IMPORT} -t $< -i regs -e $(shell dirname $<)/system.elf -v $(shell dirname $<) -b ip --no-gp --ip - ${FAIL_IMPORT} -t $< -i FullTraceImporter -v $(shell dirname $<) -b ip - ${FAIL_IMPORT} -t $< -i ElfImporter --objdump objdump -e $(shell dirname $<)/system.elf -v $(shell dirname $<) -b ip - ${FAIL_IMPORT} -t $< -i ElfImporter --objdump objdump -e $(shell dirname $<)/system.elf -v $(shell dirname $<) -b mem - ${FAIL_IMPORT} -t $< -i ElfImporter --objdump objdump -e $(shell dirname $<)/system.elf -v $(shell dirname $<) -b regs - ${FAIL_PRUNE} -v $(shell dirname $<) -b %% --overwrite +${HOME}/.my.cnf: + @echo "[client]" > $@ + @echo "user=fail" >> $@ + @echo "database=fail" >> $@ + @echo "password=fail" >> $@ + @echo "host=db" >> $@ + @echo "port=3306" >> $@ + +import-%: ${BUILD_DIR}/%/trace.pb ${HOME}/.my.cnf + ${FAIL_IMPORT} -v ${ARCH}/$(patsubst import-%,%,$@) -b mem -t $< -e $(shell dirname $<)/system.elf -i mem + ${FAIL_IMPORT} -v ${ARCH}/$(patsubst import-%,%,$@) -b regs -t $< -e $(shell dirname $<)/system.elf -i regs + ${FAIL_IMPORT} -v ${ARCH}/$(patsubst import-%,%,$@) -b ip -t $< -e $(shell dirname $<)/system.elf -i regs --no-gp --ip + ${FAIL_PRUNE} -v ${ARCH}/$(patsubst import-%,%,$@) -b %% --overwrite @echo "****************************************************************\n\ * The golden run sits now within the MySQL database. If you are interested,\n\ * use the 'mysql' command to inspect the curent state of the DB. The tables\n\ @@ -102,75 +98,26 @@ import-%: %/trace.pb *\n\ * Next, we have to run the campaign sever and the injection client\n\ *\n\ -* $ make server-$(shell dirname $<) &\n\ -* $ make client-$(shell dirname $<) \n\ +* $ make server-$(patsubst import-%,%,$@) &\n\ +* $ make client-$(patsubst import-%,%,$@) \n\n\ +* Afterwards, the results can be viewd with\n\ +* $ make result-$(subst import-,,$@)\n\ ****************************************************************" server-%: - ${FAIL_SERVER} -v $(subst server-,,$@) -b % - - -import-jump-%: %/trace.pb - ${FAIL_BIN}/import-trace -t $< -i RandomJumpImporter \ - --jump-from $(shell dirname $<).map \ - --jump-to $(shell dirname $<).map \ - -e $(shell dirname $<)/system.elf \ - -v $(shell dirname $<)/jump -b jump - ${FAIL_PRUNE} -v $(shell dirname $<)/jump -b %% --overwrite - -server-jump-%: - ${FAIL_SERVER} --inject-randomjumps -v $(subst server-jump-,,$@)/jump -b % - - -client-%: - ${BOCHS_RUNNER} -e $(subst client-,,$@)/system.elf \ - -j $(shell getconf _NPROCESSORS_ONLN) \ - -i $(subst client-,,$@)/system.iso \ - -V vgabios.bin -b BIOS-bochs-latest \ - -f ${FAIL_INJECT} -- \ - -Wf,--state-dir=$(subst client-,,$@)/state \ - -Wf,--trap -Wf,--timeout=10 \ - -Wf,--ok-marker=stop_trace \ - -Wf,--fail-marker=fail_marker \ - -Wf,--catch-write-textsegment \ - -Wf,--catch-outerspace \ - 2>/dev/null | grep -B 2 -A 8 'INJECT' - -inject-%: - ${BOCHS_RUNNER} -e $(subst inject-,,$@)/system.elf \ - -j 1 \ - -i $(subst inject-,,$@)/system.iso \ - -V vgabios.bin -b BIOS-bochs-latest \ - -f ${FAIL_INJECT} -- \ - -Wf,--state-dir=$(subst inject-,,$@)/state \ - -Wf,--trap -Wf,--timeout=10 \ - -Wf,--ok-marker=stop_trace \ - -Wf,--fail-marker=fail_marker \ - -Wf,--catch-write-textsegment \ - -Wf,--catch-outerspace -Wf,--catch-outerspace - - @echo "****************************************************************\n\ -* Congratiulations! You've run your first FAIL* injection campaign.\n\ -* The results can be viewd with\n\ -* $ make result-$(subst client-,,$@)\n\ -*\n\ -* For a more detailed information, have a look at the web-based resultbrowser.\n\ -*\n\ -* $ make resultbrowser\n\ -****************************************************************" + ${FAIL_SERVER} -v ${ARCH}/$(subst server-,,$@) -b % result-%: - @echo "select variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1)\ + @echo "select variant, benchmark, resulttype, sum(t.time2 - t.time1 + 1) as faults\ FROM variant v \ JOIN trace t ON v.id = t.variant_id \ JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_address = t.data_address\ JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id \ JOIN fsppilot p ON r.pilot_id = p.id \ + WHERE v.variant = \"${ARCH}/$(patsubst result-%,%,$@)\"\ GROUP BY v.id, resulttype \ - ORDER BY variant, benchmark,sum(t.time2-t.time1+1);" | mysql -t + ORDER BY variant, benchmark, resulttype;" |mysql -t -resultbrowser: - resultbrowser -s 0.0.0.0 # Do never remove implicitly generated stuff .SECONDARY: diff --git a/arch/bochs.mk b/arch/bochs.mk index 66a5b25..fa361a5 100644 --- a/arch/bochs.mk +++ b/arch/bochs.mk @@ -18,12 +18,63 @@ ${BUILD_DIR}/%/system.elf: ${BUILD_DIR}/%/system.o ${BUILD_DIR}/startup.o ${BUILD_DIR}/%/system.iso: ${BUILD_DIR}/%/system.elf rm -rf $(shell dirname $<)/grub mkdir -p $(shell dirname $<)/grub/boot/grub - cp grub.cfg $(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 \ + +${BUILD_DIR}/%/trace.pb: ${BUILD_DIR}/%/system.iso + ${BOCHS_RUNNER} ${BOCHS_RUNNER_ARGS} -1 \ + -f ${FAIL_TRACE} \ + -e $(shell dirname $<)/system.elf \ + -i $(shell dirname $<)/system.iso \ + -- \ + -Wf,--state-file=$(shell dirname $<)/state \ + -Wf,--trace-file=$(shell dirname $<)/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 + define arch-make-targets + build-$1: ${BUILD_DIR}/$1/system.iso + +trace-$1: ${BUILD_DIR}/$1/trace.pb + endef diff --git a/arch/bochs/BIOS-bochs-latest b/arch/bochs/BIOS-bochs-latest index 2d3fea31f67a8c140e70b71cf14ceacd397923ab..88771631128bf1cb8f04b56991fbdf55e1f96b68 100644 GIT binary patch delta 31061 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 z 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 Xtbeet+SGq|m5&9r&<0ehyZ!$FtQ#?J delta 36838 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 diff --git a/grub.cfg b/arch/bochs/grub.cfg similarity index 100% rename from grub.cfg rename to arch/bochs/grub.cfg diff --git a/arch/bochs/vgabios.bin b/arch/bochs/vgabios.bin index fa9806b76fca32f6e44cbb4a8e0bec637fb9e8ab..a6c56a569ef143742fc019b059f1602564f9463b 100644 GIT binary patch delta 2067 zcmbVNYfw{17`+=HP=d%y!mGS2QvuPSm_U+3z;Lk`F%%yd5wYS}g4Ei9&|0eqEt2pO z7vyEJ7N<_N?daSYO&esQP=DA;t;|$gamEMejkhye=%f`f>3464;IzM-o1D9QzO!d{ zzx}eQ>f=@Q@!Zy)Ty2@cExh2C@DPD$k$7vQC^<6yz4u$PFGZOTg(sSuZWtG$UIk$! z%)J>z1pO$<=t5laq3I-g2q&WYMM>?9Ozu|UM%z1?C2~GA=65l%a(8HK?_wh59?)p$ zVuW%}Xqc#ns9`Dk09P)naW(J=GfW+X1I7OCl?3fh^nZ;-;ws-$;;LCsxwwkDAim;) z7UO2AFtcex%^=@WOW1X;c3q%d=hIl|mq%aSSTpFs>~fM`9C^KfB?}r0z4ADzw^Kci z8R=r-JXx#sgtSjODg6b$j_09t94E>mWh&X*Vzc4uq^YR2QP6bBbT#K#p5oEx_Z&U-WOI-nYG<6BsT}xF!+dpk7U{+cxFturs zfG5)80f*C80!AoQ5Z$3Th98k+0O%Kb^`1kJNDq$}XQBOX$q!Eq^(ai1j zLTrV2qX9^2+db0k_c1eRFg?XEtEN)QQX;t`G>wt_AGQE(i2kDFzHv z#Q>JAtOOi$G6E~ISGv+W7uO7WVsG`UxJ2b0{emGR7IOZ~K-ypy7dGen2dubL^)a$i z!c{5+ZpAs^NsZ(@Wji<2D!`cBSYM6MkyuR(`}Q+wsLi>X5YkZR-{SG$WnQxey~5@j zePXWA;<@=rICtHGT*r#;z6LdCnIH`0Q^#ri&!X&H@cE*^$)%2*w0!9p^qj}$`~}qb zx&U@{?)hvv6y(QAU*3;0=a;ZvKNSQ6DmC8&+BId6g0hW;GlBaB4}colG{RD+Hp9G! zisEw|ySo|6{`juF#O_|)GXAiL0rzcNpuVVcTQ2jF23Nmx5YWHmGr%(?Lx5G*9=u>i`{ zyd1@EW%Pf*?O^;Fsp<95-ZZdQKL%Hs+BgJE=B#K6726`^A$MGi55-h8=h3@qrE-Ao zv%@c107c$(qd&gcGXD!lGq>3ighN{+kr>NcL%rSi>U$nP! zv=2|VN(7<@HG_^t2(Y{@T>L|mz9+y2R{Giyo9Pzxf*ieYo5>2jFzE5rjXkz!aE00I zIuE;!Ph0W9wqP`ZPqytvPjT#FB|3}WJscQxbPP^sdTT0`kwALVrc%+r;vgcd*q)+b+v(ZW0IemuETNd$>;*!+P)~_ zuX~{376BLU6kP*DW+tOA;?wOVXg3b&NJTQdp(97Q2lRXc`L|b*XjE-H0GU=0YB~q^ zcf^6h(xD7X0)-lT`;>Z`o&VuoD zh#S<#{}U2@W+3{ g>D__2xjO-E$LG7pUC%aucaEZts1W{~$4BM=0mU;qFB delta 2093 zcmb7FYfw{16uuimK#9DcYI#Jc6^inZ1d<3*V{{}!DB?r~G*ui4)mAHUI>@U*ARyAP z;cXo(`iGge>g`}4RGEg>nHF_yr`5KWs=#q81)_2An|-K`pHprED@FC50bQOJ&PEmGr(SaKesZ1aw9I1cp1OK=RCh=&Qrp# zA^Z7PTtb#_Jv!)B)kW0Fe69N(8n#0d*pTm=O*P;yVZe%O+qFaP)&owzL&If4zvR-+ z+=hH^Hn1HUPlv{v2|U7M!WBV_MV-Pggk~WU-Gra>c_f^~(W3C3*`h-JW&Q~NG2cVL z6T}IM1ZM>Og5LxN(Uc%4IU(5~%1q8rK9O=i#UPsdgbT&O*i6E!YSNx(&e4s_>tyW6 zidvaNJ7lE-l}85;xyKJGs9$l9D0XQnt5!ByC!35LJIDFyw$5Bvqi4m9>0}dge3fQB zwu=Ih9tVgwBO6wWV}h2CkkAuG7v|+`8kJx75vFO%h_HIuLrWSll#lN5cgkKzMvH9;H(MkpX^%q9vcD+HdX@~HXZ_;m(B;2q(=enNk0rY zGRGs5C-Gj9VAZXMTHESmcF=X9Yh7u!;U;-0vXS1K49!~R zqY84?R24q*1fR?GgZZnr^#eZJwh#8T zXM6s?!++-9gTUpyTXg=XchD1sz15RejGvDqOPn6F_d^r+__$R{=j#^8imUcuCD$qDq2q*WID9Qwcth zlJ$M)9)&~0p*`WW$E3pSq6qXZezRz)&z2%WEl}@Q>(yVWZ>T5Li^%*U1q)@7U+&wz z0G9PHIpt6GHm*T2yREwWa9bF!AqAxboB3Mda#I+uf=4zdDkPWag)HQW^Knzuk;ZJQ zgpx|l)PMs%W)H~b_|1z6jh4vIoTjqT5`qH^;n4z0C$m=$J+s9R>Z+gEgA&{a>^ zv_sP-&obS~hc@Q2vQy1?harMR+`}Im4xnm0VGwx4-_s5`Q{!TObLbnx$8{(D?XZBZ zdZFDk2BTo-DAaDU;RDUVi=K{ahvr*@jRaCOoV44ZW_G4*9O@5zy15KZ<0UQ9;0wUw z7&9S{DVw7ge)KhJr@C-?OW?d4<2u=N<R1Afr5IHY(Cr0c7n*uAxtucNp4LKCg8kc4kr-#U zWdxN1pHnA$%H0_^rZCn()g^?2%EZRDXkd)CNf##p!&w6FQK=M4$*9Azv#DEnZF_tW zb@v6qd{-)Uwgj6p;QIErLBiM`!Pn9Zn8uv3h8|eP2_u?0;sR%sQG9p@f(nM0fxS8c z%9G~=&9lJ>+FdW>NF+KL=Vh~a%pteTk|${MC7C_5>&6Sb!S74Sbz!%AtWj nI2;b;hlQO{eun?}&)|cdQnVLe=zPo`Xzcr%{QLx5iLw6xhlJc> diff --git a/arch/riscv-common.mk b/arch/riscv-common.mk index 5abb917..830f3ae 100644 --- a/arch/riscv-common.mk +++ b/arch/riscv-common.mk @@ -15,18 +15,51 @@ ${BUILD_DIR}/%/system.elf: ${BUILD_DIR}/startup.o ${BUILD_DIR}/%/system.o ${CC} ${CFLAGS} ${LDFLAGS} -o $@ $^ -define arch-make-targets -build-$1: ${BUILD_DIR}/$1/system.elf - -trace-$1: ${BUILD_DIR}/$1/system.elf +${BUILD_DIR}/%/trace.pb: ${BUILD_DIR}/%/system.elf ${FAIL_TRACE} \ - -Wf,--elf-file -Wf,$$< \ + -Wf,--elf-file -Wf,$< \ -Wf,--start-symbol -Wf,start_trace \ -Wf,--end-symbol -Wf,stop_trace \ -Wf,--check-bounds \ - -Wf,--state-file=$$(dir $$<)/state \ - -Wf,--trace-file=$$(dir $$<)/trace.pb \ - $$< + -Wf,--state-file=$(dir $<)/state \ + -Wf,--trace-file=$(dir $<)/trace.pb \ + -V $< + +client-%: + ${BOCHS_RUNNER} --mode sail \ + -f ${FAIL_INJECT} \ + -e ${BUILD_DIR}/$(subst client-,,$@)/system.elf \ + -j $(shell getconf _NPROCESSORS_ONLN) \ + -- \ + -Wf,--state-dir=${BUILD_DIR}/$(subst client-,,$@)/state \ + -Wf,--trap \ + -Wf,--timeout=100000 \ + -Wf,--ok-marker=ok_marker \ + -Wf,--fail-marker=fail_marker \ + -Wf,--catch-write-textsegment \ + -Wf,--catch-outerspace \ + -V 2>/dev/null | grep -B 2 -A 8 'INJECT' + +inject-%: + ${BOCHS_RUNNER} --mode sail -1 -j 1 \ + -f ${FAIL_INJECT} \ + -e ${BUILD_DIR}/$(subst inject-,,$@)/system.elf \ + -- \ + -Wf,--state-dir=${BUILD_DIR}/$(subst inject-,,$@)/state \ + -Wf,--trap \ + -Wf,--timeout=100000 \ + -Wf,--ok-marker=ok_marker \ + -Wf,--fail-marker=fail_marker \ + -Wf,--catch-write-textsegment \ + -Wf,--catch-outerspace -V + + + +define arch-make-targets +build-$1: ${BUILD_DIR}/$1/system.elf + +trace-$1: ${BUILD_DIR}/$1/trace.pb + endef diff --git a/arch/riscv/lib.c b/arch/riscv/lib.c index 05af63d..2bf7978 100644 --- a/arch/riscv/lib.c +++ b/arch/riscv/lib.c @@ -1,3 +1,3 @@ #include "arch/riscv/bootcode/boot.h" - +#define asm __asm__ diff --git a/arch/riscv32.mk b/arch/riscv32.mk index f928573..f5f6900 100644 --- a/arch/riscv32.mk +++ b/arch/riscv32.mk @@ -1,4 +1,4 @@ -FAIL_DOWNLOAD_URL = ${FAIL_DOWNLOAD_BASE}?job=build-riscv-generic-tools%3A+%5Briscv64%5D +FAIL_DOWNLOAD_URL = ${FAIL_DOWNLOAD_BASE}?job=build-riscv-generic-tools%3A+%5Briscv32%5D include arch/riscv-common.mk diff --git a/arch/riscv64.mk b/arch/riscv64.mk new file mode 100644 index 0000000..dc97817 --- /dev/null +++ b/arch/riscv64.mk @@ -0,0 +1,5 @@ +FAIL_DOWNLOAD_URL = ${FAIL_DOWNLOAD_BASE}?job=build-riscv-generic-tools%3A+%5Briscv64%5D + +include arch/riscv-common.mk + +CFLAGS += -march=rv64im -target riscv64-unknown-freebsd diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7013690 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +version: '3' +services: + db: + image: mariadb + container_name: db + restart: always + environment: + - MYSQL_ROOT_PASSWORD="secret" + - MARIADB_DATABASE=fail + - MARIADB_USER=fail + - MARIADB_PASSWORD=fail + volumes: + - ./db:/var/lib/mysql + + shell: + image: danceos/fail-ci-build + stdin_open: true # docker run -i + restart: "no" + tty: true # docker run -t + entrypoint: ["echo", "Service foo disabled"] + links: + - db + environment: + - ARCH=${ARCH} + volumes: + - .:/home/fail/fail + diff --git a/long-trace.c b/long-trace.c new file mode 100644 index 0000000..d7e413d --- /dev/null +++ b/long-trace.c @@ -0,0 +1,17 @@ +#include "lib.c" + +int array[] = {1, 1, 2, 3, 5, 8, 13, 21}; +int sum; +void os_main() { + MARKER(start_trace); + sum = 20; + + for (int i = 0; i < 1 << 20; i++) { + sum += (array[i % (sizeof(array)/sizeof(*array))] * 23) + 1; + } + + MARKER(stop_trace); + + MARKER(ok_marker); +} + diff --git a/main.c b/main.c index c0a387d..45834ef 100644 --- a/main.c +++ b/main.c @@ -14,7 +14,7 @@ MAIN() { if (sum != 1270) - MARKER(fail_maker); + MARKER(fail_marker); else MARKER(ok_marker); }