diff --git a/insmod/Android.bp b/insmod/Android.bp new file mode 100644 index 0000000..4db5de5 --- /dev/null +++ b/insmod/Android.bp @@ -0,0 +1,13 @@ +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", + vendor: true, +} + diff --git a/insmod/init.common.cfg b/insmod/init.common.cfg new file mode 100644 index 0000000..3a81fd2 --- /dev/null +++ b/insmod/init.common.cfg @@ -0,0 +1,11 @@ +#################################################### +# init.insmod.common.cfg # +# This file contains common kernel modules to load # +# at init time by init.insmod.sh script # +#################################################### + +# Load common kernel modules +# Modules here will be loaded *before* device specific modules +modprobe|-b * +# All common modules loaded +setprop|vendor.common.modules.ready diff --git a/insmod/init.module.rc b/insmod/init.module.rc new file mode 100644 index 0000000..de23b5b --- /dev/null +++ b/insmod/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.mk b/insmod/insmod.mk new file mode 100644 index 0000000..aa2261a --- /dev/null +++ b/insmod/insmod.mk @@ -0,0 +1,4 @@ +BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs-common/insmod/sepolicy +PRODUCT_PACKAGES += \ + insmod.sh \ + init.common.cfg diff --git a/insmod/insmod.sh b/insmod/insmod.sh new file mode 100755 index 0000000..2c434ef --- /dev/null +++ b/insmod/insmod.sh @@ -0,0 +1,67 @@ +#!/vendor/bin/sh + +############################################################# +### init.insmod.cfg format: ### +### ----------------------------------------------------- ### +### [insmod|setprop|enable/moprobe|wait] [path|prop name] ### +### ... ### +############################################################# + +modules_dir= + +for f in /vendor/lib/modules/*/modules.dep /vendor/lib/modules/modules.dep; do + if [[ -f "$f" ]]; then + modules_dir="$(dirname "$f")" + break + fi +done + +if [[ -z "${modules_dir}" ]]; then + echo "Unable to locate 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 + setprop vendor.device.modules.ready + setprop vendor.all.modules.ready + setprop vendor.all.devices.ready + 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 ;; + "modprobe") + case ${arg} in + "-b *" | "-b") + arg="-b --all=${modules_dir}/modules.load" ;; + "*" | "") + arg="--all=${modules_dir}/modules.load" ;; + esac + modprobe -a -d "${modules_dir}" $arg ;; + "wait") wait_for_file $arg ;; + esac + done < $cfg_file +fi diff --git a/insmod/sepolicy/file_contexts b/insmod/sepolicy/file_contexts new file mode 100644 index 0000000..e048641 --- /dev/null +++ b/insmod/sepolicy/file_contexts @@ -0,0 +1,5 @@ +# Vendor_kernel_modules +/vendor_dlkm/lib/modules/.*\.ko u:object_r:vendor_kernel_modules:s0 + +/vendor/bin/insmod\.sh u:object_r:insmod-sh_exec:s0 + diff --git a/insmod/sepolicy/insmod-sh.te b/insmod/sepolicy/insmod-sh.te new file mode 100644 index 0000000..d7b4f72 --- /dev/null +++ b/insmod/sepolicy/insmod-sh.te @@ -0,0 +1,11 @@ +type insmod-sh, domain; +type insmod-sh_exec, vendor_file_type, exec_type, file_type; +init_daemon_domain(insmod-sh) + +allow insmod-sh self:capability sys_module; +allow insmod-sh vendor_kernel_modules:system module_load; +allow insmod-sh vendor_toolbox_exec:file execute_no_trans; + +set_prop(insmod-sh, vendor_device_prop) + +dontaudit insmod-sh proc_cmdline:file r_file_perms; diff --git a/insmod/sepolicy/property.te b/insmod/sepolicy/property.te new file mode 100644 index 0000000..50f7b34 --- /dev/null +++ b/insmod/sepolicy/property.te @@ -0,0 +1 @@ +vendor_internal_prop(vendor_device_prop) diff --git a/insmod/sepolicy/property_contexts b/insmod/sepolicy/property_contexts new file mode 100644 index 0000000..1e871b6 --- /dev/null +++ b/insmod/sepolicy/property_contexts @@ -0,0 +1,5 @@ +# Kernel modules related +vendor.common.modules.ready u:object_r:vendor_device_prop:s0 +vendor.device.modules.ready u:object_r:vendor_device_prop:s0 +vendor.all.modules.ready u:object_r:vendor_device_prop:s0 +vendor.all.devices.ready u:object_r:vendor_device_prop:s0