blob: 75ca874ae53133954d837b557f7922c89113c958 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/forensics/feedback/reboot_log/reboot_reason.h"
#include <fuchsia/feedback/cpp/fidl.h>
#include <lib/syslog/cpp/macros.h>
#include "src/developer/forensics/utils/cobalt/metrics.h"
namespace forensics {
namespace feedback {
std::string ToString(const RebootReason reason) {
switch (reason) {
case RebootReason::kNotParseable:
return "NOT PARSEABLE";
case RebootReason::kGenericGraceful:
return "GENERIC GRACEFUL";
case RebootReason::kCold:
return "COLD";
case RebootReason::kSpontaneous:
return "SPONTANEOUS";
case RebootReason::kKernelPanic:
return "KERNEL PANIC";
case RebootReason::kOOM:
return "OOM";
case RebootReason::kHardwareWatchdogTimeout:
return "HARDWARE WATCHDOG TIMEOUT";
case RebootReason::kSoftwareWatchdogTimeout:
return "SOFTWARE WATCHDOG TIMEOUT";
case RebootReason::kBrownout:
return "BROWNOUT";
case RebootReason::kRootJobTermination:
return "ROOT JOB TERMINATION";
case RebootReason::kUserRequest:
return "USER REQUEST";
case RebootReason::kSystemUpdate:
return "SYSTEM UPDATE";
case RebootReason::kRetrySystemUpdate:
return "RETRY SYSTEM UPDATE";
case RebootReason::kZbiSwap:
return "ZBI SWAP";
case RebootReason::kHighTemperature:
return "HIGH TEMPERATURE";
case RebootReason::kSessionFailure:
return "SESSION FAILURE";
case RebootReason::kSysmgrFailure:
return "SYSMGR FAILURE";
case RebootReason::kCriticalComponentFailure:
return "CRITICAL COMPONENT FAILURE";
case RebootReason::kFdr:
return "FACTORY DATA RESET";
}
}
bool IsCrash(const RebootReason reason) {
switch (reason) {
case RebootReason::kNotParseable:
case RebootReason::kSpontaneous:
case RebootReason::kKernelPanic:
case RebootReason::kOOM:
case RebootReason::kHardwareWatchdogTimeout:
case RebootReason::kSoftwareWatchdogTimeout:
case RebootReason::kBrownout:
case RebootReason::kRootJobTermination:
case RebootReason::kSessionFailure:
case RebootReason::kSysmgrFailure:
case RebootReason::kCriticalComponentFailure:
case RebootReason::kRetrySystemUpdate:
case RebootReason::kHighTemperature:
case RebootReason::kGenericGraceful:
return true;
case RebootReason::kUserRequest:
case RebootReason::kSystemUpdate:
case RebootReason::kZbiSwap:
case RebootReason::kCold:
case RebootReason::kFdr:
return false;
}
}
bool IsFatal(const RebootReason reason) {
switch (reason) {
case RebootReason::kNotParseable:
case RebootReason::kSpontaneous:
case RebootReason::kKernelPanic:
case RebootReason::kOOM:
case RebootReason::kHardwareWatchdogTimeout:
case RebootReason::kSoftwareWatchdogTimeout:
case RebootReason::kBrownout:
case RebootReason::kRootJobTermination:
case RebootReason::kSysmgrFailure:
case RebootReason::kCriticalComponentFailure:
case RebootReason::kRetrySystemUpdate:
case RebootReason::kHighTemperature:
case RebootReason::kGenericGraceful:
return true;
case RebootReason::kUserRequest:
case RebootReason::kSystemUpdate:
case RebootReason::kZbiSwap:
case RebootReason::kCold:
case RebootReason::kSessionFailure:
case RebootReason::kFdr:
return false;
}
}
std::optional<bool> OptionallyGraceful(const RebootReason reason) {
switch (reason) {
case RebootReason::kGenericGraceful:
case RebootReason::kUserRequest:
case RebootReason::kSystemUpdate:
case RebootReason::kRetrySystemUpdate:
case RebootReason::kZbiSwap:
case RebootReason::kHighTemperature:
case RebootReason::kSessionFailure:
case RebootReason::kSysmgrFailure:
case RebootReason::kCriticalComponentFailure:
case RebootReason::kFdr:
return true;
case RebootReason::kCold:
case RebootReason::kSpontaneous:
case RebootReason::kKernelPanic:
case RebootReason::kOOM:
case RebootReason::kHardwareWatchdogTimeout:
case RebootReason::kSoftwareWatchdogTimeout:
case RebootReason::kBrownout:
case RebootReason::kRootJobTermination:
return false;
case RebootReason::kNotParseable:
return std::nullopt;
}
}
cobalt::LastRebootReason ToCobaltLastRebootReason(RebootReason reason) {
switch (reason) {
case RebootReason::kNotParseable:
return cobalt::LastRebootReason::kUnknown;
case RebootReason::kGenericGraceful:
return cobalt::LastRebootReason::kGenericGraceful;
case RebootReason::kUserRequest:
return cobalt::LastRebootReason::kUserRequest;
case RebootReason::kSystemUpdate:
return cobalt::LastRebootReason::kSystemUpdate;
case RebootReason::kRetrySystemUpdate:
return cobalt::LastRebootReason::kRetrySystemUpdate;
case RebootReason::kZbiSwap:
return cobalt::LastRebootReason::kZbiSwap;
case RebootReason::kHighTemperature:
return cobalt::LastRebootReason::kHighTemperature;
case RebootReason::kSessionFailure:
return cobalt::LastRebootReason::kSessionFailure;
case RebootReason::kSysmgrFailure:
return cobalt::LastRebootReason::kSysmgrFailure;
case RebootReason::kCriticalComponentFailure:
return cobalt::LastRebootReason::kCriticalComponentFailure;
case RebootReason::kFdr:
return cobalt::LastRebootReason::kFactoryDataReset;
case RebootReason::kCold:
return cobalt::LastRebootReason::kCold;
case RebootReason::kSpontaneous:
return cobalt::LastRebootReason::kBriefPowerLoss;
case RebootReason::kKernelPanic:
return cobalt::LastRebootReason::kKernelPanic;
case RebootReason::kOOM:
return cobalt::LastRebootReason::kSystemOutOfMemory;
case RebootReason::kHardwareWatchdogTimeout:
return cobalt::LastRebootReason::kHardwareWatchdogTimeout;
case RebootReason::kSoftwareWatchdogTimeout:
return cobalt::LastRebootReason::kSoftwareWatchdogTimeout;
case RebootReason::kBrownout:
return cobalt::LastRebootReason::kBrownout;
case RebootReason::kRootJobTermination:
return cobalt::LastRebootReason::kRootJobTermination;
}
}
std::string ToCrashSignature(const RebootReason reason,
const std::optional<std::string>& critical_process) {
switch (reason) {
case RebootReason::kNotParseable:
return "fuchsia-reboot-log-not-parseable";
case RebootReason::kSpontaneous:
return "fuchsia-brief-power-loss";
case RebootReason::kKernelPanic:
return "fuchsia-kernel-panic";
case RebootReason::kOOM:
return "fuchsia-oom";
case RebootReason::kHardwareWatchdogTimeout:
return "fuchsia-hw-watchdog-timeout";
case RebootReason::kSoftwareWatchdogTimeout:
return "fuchsia-sw-watchdog-timeout";
case RebootReason::kBrownout:
return "fuchsia-brownout";
case RebootReason::kRootJobTermination:
return (!critical_process.has_value())
? "fuchsia-root-job-termination"
: std::string("fuchsia-reboot-").append(*critical_process).append("-terminated");
case RebootReason::kSessionFailure:
return "fuchsia-session-failure";
case RebootReason::kSysmgrFailure:
return "fuchsia-sysmgr-failure";
case RebootReason::kCriticalComponentFailure:
return "fuchsia-critical-component-failure";
case RebootReason::kRetrySystemUpdate:
return "fuchsia-retry-system-update";
case RebootReason::kGenericGraceful:
return "fuchsia-undetermined-userspace-reboot";
case RebootReason::kHighTemperature:
return "fuchsia-reboot-high-temperature";
case RebootReason::kUserRequest:
case RebootReason::kSystemUpdate:
case RebootReason::kZbiSwap:
case RebootReason::kCold:
case RebootReason::kFdr:
FX_LOGS(FATAL) << "Not expecting a crash for reboot reason: " << ToString(reason);
return "FATAL ERROR";
}
}
std::string ToCrashProgramName(const RebootReason reason) {
switch (reason) {
case RebootReason::kNotParseable:
return "reboot-log";
case RebootReason::kKernelPanic:
return "kernel";
case RebootReason::kBrownout:
case RebootReason::kHardwareWatchdogTimeout:
case RebootReason::kSpontaneous:
return "device";
case RebootReason::kOOM:
case RebootReason::kSoftwareWatchdogTimeout:
case RebootReason::kRootJobTermination:
case RebootReason::kSessionFailure:
case RebootReason::kSysmgrFailure:
case RebootReason::kCriticalComponentFailure:
case RebootReason::kRetrySystemUpdate:
case RebootReason::kHighTemperature:
case RebootReason::kGenericGraceful:
return "system";
case RebootReason::kUserRequest:
case RebootReason::kSystemUpdate:
case RebootReason::kZbiSwap:
case RebootReason::kCold:
case RebootReason::kFdr:
FX_LOGS(FATAL) << "Not expecting a program name request for reboot reason: "
<< ToString(reason);
return "FATAL ERROR";
}
}
std::optional<fuchsia::feedback::RebootReason> ToFidlRebootReason(const RebootReason reason) {
switch (reason) {
case RebootReason::kGenericGraceful:
return std::nullopt;
case RebootReason::kUserRequest:
return fuchsia::feedback::RebootReason::USER_REQUEST;
case RebootReason::kSystemUpdate:
return fuchsia::feedback::RebootReason::SYSTEM_UPDATE;
case RebootReason::kRetrySystemUpdate:
return fuchsia::feedback::RebootReason::RETRY_SYSTEM_UPDATE;
case RebootReason::kZbiSwap:
return fuchsia::feedback::RebootReason::ZBI_SWAP;
case RebootReason::kHighTemperature:
return fuchsia::feedback::RebootReason::HIGH_TEMPERATURE;
case RebootReason::kSessionFailure:
return fuchsia::feedback::RebootReason::SESSION_FAILURE;
case RebootReason::kSysmgrFailure:
return fuchsia::feedback::RebootReason::SYSMGR_FAILURE;
case RebootReason::kCriticalComponentFailure:
return fuchsia::feedback::RebootReason::CRITICAL_COMPONENT_FAILURE;
case RebootReason::kFdr:
return fuchsia::feedback::RebootReason::FACTORY_DATA_RESET;
case RebootReason::kCold:
return fuchsia::feedback::RebootReason::COLD;
case RebootReason::kSpontaneous:
return fuchsia::feedback::RebootReason::BRIEF_POWER_LOSS;
case RebootReason::kKernelPanic:
return fuchsia::feedback::RebootReason::KERNEL_PANIC;
case RebootReason::kOOM:
return fuchsia::feedback::RebootReason::SYSTEM_OUT_OF_MEMORY;
case RebootReason::kHardwareWatchdogTimeout:
return fuchsia::feedback::RebootReason::HARDWARE_WATCHDOG_TIMEOUT;
case RebootReason::kSoftwareWatchdogTimeout:
return fuchsia::feedback::RebootReason::SOFTWARE_WATCHDOG_TIMEOUT;
case RebootReason::kBrownout:
return fuchsia::feedback::RebootReason::BROWNOUT;
case RebootReason::kRootJobTermination:
return fuchsia::feedback::RebootReason::ROOT_JOB_TERMINATION;
case RebootReason::kNotParseable:
return std::nullopt;
}
}
} // namespace feedback
} // namespace forensics