blob: 368b4030cf9298950adeef98c643fb175176d82d [file] [log] [blame]
Brandon Kim55dcada2022-03-09 02:18:01 -08001#include "pci_handler.hpp"
2
3#include <fcntl.h>
Brandon Kim55dcada2022-03-09 02:18:01 -08004
5#include <stdplus/fd/managed.hpp>
6#include <stdplus/fd/mmap.hpp>
Patrick Williams5de90612024-02-13 21:31:53 -06007#include <stdplus/print.hpp>
Brandon Kim55dcada2022-03-09 02:18:01 -08008
9#include <cstdint>
10#include <cstring>
Patrick Williams5de90612024-02-13 21:31:53 -060011#include <format>
Brandon Kim55dcada2022-03-09 02:18:01 -080012#include <memory>
13#include <span>
14#include <vector>
15
16namespace bios_bmc_smm_error_logger
17{
18
19PciDataHandler::PciDataHandler(uint32_t regionAddress, size_t regionSize,
20 std::unique_ptr<stdplus::fd::Fd> fd) :
Edward Lee3cbb6ef2023-03-15 17:08:40 +000021 regionSize(regionSize),
22 fd(std::move(fd)),
Brandon Kim55dcada2022-03-09 02:18:01 -080023 mmap(stdplus::fd::MMap(
24 *this->fd, regionSize, stdplus::fd::ProtFlags{PROT_READ | PROT_WRITE},
25 stdplus::fd::MMapFlags{stdplus::fd::MMapAccess::Shared}, regionAddress))
26{}
27
28std::vector<uint8_t> PciDataHandler::read(const uint32_t offset,
29 const uint32_t length)
30{
31 if (offset > regionSize || length == 0)
32 {
Patrick Williams5de90612024-02-13 21:31:53 -060033 stdplus::print(stderr,
34 "[read] Offset [{}] was bigger than regionSize [{}] "
35 "OR length [{}] was equal to 0\n",
36 offset, regionSize, length);
Brandon Kim55dcada2022-03-09 02:18:01 -080037 return {};
38 }
39
40 // Read up to regionSize in case the offset + length overflowed
Patrick Williamsb8125762023-05-10 07:51:26 -050041 uint32_t finalLength = (offset + length < regionSize) ? length
42 : regionSize - offset;
Brandon Kim55dcada2022-03-09 02:18:01 -080043 std::vector<uint8_t> results(finalLength);
44
45 std::memcpy(results.data(), mmap.get().data() + offset, finalLength);
46 return results;
47}
48
49uint32_t PciDataHandler::write(const uint32_t offset,
50 const std::span<const uint8_t> bytes)
51{
52 const size_t length = bytes.size();
53 if (offset > regionSize || length == 0)
54 {
Patrick Williams5de90612024-02-13 21:31:53 -060055 stdplus::print(stderr,
56 "[write] Offset [{}] was bigger than regionSize [{}] "
57 "OR length [{}] was equal to 0\n",
58 offset, regionSize, length);
Brandon Kim55dcada2022-03-09 02:18:01 -080059 return 0;
60 }
61
62 // Write up to regionSize in case the offset + length overflowed
Patrick Williamsb8125762023-05-10 07:51:26 -050063 uint16_t finalLength = (offset + length < regionSize) ? length
64 : regionSize - offset;
Brandon Kim55dcada2022-03-09 02:18:01 -080065 std::memcpy(mmap.get().data() + offset, bytes.data(), finalLength);
66 return finalLength;
67}
68
69uint32_t PciDataHandler::getMemoryRegionSize()
70{
71 return regionSize;
72}
73
74} // namespace bios_bmc_smm_error_logger