1 #include "buffer.hpp"
2 
3 #include "pci_handler.hpp"
4 
5 #include <fmt/format.h>
6 
7 #include <array>
8 #include <cstdint>
9 #include <memory>
10 #include <span>
11 #include <vector>
12 
13 namespace bios_bmc_smm_error_logger
14 {
15 
16 BufferImpl::BufferImpl(std::unique_ptr<DataInterface> dataInterface) :
17     dataInterface(std::move(dataInterface)){};
18 
19 void BufferImpl::initialize(uint32_t bmcInterfaceVersion, uint16_t queueSize,
20                             uint16_t ueRegionSize,
21                             const std::array<uint32_t, 4>& magicNumber)
22 {
23     // Initialize the whole buffer with 0x00
24     const size_t memoryRegionSize = dataInterface->getMemoryRegionSize();
25     const std::vector<uint8_t> emptyVector(memoryRegionSize, 0);
26     size_t byteWritten = dataInterface->write(0, emptyVector);
27     if (byteWritten != memoryRegionSize)
28     {
29         throw std::runtime_error(
30             fmt::format("Buffer initialization only erased '{}'", byteWritten));
31     }
32 
33     // Create an initial buffer header and write to it
34     struct CircularBufferHeader initializationHeader = {};
35     initializationHeader.bmcInterfaceVersion = bmcInterfaceVersion;
36     initializationHeader.queueSize = queueSize;
37     initializationHeader.ueRegionSize = ueRegionSize;
38     initializationHeader.magicNumber = magicNumber;
39 
40     uint8_t* initializationHeaderPtr =
41         reinterpret_cast<uint8_t*>(&initializationHeader);
42     size_t initializationHeaderSize = sizeof(initializationHeader);
43     byteWritten = dataInterface->write(
44         0, std::span<const uint8_t>(initializationHeaderPtr,
45                                     initializationHeaderPtr +
46                                         initializationHeaderSize));
47     if (byteWritten != initializationHeaderSize)
48     {
49         throw std::runtime_error(fmt::format(
50             "Buffer initialization buffer header write only wrote '{}'",
51             byteWritten));
52     }
53 }
54 
55 } // namespace bios_bmc_smm_error_logger
56