diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 3d57fd5..5c1e358 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -2,6 +2,8 @@ steps: - label: "build amd64 in docker" key: make_docker command: "make docker" + artifact_paths: + - "initramfs.gz" agents: image: family/core-ubuntu-2204 provider: gcp @@ -29,6 +31,7 @@ steps: key: test command: "./.buildkite/runtest.sh" depends_on: + - make_docker - make_centos7 agents: image: family/core-ubuntu-2204 diff --git a/.buildkite/runtest.sh b/.buildkite/runtest.sh index 205bff9..33c5d8d 100755 --- a/.buildkite/runtest.sh +++ b/.buildkite/runtest.sh @@ -12,8 +12,15 @@ if [ -z "${BUILDKITE}" ]; then exit 1 fi +download initramfs.gz . download quark-test . chmod +x quark-test +echo updating packages... +sudo apt-get -qq update -y +echo installing packages... +sudo apt-get -qq install -y --no-install-recommends qemu-system-x86 > /dev/null + sudo ./quark-test +./krun.sh initramfs.gz kernel-images/linux-4.18.0-553.el8_10.x86_64 quark-test exit $? diff --git a/Makefile b/Makefile index 763954e..2a24cf0 100644 --- a/Makefile +++ b/Makefile @@ -197,7 +197,9 @@ DOCKER_RUN_ARGS=$(QDOCKER) \ docker: docker-image clean-all $(call msg,DOCKER-RUN,Dockerfile) - $(Q)$(DOCKER) run $(DOCKER_RUN_ARGS) /bin/bash -c "make -C $(PWD)" + $(Q)$(DOCKER) run \ + $(DOCKER_RUN_ARGS) \ + /bin/bash -c "make -C $(PWD) all initramfs.gz" docker-cross-arm64: clean-all docker-image manpages.h $(call msg,DOCKER-RUN,Dockerfile) diff --git a/init.c b/init.c index 4558a4c..66247be 100644 --- a/init.c +++ b/init.c @@ -12,6 +12,7 @@ #include #include #include +#include #include static void @@ -27,11 +28,31 @@ powerdown(void) } } +static void +display_banner(char *argv[]) +{ + struct utsname uts; + char **pp; + + if (uname(&uts) == -1) + warn("uname"); + else { + putchar('`'); + for (pp = argv; *pp != 0; pp++) { + if (pp != argv) + putchar(' '); + printf("%s", *pp); + } + putchar('`'); + printf(" on %s %s\n", uts.release, uts.machine); + } +} + int main(int argc, char *argv[]) { - pid_t pid; - int status; + pid_t pid; + int status; /* * Cut the kernel some slack until it is in a good shape, I see TSC @@ -55,7 +76,6 @@ main(int argc, char *argv[]) /* child */ if (pid == 0) { - if (mkdir("/proc", 0666) != 0) err(1, "mkdir /proc"); if (mkdir("/sys", 0666) != 0) @@ -76,6 +96,8 @@ main(int argc, char *argv[]) } } + display_banner(argv); + return (execv(argv[0], argv)); } diff --git a/kernel-images/linux-4.18.0-553.el8_10.x86_64 b/kernel-images/linux-4.18.0-553.el8_10.x86_64 new file mode 100755 index 0000000..851900c Binary files /dev/null and b/kernel-images/linux-4.18.0-553.el8_10.x86_64 differ diff --git a/krun.sh b/krun.sh new file mode 100755 index 0000000..72c6356 --- /dev/null +++ b/krun.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +Script=${0##*/} + +function usage +{ + echo "usage: $Script initramfs_path kernel_path cmd_line" 1>&2 + exit 1 +} + +if [ $# -lt 3 ]; then + usage +fi + +initramfs="$1" +kernel="$2" +shift 2 +cmdline="$*" + +function qemu { + case "$(file -b "$kernel" | awk '{print $3}')" in + x86) + qemu-system-x86_64 \ + -initrd "$initramfs" \ + -kernel "$kernel" \ + -nographic \ + --append "console=ttyS0 quiet TERM=dumb $cmdline" + ;; + ARM64) + qemu-system-aarch64 \ + -machine virt \ + -cpu cortex-a57 \ + -initrd "$initramfs" \ + -kernel "$kernel" \ + -nographic \ + --append "console=ttyAMA0 quiet $cmdline" + ;; + *) + echo unknown kernel image arch 1>&2; exit 1;; + esac +} + +exitcode=1 +while read -r line +do + echo "$line" + if grep -q '^quark-test exited with ' <<< "$line"; then + line="$(tr -d '\r' <<< "$line")" + exitcode="$(awk '{print $4}' <<< "$line")" + fi +done < <(qemu) + +echo exited with "$exitcode" + +exit $((exitcode)) diff --git a/ktestall.sh b/ktestall.sh new file mode 100755 index 0000000..f249443 --- /dev/null +++ b/ktestall.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +truncate -s 0 result + +for k in /d/e/ebpf/kernel-images/debian/x86_64/* /d/kernel-images/* +do + kname="$(basename "$k")" + echo testing "$kname" + if ./ktest.sh initramfs.gz "$k"; then + printf "%s: ok\n" "$kname" >> result + else + printf "%s: fail\n" "$kname" >> result + fi +done