Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c5f8264 authored by Will McVicker's avatar Will McVicker
Browse files

first_stage_init: add support to skip module load failures

Extend androidboot.first_stage_console cmdline property to enable
skipping module load failures without stopping at a serial console. This
is useful for GKI development.

Set androidboot.first_stage_console=2 for this behavior.

Bug: 155296582
Test: verify behavior for values 0, 1, and 2
Change-Id: I068c631a22c848e45a421b297b1acae1b3deb3c1
parent b7da2366
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#include "first_stage_console.h"

#include <stdio.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <sys/types.h>
@@ -87,8 +88,18 @@ void StartConsole() {
    _exit(127);
}

bool FirstStageConsole(const std::string& cmdline) {
    return cmdline.find("androidboot.first_stage_console=1") != std::string::npos;
int FirstStageConsole(const std::string& cmdline) {
    auto pos = cmdline.find("androidboot.first_stage_console=");
    if (pos != std::string::npos) {
        int val = 0;
        if (sscanf(cmdline.c_str() + pos, "androidboot.first_stage_console=%d", &val) != 1) {
            return FirstStageConsoleParam::DISABLED;
        }
        if (val <= FirstStageConsoleParam::MAX_PARAM_VALUE && val >= 0) {
            return val;
        }
    }
    return FirstStageConsoleParam::DISABLED;
}

}  // namespace init
+8 −1
Original line number Diff line number Diff line
@@ -21,8 +21,15 @@
namespace android {
namespace init {

enum FirstStageConsoleParam {
    DISABLED = 0,
    CONSOLE_ON_FAILURE = 1,
    IGNORE_FAILURE = 2,
    MAX_PARAM_VALUE = IGNORE_FAILURE,
};

void StartConsole();
bool FirstStageConsole(const std::string& cmdline);
int FirstStageConsole(const std::string& cmdline);

}  // namespace init
}  // namespace android
+3 −3
Original line number Diff line number Diff line
@@ -200,16 +200,16 @@ int FirstStageMain(int argc, char** argv) {
    }

    Modprobe m({"/lib/modules"}, module_load_file);
    auto want_console = ALLOW_FIRST_STAGE_CONSOLE && FirstStageConsole(cmdline);
    auto want_console = ALLOW_FIRST_STAGE_CONSOLE ? FirstStageConsole(cmdline) : 0;
    if (!m.LoadListedModules(!want_console)) {
        if (want_console) {
        if (want_console != FirstStageConsoleParam::DISABLED) {
            LOG(ERROR) << "Failed to load kernel modules, starting console";
        } else {
            LOG(FATAL) << "Failed to load kernel modules";
        }
    }

    if (want_console) {
    if (want_console == FirstStageConsoleParam::CONSOLE_ON_FAILURE) {
        StartConsole();
    }