blob: a0491eb52b1fdb666b640ec6ac57bb763af6c3d7 [file] [log] [blame]
Brandon Kimfcbc3db2022-06-06 21:26:18 -07001#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
13namespace bios_bmc_smm_error_logger
14{
15
16BufferImpl::BufferImpl(std::unique_ptr<DataInterface> dataInterface) :
17 dataInterface(std::move(dataInterface)){};
18
19void 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