#!/bin/bash
set -euo pipefail
root=/opt/guest/root
mkdir -p "$root"/{bin,sbin,etc,proc,sys,dev,tmp,run,opt,lib/modules,lib/firmware} /opt/guest/artifacts
cp /bin/busybox "$root/bin/"
"$root/bin/busybox" --install "$root/bin"
cp /opt/guest/init "$root/init"
chmod 755 "$root/init"
cp -a /lib/modules/. "$root/lib/modules/"
cp -a /lib/firmware/amdgpu "$root/lib/firmware/"
for binary in /usr/bin/lspci /usr/sbin/modprobe; do
    cp --remove-destination "$binary" "$root/bin/"
    while read -r library; do
        mkdir -p "$root$(dirname "$library")"
        cp "$library" "$root$library"
    done < <(ldd "$binary" | awk '/=> \// {print $3} /^\s*\// {print $1}')
done
# The dynamic loader is listed without an arrow by ldd.
loader=$(ldd /usr/bin/lspci | awk '/ld-linux/ {print $1}')
mkdir -p "$root$(dirname "$loader")"
cp "$loader" "$root$loader"
cp /usr/share/misc/pci.ids "$root/etc/pci.ids"
cc -std=c11 -O2 -Wall -Wextra -Werror -static /opt/guest/register_probe.c -o "$root/opt/register-probe"
cp /opt/guest/guest-probe.conf "$root/etc/guest-probe.conf"
cc -std=c11 -O2 -Wall -Wextra -Werror -static /opt/guest/interrupt_probe.c /opt/guest/queue_probe.c /opt/guest/device_access.c -o "$root/opt/interrupt-probe"
cp /opt/guest/interrupt-probe.conf "$root/etc/interrupt-probe.conf"
cc -std=c11 -O2 -Wall -Wextra -Werror -static /opt/guest/dma_write_probe.c /opt/guest/queue_probe.c /opt/guest/device_access.c -o "$root/opt/dma-write-probe"
cp /opt/guest/dma-write-probe.conf "$root/etc/dma-write-probe.conf"
kernel_release=$(basename /lib/modules/*)
make -C "/lib/modules/$kernel_release/build" M=/opt/guest/module modules
cp /opt/guest/module/interrupt_observer.ko "$root/opt/"
cp /boot/vmlinuz-* /opt/guest/artifacts/vmlinuz
cd "$root"
find . -print0 | cpio --null -o --format=newc | gzip -1 > /opt/guest/artifacts/initramfs.cpio.gz
sha256sum /opt/guest/artifacts/* > /opt/guest/artifacts/SHA256SUMS
