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
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%
copy from insmod/init.module.rc
copy 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/init.module.rc b/insmod/4k/init.module.rc
similarity index 100%
rename from insmod/init.module.rc
rename to insmod/4k/init.module.rc
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 @@
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 \