blob: 054df43f920831695f4032b3a63d21f22d054769 [file] [log] [blame]
Brandon Kim1a3dc602022-06-17 11:34:33 -07001#include "config.h"
2
3#include "buffer.hpp"
4#include "pci_handler.hpp"
5#include "rde/external_storer_file.hpp"
6#include "rde/external_storer_interface.hpp"
7#include "rde/rde_handler.hpp"
8
Brandon Kim554fad02022-05-15 15:41:05 -07009#include <boost/asio.hpp>
Brandon Kim1a3dc602022-06-17 11:34:33 -070010#include <boost/endian/conversion.hpp>
kasunatha3b64fb2022-06-15 18:47:18 -070011#include <sdbusplus/asio/object_server.hpp>
Brandon Kim1a3dc602022-06-17 11:34:33 -070012#include <stdplus/fd/create.hpp>
13#include <stdplus/fd/impl.hpp>
14#include <stdplus/fd/managed.hpp>
Patrick Williams5de90612024-02-13 21:31:53 -060015#include <stdplus/print.hpp>
Brandon Kim554fad02022-05-15 15:41:05 -070016
17#include <chrono>
Brandon Kim1a3dc602022-06-17 11:34:33 -070018#include <filesystem>
Patrick Williams5de90612024-02-13 21:31:53 -060019#include <format>
Brandon Kim1a3dc602022-06-17 11:34:33 -070020#include <fstream>
Brandon Kim554fad02022-05-15 15:41:05 -070021#include <functional>
Brandon Kim1a3dc602022-06-17 11:34:33 -070022#include <memory>
Brandon Kim554fad02022-05-15 15:41:05 -070023
24namespace
25{
Brandon Kim1a3dc602022-06-17 11:34:33 -070026constexpr std::chrono::milliseconds readIntervalinMs(READ_INTERVAL_MS);
27constexpr std::size_t memoryRegionSize = MEMORY_REGION_SIZE;
28constexpr std::size_t memoryRegionOffset = MEMORY_REGION_OFFSET;
29constexpr uint32_t bmcInterfaceVersion = BMC_INTERFACE_VERSION;
30constexpr uint16_t queueSize = QUEUE_REGION_SIZE;
31constexpr uint16_t ueRegionSize = UE_REGION_SIZE;
32static constexpr std::array<uint32_t, 4> magicNumber = {
33 MAGIC_NUMBER_BYTE1, MAGIC_NUMBER_BYTE2, MAGIC_NUMBER_BYTE3,
34 MAGIC_NUMBER_BYTE4};
Brandon Kim554fad02022-05-15 15:41:05 -070035} // namespace
36
Brandon Kim1a3dc602022-06-17 11:34:33 -070037using namespace bios_bmc_smm_error_logger;
38
39void readLoop(boost::asio::steady_timer* t,
40 const std::shared_ptr<BufferInterface>& bufferInterface,
41 const std::shared_ptr<rde::RdeCommandHandler>& rdeCommandHandler,
42 const boost::system::error_code& error)
Brandon Kim554fad02022-05-15 15:41:05 -070043{
Brandon Kim1a3dc602022-06-17 11:34:33 -070044 if (error)
45 {
Patrick Williams5de90612024-02-13 21:31:53 -060046 stdplus::print(stderr, "Async wait failed {}\n", error.message());
Brandon Kim1a3dc602022-06-17 11:34:33 -070047 return;
48 }
49 std::vector<EntryPair> entryPairs = bufferInterface->readErrorLogs();
50 for (const auto& [entryHeader, entry] : entryPairs)
51 {
Brandon Kim1a3dc602022-06-17 11:34:33 -070052 rde::RdeDecodeStatus rdeDecodeStatus =
53 rdeCommandHandler->decodeRdeCommand(
54 entry,
55 static_cast<rde::RdeCommandType>(entryHeader.rdeCommandType));
56 if (rdeDecodeStatus == rde::RdeDecodeStatus::RdeStopFlagReceived)
57 {
58 auto bufferHeader = bufferInterface->getCachedBufferHeader();
59 auto newbmcFlags =
60 boost::endian::little_to_native(bufferHeader.bmcFlags) |
61 static_cast<uint32_t>(BmcFlags::ready);
62 bufferInterface->updateBmcFlags(newbmcFlags);
63 }
64 }
65
66 t->expires_from_now(readIntervalinMs);
67 t->async_wait(
68 std::bind_front(readLoop, t, bufferInterface, rdeCommandHandler));
Brandon Kim554fad02022-05-15 15:41:05 -070069}
70
71int main()
72{
73 boost::asio::io_context io;
Brandon Kim1a3dc602022-06-17 11:34:33 -070074 boost::asio::steady_timer t(io, readIntervalinMs);
Brandon Kim554fad02022-05-15 15:41:05 -070075
Brandon Kim1a3dc602022-06-17 11:34:33 -070076 // bufferHandler initialization
77 std::unique_ptr<stdplus::ManagedFd> managedFd =
78 std::make_unique<stdplus::ManagedFd>(stdplus::fd::open(
79 "/dev/mem",
80 stdplus::fd::OpenFlags(stdplus::fd::OpenAccess::ReadWrite)
81 .set(stdplus::fd::OpenFlag::Sync)));
82 std::unique_ptr<DataInterface> pciDataHandler =
83 std::make_unique<PciDataHandler>(memoryRegionOffset, memoryRegionSize,
84 std::move(managedFd));
85 std::shared_ptr<BufferInterface> bufferHandler =
86 std::make_shared<BufferImpl>(std::move(pciDataHandler));
Brandon Kim554fad02022-05-15 15:41:05 -070087
Brandon Kim1a3dc602022-06-17 11:34:33 -070088 // rdeCommandHandler initialization
kasunatha3b64fb2022-06-15 18:47:18 -070089 std::shared_ptr<sdbusplus::asio::connection> conn =
90 std::make_shared<sdbusplus::asio::connection>(io);
91 conn->request_name("xyz.openbmc_project.bios_bmc_smm_error_logger");
kasunatha3b64fb2022-06-15 18:47:18 -070092
Brandon Kim1a3dc602022-06-17 11:34:33 -070093 std::unique_ptr<rde::FileHandlerInterface> fileIface =
94 std::make_unique<rde::ExternalStorerFileWriter>();
95 std::unique_ptr<rde::ExternalStorerInterface> exFileIface =
96 std::make_unique<rde::ExternalStorerFileInterface>(
kasunath3d0cd552022-08-25 20:22:58 -070097 conn, "/run/bmcweb", std::move(fileIface));
Brandon Kim1a3dc602022-06-17 11:34:33 -070098 std::shared_ptr<rde::RdeCommandHandler> rdeCommandHandler =
99 std::make_unique<rde::RdeCommandHandler>(std::move(exFileIface));
100
101 bufferHandler->initialize(bmcInterfaceVersion, queueSize, ueRegionSize,
102 magicNumber);
103
104 t.async_wait(std::bind_front(readLoop, &t, std::move(bufferHandler),
105 std::move(rdeCommandHandler)));
Brandon Kim554fad02022-05-15 15:41:05 -0700106 io.run();
107
108 return 0;
109}