diff --git a/init/first_stage_init.cpp b/init/first_stage_init.cpp index 3239eb7ca..c6a287ab6 100644 --- a/init/first_stage_init.cpp +++ b/init/first_stage_init.cpp @@ -163,6 +163,21 @@ std::string GetPageSizeSuffix() { return android::base::StringPrintf("_%zuk", page_size / 1024); } +constexpr bool EndsWith(const std::string_view str, const std::string_view suffix) { + return str.size() >= suffix.size() && + 0 == str.compare(str.size() - suffix.size(), suffix.size(), suffix); +} + +constexpr std::string_view GetPageSizeSuffix(std::string_view dirname) { + if (EndsWith(dirname, "_16k")) { + return "_16k"; + } + if (EndsWith(dirname, "_64k")) { + return "_64k"; + } + return ""; +} + } // namespace std::string GetModuleLoadList(BootMode boot_mode, const std::string& dir_path) { @@ -211,7 +226,8 @@ bool LoadKernelModules(BootMode boot_mode, bool want_console, bool want_parallel } dirent* entry = nullptr; std::vector module_dirs; - const std::string release_specific_module_dir = uts.release + GetPageSizeSuffix(); + const auto page_size_suffix = GetPageSizeSuffix(); + const std::string release_specific_module_dir = uts.release + page_size_suffix; while ((entry = readdir(base_dir.get()))) { if (entry->d_type != DT_DIR) { continue; @@ -223,6 +239,10 @@ bool LoadKernelModules(BootMode boot_mode, bool want_console, bool want_parallel module_dirs.emplace_back(entry->d_name); break; } + // Ignore _16k/_64k module dirs on 4K kernels + if (GetPageSizeSuffix(entry->d_name) != page_size_suffix) { + continue; + } int dir_major = 0, dir_minor = 0; if (sscanf(entry->d_name, "%d.%d", &dir_major, &dir_minor) != 2 || dir_major != major || dir_minor != minor) {