diff options
author | Nicholas Chin <nic.c3.14@gmail.com> | 2024-05-01 20:11:14 -0600 |
---|---|---|
committer | Nicholas Chin <nic.c3.14@gmail.com> | 2024-05-01 20:11:14 -0600 |
commit | 5e2e761142085f60c85f19895d985a58a6f5ee0f (patch) | |
tree | d6d24c97964d480eccd6f3bd9cfb9c12038b2aa6 | |
parent | 61dbaf9463034fb893ca8f5131681bdd54ec5472 (diff) |
dell_flash_unlock: Add support for FreeBSD
Signed-off-by: Nicholas Chin <nic.c3.14@gmail.com>
-rw-r--r-- | util/dell-flash-unlock/accessors.c | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/util/dell-flash-unlock/accessors.c b/util/dell-flash-unlock/accessors.c index a8541e28..0a5df760 100644 --- a/util/dell-flash-unlock/accessors.c +++ b/util/dell-flash-unlock/accessors.c @@ -18,6 +18,13 @@ #endif /* __i386__ */ #endif /* __OpenBSD__ */ +#if defined(__FreeBSD__) +#include <fcntl.h> +#include <sys/types.h> +#include <machine/cpufunc.h> +#include <unistd.h> +#endif /* __FreeBSD__ */ + #include <errno.h> #include "accessors.h" @@ -42,7 +49,7 @@ sys_outb(unsigned int port, uint8_t data) #if defined(__linux__) outb(data, port); #endif - #if defined(__OpenBSD__) + #if defined(__OpenBSD__) || defined(__FreeBSD__) outb(port, data); #endif #if defined(__NetBSD__) @@ -56,7 +63,7 @@ sys_outl(unsigned int port, uint32_t data) #if defined(__linux__) outl(data, port); #endif - #if defined(__OpenBSD__) + #if defined(__OpenBSD__) || defined(__FreeBSD__) outl(port, data); #endif #if defined(__NetBSD__) @@ -67,7 +74,8 @@ sys_outl(unsigned int port, uint32_t data) uint8_t sys_inb(unsigned int port) { - #if defined(__linux__) || defined (__OpenBSD__) + #if defined(__linux__) || defined (__OpenBSD__) \ + || defined(__FreeBSD__) return inb(port); #endif @@ -82,7 +90,8 @@ sys_inb(unsigned int port) uint32_t sys_inl(unsigned int port) { - #if defined(__linux__) || defined (__OpenBSD__) + #if defined(__linux__) || defined (__OpenBSD__) \ + || defined(__FreeBSD__) return inl(port); #endif #if defined(__NetBSD__) @@ -115,6 +124,28 @@ sys_iopl(int level) #endif /* __amd64__ */ #endif /* __NetBSD__ */ +#if defined(__FreeBSD__) + /* Refer to io(4) manual page. This assumes the legacy behavior + * where opening /dev/io raises the IOPL of the process */ + static int io_fd = -1; + + /* Requesting privileged access */ + if (level > 0) { + if (io_fd == -1) { + io_fd = open("/dev/io", O_RDONLY); + return (io_fd == -1) ? -1 : 0; + } + /* Lowering access to lowest level */ + } else if (level == 0 && io_fd != -1) { + if (close(io_fd) == -1) { + return -1; + } else { + io_fd = -1; + } + } + return 0; +#endif /* __FreeBSD__ */ + errno = ENOSYS; return -1; } |