1 #pragma once 2 3 /* NOTE: IIRC, wak@ is working on exposing some of this in stdplus, so we can 4 * transition when that's ready. 5 * 6 * Copied some from gpioplus to enable unit-testing of lpc nuvoton and later 7 * other pieces. 8 */ 9 10 #include <poll.h> 11 #include <sys/mman.h> 12 13 #include <cinttypes> 14 #include <cstddef> 15 16 namespace internal 17 { 18 19 /** 20 * @class Sys 21 * @brief Overridable direct syscall interface 22 */ 23 class Sys 24 { 25 public: 26 virtual ~Sys() = default; 27 28 virtual int open(const char* pathname, int flags) const = 0; 29 virtual int close(int fd) const = 0; 30 virtual void* mmap(void* addr, std::size_t length, int prot, int flags, 31 int fd, off_t offset) const = 0; 32 virtual int munmap(void* addr, std::size_t length) const = 0; 33 virtual int getpagesize() const = 0; 34 virtual int ioctl(int fd, unsigned long request, void* param) const = 0; 35 virtual int poll(struct pollfd* fds, nfds_t nfds, int timeout) const = 0; 36 }; 37 38 /** 39 * @class SysImpl 40 * @brief syscall concrete implementation 41 * @details Passes through all calls to the normal linux syscalls 42 */ 43 class SysImpl : public Sys 44 { 45 public: 46 int open(const char* pathname, int flags) const override; 47 int close(int fd) const override; 48 void* mmap(void* addr, std::size_t length, int prot, int flags, int fd, 49 off_t offset) const override; 50 int munmap(void* addr, std::size_t length) const override; 51 int getpagesize() const override; 52 int ioctl(int fd, unsigned long request, void* param) const override; 53 int poll(struct pollfd* fds, nfds_t nfds, int timeout) const override; 54 }; 55 56 /** @brief Default instantiation of sys */ 57 extern SysImpl sys_impl; 58 59 } // namespace internal 60