diff --git a/src/ipmiblob/internal/sys.cpp b/src/ipmiblob/internal/sys.cpp
new file mode 100644
index 0000000..46c6642
--- /dev/null
+++ b/src/ipmiblob/internal/sys.cpp
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "sys.hpp"
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+namespace internal
+{
+
+int SysImpl::open(const char* pathname, int flags) const
+{
+    return ::open(pathname, flags);
+}
+
+int SysImpl::read(int fd, void* buf, std::size_t count) const
+{
+    return static_cast<int>(::read(fd, buf, count));
+}
+
+int SysImpl::close(int fd) const
+{
+    return ::close(fd);
+}
+
+void* SysImpl::mmap(void* addr, std::size_t length, int prot, int flags, int fd,
+                    off_t offset) const
+{
+    return ::mmap(addr, length, prot, flags, fd, offset);
+}
+
+int SysImpl::munmap(void* addr, std::size_t length) const
+{
+    return ::munmap(addr, length);
+}
+
+int SysImpl::getpagesize() const
+{
+    return ::getpagesize();
+}
+
+int SysImpl::ioctl(int fd, unsigned long request, void* param) const
+{
+    return ::ioctl(fd, request, param);
+}
+
+int SysImpl::poll(struct pollfd* fds, nfds_t nfds, int timeout) const
+{
+    return ::poll(fds, nfds, timeout);
+}
+
+SysImpl sys_impl;
+
+} // namespace internal
diff --git a/src/ipmiblob/internal/sys.hpp b/src/ipmiblob/internal/sys.hpp
new file mode 100644
index 0000000..2975b8c
--- /dev/null
+++ b/src/ipmiblob/internal/sys.hpp
@@ -0,0 +1,61 @@
+#pragma once
+
+/* NOTE: IIRC, wak@ is working on exposing some of this in stdplus, so we can
+ * transition when that's ready.
+ *
+ * Copied some from gpioplus to enable unit-testing of lpc nuvoton and later
+ * other pieces.
+ */
+
+#include <poll.h>
+#include <sys/mman.h>
+
+#include <cinttypes>
+#include <cstddef>
+
+namespace internal
+{
+
+/**
+ * @class Sys
+ * @brief Overridable direct syscall interface
+ */
+class Sys
+{
+  public:
+    virtual ~Sys() = default;
+
+    virtual int open(const char* pathname, int flags) const = 0;
+    virtual int read(int fd, void* buf, std::size_t count) const = 0;
+    virtual int close(int fd) const = 0;
+    virtual void* mmap(void* addr, std::size_t length, int prot, int flags,
+                       int fd, off_t offset) const = 0;
+    virtual int munmap(void* addr, std::size_t length) const = 0;
+    virtual int getpagesize() const = 0;
+    virtual int ioctl(int fd, unsigned long request, void* param) const = 0;
+    virtual int poll(struct pollfd* fds, nfds_t nfds, int timeout) const = 0;
+};
+
+/**
+ * @class SysImpl
+ * @brief syscall concrete implementation
+ * @details Passes through all calls to the normal linux syscalls
+ */
+class SysImpl : public Sys
+{
+  public:
+    int open(const char* pathname, int flags) const override;
+    int read(int fd, void* buf, std::size_t count) const override;
+    int close(int fd) const override;
+    void* mmap(void* addr, std::size_t length, int prot, int flags, int fd,
+               off_t offset) const override;
+    int munmap(void* addr, std::size_t length) const override;
+    int getpagesize() const override;
+    int ioctl(int fd, unsigned long request, void* param) const override;
+    int poll(struct pollfd* fds, nfds_t nfds, int timeout) const override;
+};
+
+/** @brief Default instantiation of sys */
+extern SysImpl sys_impl;
+
+} // namespace internal
