diff --git a/Makefile.am b/Makefile.am
index 100ba92..af68e35 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,7 +9,8 @@
 	pci_handler.cpp \
 	file_handler.cpp \
 	lpc_aspeed.cpp \
-	lpc_nuvoton.cpp
+	lpc_nuvoton.cpp \
+	internal/sys.cpp
 libfirmwareblob_la_LDFLAGS = \
 	$(SDBUSPLUS_LIBS) \
 	$(PHOSPHOR_LOGGING_LIBS) \
diff --git a/internal/sys.cpp b/internal/sys.cpp
new file mode 100644
index 0000000..b61dfea
--- /dev/null
+++ b/internal/sys.cpp
@@ -0,0 +1,60 @@
+/*
+ * 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/mman.h>
+#include <unistd.h>
+
+namespace blobs
+{
+namespace flash
+{
+namespace internal
+{
+
+int SysImpl::open(const char* pathname, int flags) const
+{
+    return ::open(pathname, flags);
+}
+
+int SysImpl::close(int fd) const
+{
+    return ::close(fd);
+}
+
+void* SysImpl::mmap(void* addr, 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, size_t length) const
+{
+    return ::munmap(addr, length);
+}
+
+int SysImpl::getpagesize() const
+{
+    return ::getpagesize();
+}
+
+SysImpl sys_impl;
+
+} // namespace internal
+} // namespace flash
+} // namespace blobs
diff --git a/internal/sys.hpp b/internal/sys.hpp
new file mode 100644
index 0000000..fb824ef
--- /dev/null
+++ b/internal/sys.hpp
@@ -0,0 +1,60 @@
+#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 <sys/mman.h>
+
+#include <cinttypes>
+#include <cstddef>
+
+namespace blobs
+{
+namespace flash
+{
+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 close(int fd) const = 0;
+    virtual void* mmap(void* addr, size_t length, int prot, int flags, int fd,
+                       off_t offset) const = 0;
+    virtual int munmap(void* addr, size_t length) const = 0;
+    virtual int getpagesize() 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 close(int fd) const override;
+    void* mmap(void* addr, size_t length, int prot, int flags, int fd,
+               off_t offset) const override;
+    int munmap(void* addr, size_t length) const override;
+    int getpagesize() const override;
+};
+
+/** @brief Default instantiation of sys */
+extern SysImpl sys_impl;
+
+} // namespace internal
+} // namespace flash
+} // namespace blobs
diff --git a/lpc_nuvoton.cpp b/lpc_nuvoton.cpp
index 76edb97..416980e 100644
--- a/lpc_nuvoton.cpp
+++ b/lpc_nuvoton.cpp
@@ -20,7 +20,6 @@
 
 #include <fcntl.h>
 #include <sys/mman.h>
-#include <unistd.h>
 
 #include <cinttypes>
 #include <cstdint>
@@ -98,10 +97,10 @@
      * Until then program the register through /dev/mem.
      */
     int fd;
-    if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
+    if ((fd = sys->open("/dev/mem", O_RDWR | O_SYNC)) == -1)
     {
         std::fprintf(stderr, "Failed to open /dev/mem\n");
-        close(fd);
+        sys->close(fd);
         return std::make_pair(0, 0);
     }
 
@@ -111,9 +110,11 @@
     const uint8_t bmcWindowSizeValue = 0xc;     // 4k
     const uint16_t bmcWindowBaseValue = 0x8000; // BMC phyAddr from 0xc0008000
 
+    int pageSize = sys->getpagesize();
+
     auto mapBasePtr = reinterpret_cast<uint8_t*>(
-        mmap(nullptr, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd,
-             bmcMapConfigBaseAddr));
+        sys->mmap(nullptr, pageSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
+                  bmcMapConfigBaseAddr));
 
     uint8_t* bmcWindowSize = mapBasePtr + bmcMapConfigWindowSizeOffset;
     uint16_t* bmcWindowBase =
@@ -122,8 +123,8 @@
     *bmcWindowSize = bmcWindowSizeValue;
     *bmcWindowBase = bmcWindowBaseValue;
 
-    munmap(mapBasePtr, getpagesize());
-    close(fd);
+    sys->munmap(mapBasePtr, pageSize);
+    sys->close(fd);
 
     return std::make_pair(windowOffset, windowSize);
 }
diff --git a/lpc_nuvoton.hpp b/lpc_nuvoton.hpp
index a18c15d..0bb25af 100644
--- a/lpc_nuvoton.hpp
+++ b/lpc_nuvoton.hpp
@@ -1,5 +1,6 @@
 #pragma once
 
+#include "internal/sys.hpp"
 #include "lpc_interface.hpp"
 
 #include <memory>
@@ -12,11 +13,21 @@
   public:
     static std::unique_ptr<LpcMapperInterface> createNuvotonMapper();
 
-    /* TODO: Needs reserved memory region's physical address and size. */
-    LpcMapperNuvoton() = default;
+    /**
+     * Create an LpcMapper for Nuvoton.
+     *
+     * @param[in] a sys call interface pointer.
+     * @todo Needs reserved memory region's physical address and size.
+     */
+    explicit LpcMapperNuvoton(
+        const flash::internal::Sys* sys = &flash::internal::sys_impl) :
+        sys(sys){};
 
     std::pair<std::uint32_t, std::uint32_t>
         mapWindow(std::uint32_t address, std::uint32_t length) override;
+
+  private:
+    const flash::internal::Sys* sys;
 };
 
 } // namespace blobs
diff --git a/test/internal_sys_mock.hpp b/test/internal_sys_mock.hpp
new file mode 100644
index 0000000..42abe2f
--- /dev/null
+++ b/test/internal_sys_mock.hpp
@@ -0,0 +1,30 @@
+#pragma once
+
+#include "internal/sys.hpp"
+
+#include <unistd.h>
+
+#include <gmock/gmock.h>
+
+namespace blobs
+{
+namespace flash
+{
+namespace internal
+{
+
+class InternalSysMock : public Sys
+{
+  public:
+    virtual ~InternalSysMock() = default;
+
+    MOCK_CONST_METHOD2(open, int(const char*, int));
+    MOCK_CONST_METHOD1(close, int(int));
+    MOCK_CONST_METHOD6(mmap, void*(void*, size_t, int, int, int, off_t));
+    MOCK_CONST_METHOD2(munmap, int(void*, size));
+    MOCK_CONST_METHOD0(getpagesize, int());
+};
+
+} // namespace internal
+} // namespace flash
+} // namespace blobs
