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;  } | 
