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