blob: d6dd9a17d23f7a60cc6a2ee5062adf8ac77f0ed5 [file] [log] [blame]
/*
// Copyright (c) 2021 Intel Corporation
//
// 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.
*/
#pragma once
#include <error_monitors/err_pin_timeout_monitor.hpp>
#include <host_error_monitor.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <iostream>
namespace host_error_monitor::err2_monitor
{
static constexpr bool debug = false;
class Err2Monitor :
public host_error_monitor::err_pin_timeout_monitor::ErrPinTimeoutMonitor
{
const static constexpr uint8_t beepCPUErr2 = 5;
void assertHandler() override
{
host_error_monitor::err_pin_timeout_monitor::ErrPinTimeoutMonitor::
assertHandler();
beep(conn, beepCPUErr2);
conn->async_method_call(
[this](boost::system::error_code ec,
const std::variant<bool>& property) {
// Default to no reset after Crashdump
RecoveryType recovery = RecoveryType::noRecovery;
if (!ec)
{
const bool* resetPtr = std::get_if<bool>(&property);
if (resetPtr == nullptr)
{
std::cerr << "Unable to read reset on ERR2 value\n";
}
else if (*resetPtr)
{
recovery = RecoveryType::warmReset;
}
}
startCrashdumpAndRecovery(conn, recovery, "ERR2 Timeout");
},
"xyz.openbmc_project.Settings",
"/xyz/openbmc_project/control/processor_error_config",
"org.freedesktop.DBus.Properties", "Get",
"xyz.openbmc_project.Control.Processor.ErrConfig", "ResetOnERR2");
}
public:
Err2Monitor(boost::asio::io_context& io,
std::shared_ptr<sdbusplus::asio::connection> conn,
const std::string& signalName) :
host_error_monitor::err_pin_timeout_monitor::ErrPinTimeoutMonitor(
io, conn, signalName, 2)
{}
};
} // namespace host_error_monitor::err2_monitor