summaryrefslogtreecommitdiff
path: root/util/dell-flash-unlock/accessors.c
diff options
context:
space:
mode:
authorNicholas Chin <nic.c3.14@gmail.com>2024-05-01 20:11:14 -0600
committerNicholas Chin <nic.c3.14@gmail.com>2024-05-01 20:11:14 -0600
commit5e2e761142085f60c85f19895d985a58a6f5ee0f (patch)
treed6d24c97964d480eccd6f3bd9cfb9c12038b2aa6 /util/dell-flash-unlock/accessors.c
parent61dbaf9463034fb893ca8f5131681bdd54ec5472 (diff)
dell_flash_unlock: Add support for FreeBSD
Signed-off-by: Nicholas Chin <nic.c3.14@gmail.com>
Diffstat (limited to 'util/dell-flash-unlock/accessors.c')
-rw-r--r--util/dell-flash-unlock/accessors.c39
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;
}