buffer: Implement "updateReadPtr"

This is a helper function for reading the circular buffer

Tested: Unit tested

Signed-off-by: Brandon Kim <brandonkim@google.com>
Change-Id: I1c34a40bd279ee601de33669aabfec27a959ec44
diff --git a/src/buffer.cpp b/src/buffer.cpp
index 524984a..c07bba6 100644
--- a/src/buffer.cpp
+++ b/src/buffer.cpp
@@ -9,6 +9,7 @@
 
 #include <algorithm>
 #include <array>
+#include <cstddef>
 #include <cstdint>
 #include <memory>
 #include <span>
@@ -85,4 +86,27 @@
     return cachedBufferHeader;
 }
 
+void BufferImpl::updateReadPtr(const uint32_t newReadPtr)
+{
+    constexpr uint8_t bmcReadPtrOffset =
+        offsetof(struct CircularBufferHeader, bmcReadPtr);
+
+    little_uint16_t truncatedReadPtr =
+        boost::endian::native_to_little(newReadPtr & 0xffff);
+    uint8_t* truncatedReadPtrPtr =
+        reinterpret_cast<uint8_t*>(&truncatedReadPtr);
+
+    size_t writtenSize = dataInterface->write(
+        bmcReadPtrOffset, std::span<const uint8_t>{
+                              truncatedReadPtrPtr,
+                              truncatedReadPtrPtr + sizeof(little_uint16_t)});
+    if (writtenSize != sizeof(little_uint16_t))
+    {
+        throw std::runtime_error(fmt::format(
+            "[updateReadPtr] Wrote '{}' bytes, instead of expected '{}'",
+            writtenSize, sizeof(little_uint16_t)));
+    }
+    cachedBufferHeader.bmcReadPtr = truncatedReadPtr;
+}
+
 } // namespace bios_bmc_smm_error_logger