#!/bin/sh
# Make kernel-devel's struct module match the running kernel.
# Rocky/RHEL 9: if someone ran `make prepare` without pahole, CONFIG_DEBUG_INFO_BTF_MODULES
# disappears and out-of-tree modules fail with:
#   .gnu.linkonce.this_module section size must match
set -e
KVER=$(uname -r)
KBUILD=$(readlink -f "/lib/modules/${KVER}/build" 2>/dev/null || true)
BOOTCFG="/boot/config-${KVER}"

if [ ! -d "$KBUILD" ]; then
    echo "ERROR: kernel-devel for ${KVER} not found (missing ${KBUILD:-/lib/modules/${KVER}/build})" >&2
    echo "Install: dnf install kernel-devel-${KVER}" >&2
    exit 1
fi

if [ ! -f "$BOOTCFG" ]; then
    echo "WARN: ${BOOTCFG} missing, skip kbuild sync"
    exit 0
fi

if ! grep -q '^CONFIG_DEBUG_INFO_BTF_MODULES=y' "$BOOTCFG"; then
    echo "Running kernel was not built with BTF_MODULES; skip kbuild sync"
    exit 0
fi

AUTOCONF="${KBUILD}/include/generated/autoconf.h"
AUTOCONF_Y="${KBUILD}/include/config/auto.conf"
KCONFIG="${KBUILD}/.config"

if [ -f "$AUTOCONF" ] && grep -q 'CONFIG_DEBUG_INFO_BTF_MODULES' "$AUTOCONF"; then
    echo "kernel-devel autoconf.h already has BTF_MODULES"
    exit 0
fi

echo "Fixing kernel-devel headers to match /boot/config-${KVER} (BTF_MODULES)"
if [ -f "$KCONFIG" ]; then
    cp -a "$KCONFIG" "${KCONFIG}.bak-enyx" 2>/dev/null || true
fi
cp -a "$BOOTCFG" "$KCONFIG"

if [ -f "$AUTOCONF" ]; then
    cp -a "$AUTOCONF" "${AUTOCONF}.bak-enyx" 2>/dev/null || true
    if ! grep -q 'CONFIG_DEBUG_INFO_BTF_MODULES' "$AUTOCONF"; then
        sed -i '/#define CONFIG_DEBUG_INFO_BTF 1/a #define CONFIG_PAHOLE_HAS_SPLIT_BTF 1\n#define CONFIG_DEBUG_INFO_BTF_MODULES 1' "$AUTOCONF"
    fi
    sed -i 's/#define CONFIG_PAHOLE_VERSION 0$/#define CONFIG_PAHOLE_VERSION 130/' "$AUTOCONF"
    if ! grep -q 'CONFIG_CC_CAN_LINK_STATIC' "$AUTOCONF"; then
        sed -i '/#define CONFIG_CC_CAN_LINK 1/a #define CONFIG_CC_CAN_LINK_STATIC 1' "$AUTOCONF"
    fi
fi

if [ -f "$AUTOCONF_Y" ]; then
    cp -a "$AUTOCONF_Y" "${AUTOCONF_Y}.bak-enyx" 2>/dev/null || true
    if ! grep -q 'CONFIG_DEBUG_INFO_BTF_MODULES=y' "$AUTOCONF_Y"; then
        sed -i '/^CONFIG_DEBUG_INFO_BTF=y/a CONFIG_PAHOLE_HAS_SPLIT_BTF=y\nCONFIG_DEBUG_INFO_BTF_MODULES=y' "$AUTOCONF_Y"
    fi
    sed -i 's/^CONFIG_PAHOLE_VERSION=0$/CONFIG_PAHOLE_VERSION=130/' "$AUTOCONF_Y"
    if ! grep -q 'CONFIG_CC_CAN_LINK_STATIC=y' "$AUTOCONF_Y"; then
        sed -i '/^CONFIG_CC_CAN_LINK=y/a CONFIG_CC_CAN_LINK_STATIC=y' "$AUTOCONF_Y"
    fi
fi

echo "kbuild sync done: $(grep CONFIG_DEBUG_INFO_BTF_MODULES "$AUTOCONF" | head -1)"
