meta-wolfssl/classes/wolfssl-initramfs.bbclass

129 lines
5.3 KiB
Plaintext

# classes/wolfssl-initramfs.bbclass
#
# Purpose:
# Provide reusable functions that allow initramfs images to:
# - include wolfssl-linuxkm
# - run depmod inside the initramfs rootfs
# - optionally inject `modprobe libwolfssl` into /init
#
# IMPORTANT:
# This class does *not* automatically modify ROOTFS_POSTPROCESS_COMMAND.
# The consuming image recipe must explicitly opt-in:
#
# inherit wolfssl-initramfs
# PACKAGE_INSTALL:append = " wolfssl-linuxkm"
# ROOTFS_POSTPROCESS_COMMAND += " wolfssl_initramfs_run_depmod; "
# ROOTFS_POSTPROCESS_COMMAND += " wolfssl_initramfs_inject_after_modalias; "
#
# Available injection functions are documented below.
### ─────────────────────────────────────────────────────────────
### 0. Common helper
### ─────────────────────────────────────────────────────────────
wolfssl_initramfs_has_module() {
find "${IMAGE_ROOTFS}/lib/modules" -name 'libwolfssl.ko' >/dev/null 2>&1
}
wolfssl_initramfs_has_init() {
[ -f "${IMAGE_ROOTFS}/init" ]
}
### ─────────────────────────────────────────────────────────────
### 1. Run depmod inside the initramfs
### ─────────────────────────────────────────────────────────────
wolfssl_initramfs_run_depmod() {
echo "wolfssl-initramfs: running depmod" >&2
if [ ! -d "${IMAGE_ROOTFS}/lib/modules" ]; then
echo "wolfssl-initramfs: no modules directory found; skipping depmod" >&2
return 0
fi
if ! command -v depmod >/dev/null 2>&1; then
echo "wolfssl-initramfs: depmod not available; skipping" >&2
return 0
fi
for kdir in "${IMAGE_ROOTFS}"/lib/modules/*; do
[ -d "$kdir" ] || continue
kver=$(basename "$kdir")
echo "wolfssl-initramfs: depmod -a -b ${IMAGE_ROOTFS} ${kver}" >&2
depmod -a -b "${IMAGE_ROOTFS}" "${kver}" || \
echo "wolfssl-initramfs: WARNING: depmod failed for ${kver}" >&2
done
}
### ─────────────────────────────────────────────────────────────
### 2. Injection methods for /init
### ─────────────────────────────────────────────────────────────
# Common injection wrapper
wolfssl_initramfs_try_inject() {
local anchor="$1"
local sed_expr="$2"
local desc="$3"
if grep -q "$anchor" "${IMAGE_ROOTFS}/init"; then
echo "wolfssl-initramfs: injecting modprobe at: $desc" >&2
sed -i "$sed_expr" "${IMAGE_ROOTFS}/init" || \
echo "wolfssl-initramfs: WARNING: failed to inject at $desc" >&2
fi
}
### 2A: Inject after modalias scan loop
wolfssl_initramfs_inject_after_modalias() {
echo "wolfssl-initramfs: checking modalias injection" >&2
wolfssl_initramfs_has_init || { echo "… no /init, skip"; return 0; }
wolfssl_initramfs_has_module || { echo "… module missing, skip"; return 0; }
wolfssl_initramfs_try_inject \
"find /sys -name modalias" \
'/find \/sys -name modalias/a\
modprobe libwolfssl || echo "wolfssl-initramfs: failed to load libwolfssl" >&2' \
"modalias section"
}
### 2B: Inject after '# Load and run modules'
wolfssl_initramfs_inject_after_loadmodules() {
echo "wolfssl-initramfs: checking loadmodules injection" >&2
wolfssl_initramfs_has_init || { echo "… no /init, skip"; return 0; }
wolfssl_initramfs_has_module || { echo "… module missing, skip"; return 0; }
wolfssl_initramfs_try_inject \
'^# Load and run modules' \
'/^# Load and run modules/a\
modprobe libwolfssl || echo "wolfssl-initramfs: failed to load libwolfssl" >&2' \
"Load-and-run-modules section"
}
### 2C: Last-resort: Inject after kmsg redirect
wolfssl_initramfs_inject_after_kmsg() {
echo "wolfssl-initramfs: checking kmsg injection" >&2
wolfssl_initramfs_has_init || { echo "… no /init, skip"; return 0; }
wolfssl_initramfs_has_module || { echo "… module missing, skip"; return 0; }
wolfssl_initramfs_try_inject \
'exec > /dev/kmsg' \
'/exec > \/dev\/kmsg 2>&1/a\
modprobe libwolfssl || echo "wolfssl-initramfs: failed to load libwolfssl" >&2' \
"kmsg redirection section"
}
### ─────────────────────────────────────────────────────────────
### 3. Documentation (shown in bitbake -e or debugging)
### ─────────────────────────────────────────────────────────────
WOLFSSL_INITRAMFS_FUNCTIONS = "\
wolfssl_initramfs_run_depmod \
wolfssl_initramfs_inject_after_modalias \
wolfssl_initramfs_inject_after_loadmodules \
wolfssl_initramfs_inject_after_kmsg \
"