From 99f848ed486b3698db398e63fb1613b9c17ec1b3 Mon Sep 17 00:00:00 2001 From: Kelvin Zhang Date: Thu, 9 May 2024 16:45:02 +0000 Subject: [PATCH] Add a different implementation of insmod.sh Use soong namespace to branch a implementation of insmod.sh . The newly added implementation is only added to PRODUCT_PACKAGE for dev option enabled devices. The only change to the script is skip loading kernel modules from vendor|system_dlkm when under 16K mode. Test: Dev option works Bug: 319335586 This reverts commit 11eb02562d7e89037c67f5a22a142b110b303a30. Change-Id: I5f5d4ee79be7f872ec321e93f58f6516974d0cad --- insmod/16k/Android.bp | 14 ++++ insmod/{ => 16k}/init.module.rc | 0 insmod/16k/insmod.sh | 119 ++++++++++++++++++++++++++++++++ insmod/4k/Android.bp | 13 ++++ insmod/4k/init.module.rc | 10 +++ insmod/{ => 4k}/insmod.sh | 0 insmod/Android.bp | 7 -- insmod/insmod.mk | 6 ++ 8 files changed, 162 insertions(+), 7 deletions(-) create mode 100644 insmod/16k/Android.bp rename insmod/{ => 16k}/init.module.rc (100%) create mode 100644 insmod/16k/insmod.sh create mode 100644 insmod/4k/Android.bp create mode 100644 insmod/4k/init.module.rc rename insmod/{ => 4k}/insmod.sh (100%) diff --git a/insmod/16k/Android.bp b/insmod/16k/Android.bp new file mode 100644 index 0000000..975c5dc --- /dev/null +++ b/insmod/16k/Android.bp @@ -0,0 +1,14 @@ + +soong_namespace { +} + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +sh_binary { + name: "insmod.sh", + src: "insmod.sh", + init_rc: ["init.module.rc"], + vendor: true, +} diff --git a/insmod/init.module.rc b/insmod/16k/init.module.rc similarity index 100% rename from insmod/init.module.rc rename to insmod/16k/init.module.rc diff --git a/insmod/16k/insmod.sh b/insmod/16k/insmod.sh new file mode 100644 index 0000000..8ec8199 --- /dev/null +++ b/insmod/16k/insmod.sh @@ -0,0 +1,119 @@ +#!/vendor/bin/sh + +############################################################# +### init.insmod.cfg format: ### +### ----------------------------------------------------- ### +### [insmod|setprop|enable/moprobe|wait] [path|prop name] ### +### ... ### +############################################################# + +modules_dir= +system_modules_dir= +vendor_modules_dir= + + +pagesize=$(getconf PAGESIZE) +# bootoption=$(getprop ro.product.build.16k_page.enabled) +# We do not need to check ro.product.build.16k_page.enabled , because this +# version of insmod.sh will only be used if PRODUCT_16K_DEVELOPER_OPTION +# is set to true + +if [ "$pagesize" != "4096" ] ; then + echo "Device has page size $pagesize , skip loading modules from vendor_dlkm/system_dlkm because all modules are stored on vendor_boot" + setprop vendor.common.modules.ready 1 + setprop vendor.device.modules.ready 1 + setprop vendor.all.modules.ready 1 + setprop vendor.all.devices.ready 1 + return 0 +fi + + +for dir in system vendor; do + for f in /${dir}/lib/modules/*/modules.dep /${dir}/lib/modules/modules.dep; do + if [[ -f "$f" ]]; then + if [[ "${dir}" == "system" ]]; then + system_modules_dir="$(dirname "$f")" + else + vendor_modules_dir="$(dirname "$f")" + modules_dir=${vendor_modules_dir} + fi + break + fi + done +done + +if [[ -z "${system_modules_dir}" ]]; then + echo "Unable to locate system kernel modules directory" 2>&1 +fi + +if [[ -z "${vendor_modules_dir}" ]]; then + echo "Unable to locate vendor kernel modules directory" 2>&1 + exit 1 +fi + +# imitates wait_for_file() in init +wait_for_file() +{ + filename="${1}" + timeout="${2:-5}" + + expiry=$(($(date "+%s")+timeout)) + while [[ ! -e "${filename}" ]] && [[ "$(date "+%s")" -le "${expiry}" ]] + do + sleep 0.01 + done +} + +if [ $# -eq 1 ]; then + cfg_file=$1 +else + # Set property even if there is no insmod config + # to unblock early-boot trigger + setprop vendor.common.modules.ready 1 + setprop vendor.device.modules.ready 1 + setprop vendor.all.modules.ready 1 + setprop vendor.all.devices.ready 1 + exit 1 +fi + +if [ -f $cfg_file ]; then + while IFS="|" read -r action arg + do + case $action in + "insmod") insmod $arg ;; + "setprop") setprop $arg 1 ;; + "enable") echo 1 > $arg ;; + "condinsmod") + prop=$(echo $arg | cut -d '|' -f 1) + module1=$(echo $arg | cut -d '|' -f 2) + module2=$(echo $arg | cut -d '|' -f 3) + value=$(getprop $prop) + if [[ ${value} == "true" ]]; then + insmod ${vendor_modules_dir}/${module1} + else + insmod ${vendor_modules_dir}/${module2} + fi + ;; + "modprobe") + case ${arg} in + "system -b *" | "system -b") + modules_dir=${system_modules_dir} + arg="-b --all=${system_modules_dir}/modules.load" ;; + "system *" | "system") + modules_dir=${system_modules_dir} + arg="--all=${system_modules_dir}/modules.load" ;; + "-b *" | "-b" | "vendor -b *" | "vendor -b") + modules_dir=${vendor_modules_dir} + arg="-b --all=${vendor_modules_dir}/modules.load" ;; + "*" | "" | "vendor *" | "vendor") + modules_dir=${vendor_modules_dir} + arg="--all=${vendor_modules_dir}/modules.load" ;; + esac + if [[ -d "${modules_dir}" ]]; then + modprobe -a -d "${modules_dir}" $arg + fi + ;; + "wait") wait_for_file $arg ;; + esac + done < $cfg_file +fi diff --git a/insmod/4k/Android.bp b/insmod/4k/Android.bp new file mode 100644 index 0000000..ddfec40 --- /dev/null +++ b/insmod/4k/Android.bp @@ -0,0 +1,13 @@ + +soong_namespace { +} +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +sh_binary { + name: "insmod.sh", + src: "insmod.sh", + init_rc: ["init.module.rc"], + vendor: true, +} diff --git a/insmod/4k/init.module.rc b/insmod/4k/init.module.rc new file mode 100644 index 0000000..de23b5b --- /dev/null +++ b/insmod/4k/init.module.rc @@ -0,0 +1,10 @@ +on init + # Loading common kernel modules in background + start insmod_sh + +service insmod_sh /vendor/bin/insmod.sh /vendor/etc/init.common.cfg + class main + user root + group root system + disabled + oneshot diff --git a/insmod/insmod.sh b/insmod/4k/insmod.sh similarity index 100% rename from insmod/insmod.sh rename to insmod/4k/insmod.sh diff --git a/insmod/Android.bp b/insmod/Android.bp index eed35ec..143e777 100644 --- a/insmod/Android.bp +++ b/insmod/Android.bp @@ -2,13 +2,6 @@ package { default_applicable_licenses: ["Android-Apache-2.0"], } -sh_binary { - name: "insmod.sh", - src: "insmod.sh", - init_rc: ["init.module.rc"], - vendor: true, -} - prebuilt_etc { name: "init.common.cfg", src: "init.common.cfg", diff --git a/insmod/insmod.mk b/insmod/insmod.mk index aa2261a..0d8da9e 100644 --- a/insmod/insmod.mk +++ b/insmod/insmod.mk @@ -1,3 +1,9 @@ +ifeq (true,$(PRODUCT_16K_DEVELOPER_OPTION)) +PRODUCT_SOONG_NAMESPACES += device/google/gs-common/insmod/16k +else +PRODUCT_SOONG_NAMESPACES += device/google/gs-common/insmod/4k +endif + BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs-common/insmod/sepolicy PRODUCT_PACKAGES += \ insmod.sh \