blob: 4da1cf15b40f4632214694d597f2c3fc95b7b954 [file]
// Copyright 2023, The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Possible boot modes.
// TODO: b/312605899 - find full list of supported boot modes
// Looks like we need only compliant items from map: system/core/bootstat/bootstat.cpp
// kBootReasonMap
// It might be required to assemble this type in format: <reason>,<sub_reason>,<detil>,...
// Bootloaders must provide a kernel set or a blunt set reason, and are strongly encouraged to
// provide a subreason if it can be determined. For example, a power key long press that may or may
// not have ramoops backup would have the boot reason "reboot,longkey".
/* good reasons from kBootReasonMap
{"reboot,[empty]", kEmptyBootReason},
{"recovery", 3},
{"reboot", 4},
{"kernel_panic", 7},
{"watchdog", 40},
{"shutdown,", 45}, // Trailing comma is intentional. Do NOT use.
{"shutdown,userrequested", 46},
{"reboot,bootloader", 47},
{"reboot,cold", 48},
{"reboot,recovery", 49},
{"kernel_panic,sysrq", 52},
{"kernel_panic,null", 53},
{"kernel_panic,bug", 54},
{"bootloader", 55},
{"cold", 56},
{"hard", 57},
{"warm", 58},
{"reboot,kernel_power_off_charging__reboot_system", 59}, // Can not happen
{"shutdown,thermal", 61},
{"shutdown,battery", 62},
{"reboot,ota", 63},
{"reboot,factory_reset", 64},
{"reboot,", 65},
{"reboot,shell", 66},
{"reboot,adb", 67},
{"reboot,userrequested", 68},
{"shutdown,container", 69}, // Host OS asking Android Container to shutdown
{"cold,powerkey", 70},
{"warm,s3_wakeup", 71},
{"hard,hw_reset", 72},
{"shutdown,suspend", 73}, // Suspend to RAM
{"shutdown,hibernate", 74}, // Suspend to DISK
{"reboot,by_key", 84},
{"reboot,longkey", 85},
{"reboot,2sec", 86}, // Deprecate in two years, replaced with cold,rtc,2sec
{"shutdown,thermal,battery", 87},
{"reboot,its_just_so_hard", 88}, // produced by boot_reason_test
{"reboot,rescueparty", 90},
{"reboot,powerloss", 119},
{"reboot,undervoltage", 120},
{"cold,charger", 148},
{"cold,rtc", 149},
{"cold,rtc,2sec", 150}, // Mediatek
{"reboot,tool", 151}, // Mediatek
{"reboot,wdt", 152}, // Mediatek
{"reboot,unknown", 153}, // Mediatek
{"kernel_panic,audit", 154},
{"kernel_panic,atomic", 155},
{"kernel_panic,hung", 156},
{"kernel_panic,hung,rcu", 157},
{"kernel_panic,init", 158},
{"kernel_panic,oom", 159},
{"kernel_panic,stack", 160},
{"kernel_panic,sysrq,livelock,alarm", 161}, // llkd
{"kernel_panic,sysrq,livelock,driver", 162}, // llkd
{"kernel_panic,sysrq,livelock,zombie", 163}, // llkd
{"kernel_panic,modem", 164},
{"kernel_panic,adsp", 165},
{"kernel_panic,dsps", 166},
{"kernel_panic,wcnss", 167},
{"kernel_panic,_sde_encoder_phys_cmd_handle_ppdone_timeout", 168},
{"recovery,quiescent", 169},
{"reboot,quiescent", 170},
{"reboot,rtc", 171},
{"reboot,dm-verity_device_corrupted", 172},
{"reboot,dm-verity_enforcing", 173},
{"reboot,keys_clear", 174},
{"reboot,pmic_off_fault,.*", 175},
{"reboot,pmic_off_s3rst,.*", 176},
{"reboot,pmic_off_other,.*", 177},
{"reboot,userrequested,fastboot", 178},
{"reboot,userrequested,recovery", 179},
{"reboot,userrequested,recovery,ui", 180},
{"shutdown,userrequested,fastboot", 181},
{"shutdown,userrequested,recovery", 182},
{"reboot,unknown[0-9]*", 183},
{"reboot,longkey,.*", 184},
{"reboot,boringssl-self-check-failed", 185},
{"reboot,userspace_failed,shutdown_aborted", 186},
{"reboot,userspace_failed,watchdog_triggered", 187},
{"reboot,userspace_failed,watchdog_fork", 188},
{"reboot,userspace_failed,*", 189},
{"reboot,mount_userdata_failed", 190},
{"reboot,forcedsilent", 191},
{"reboot,forcednonsilent", 192},
{"reboot,thermal,tj", 193},
{"reboot,emergency", 194},
{"reboot,factory", 195},
{"reboot,fastboot", 196},
{"reboot,gsa,hard", 197},
{"reboot,gsa,soft", 198},
{"reboot,master_dc,fault_n", 199},
{"reboot,master_dc,reset", 200},
{"reboot,ocp", 201},
{"reboot,pin", 202},
{"reboot,rom_recovery", 203},
{"reboot,uvlo", 204},
{"reboot,uvlo,pmic,if", 205},
{"reboot,uvlo,pmic,main", 206},
{"reboot,uvlo,pmic,sub", 207},
{"reboot,warm", 208},
{"watchdog,aoc", 209},
{"watchdog,apc", 210},
{"watchdog,apc,bl,debug,early", 211},
{"watchdog,apc,bl,early", 212},
{"watchdog,apc,early", 213},
{"watchdog,apm", 214},
{"watchdog,gsa,hard", 215},
{"watchdog,gsa,soft", 216},
{"watchdog,pmucal", 217},
{"reboot,early,bl", 218},
{"watchdog,apc,gsa,crashed", 219},
{"watchdog,apc,bl31,crashed", 220},
{"watchdog,apc,pbl,crashed", 221},
{"reboot,memory_protect,hyp", 222},
{"reboot,tsd,pmic,main", 223},
{"reboot,tsd,pmic,sub", 224},
{"reboot,ocp,pmic,main", 225},
{"reboot,ocp,pmic,sub", 226},
{"reboot,sys_ldo_ok,pmic,main", 227},
{"reboot,sys_ldo_ok,pmic,sub", 228},
{"reboot,smpl_timeout,pmic,main", 229},
{"reboot,ota,.*", 230},
{"reboot,periodic,.*", 231},
*/
/// Boot mode
///
/// This is subset of compliant tems from map: system/core/bootstat/bootstat.cpp kBootReasonMap
// Underlying format is <reason>,<sub_reason>,<detil>,...
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum BootMode {
/// Normal system start
Normal,
/// Recovery mode
Recovery,
/// Request to boot into bootloader mode staying in CMD-line or fastboot mode.
Bootloader,
// TODO: b/312605899 - need full list of supported modes
// Quiescent,
}