[igt-dev] [PATCH i-g-t 01/10] lib/igt_freebsd.h: Create FreeBSD compatibility header

Jake Freeland jake at technologyfriends.net
Fri Oct 7 04:07:09 UTC 2022


This header attempts to be a simple drop-in to enable FreeBSD
support in a given source file. It includes macro substitutions
that replace Linux-specific phrases with their FreeBSD equivalents.

Signed-off-by: Jake Freeland <jfree at freebsd.org>
---
 benchmarks/gem_exec_tracer.c |   4 ++
 benchmarks/gem_syslatency.c  |   4 ++
 lib/igt_core.h               |   4 ++
 lib/igt_freebsd.h            | 118 +++++++++++++++++++++++++++++++++++
 4 files changed, 130 insertions(+)
 create mode 100644 lib/igt_freebsd.h

diff --git a/benchmarks/gem_exec_tracer.c b/benchmarks/gem_exec_tracer.c
index e6973991..7e86473e 100644
--- a/benchmarks/gem_exec_tracer.c
+++ b/benchmarks/gem_exec_tracer.c
@@ -41,6 +41,10 @@
 #include "intel_aub.h"
 #include "intel_chipset.h"
 
+#ifdef __FreeBSD__
+#include "igt_freebsd.h"
+#endif
+
 static int (*libc_close)(int fd);
 static int (*libc_ioctl)(int fd, unsigned long request, void *argp);
 
diff --git a/benchmarks/gem_syslatency.c b/benchmarks/gem_syslatency.c
index 035ee934..3af5f406 100644
--- a/benchmarks/gem_syslatency.c
+++ b/benchmarks/gem_syslatency.c
@@ -47,6 +47,10 @@
 #include "i915/gem_create.h"
 #include "i915/gem_ring.h"
 
+#ifdef __FreeBSD__
+#include "igt_freebsd.h"
+#endif
+
 #define sigev_notify_thread_id _sigev_un._tid
 
 static volatile int done;
diff --git a/lib/igt_core.h b/lib/igt_core.h
index f21723de..a6b4b5ae 100644
--- a/lib/igt_core.h
+++ b/lib/igt_core.h
@@ -43,6 +43,10 @@
 #include <getopt.h>
 #include <unistd.h>
 
+#ifdef __FreeBSD__
+#include "igt_freebsd.h"
+#endif
+
 #ifndef IGT_LOG_DOMAIN
 #define IGT_LOG_DOMAIN (NULL)
 #endif
diff --git a/lib/igt_freebsd.h b/lib/igt_freebsd.h
new file mode 100644
index 00000000..53fa8fb6
--- /dev/null
+++ b/lib/igt_freebsd.h
@@ -0,0 +1,118 @@
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright (c) 2022, Jake Freeland <jfree at FreeBSD.org>
+ */
+
+#if !defined(IGT_FREEBSD_H)
+
+#if !defined(__FreeBSD__)
+#error "This header is only for FreeBSD platform."
+#endif
+
+#define IGT_FREEBSD_H
+
+#include <sys/consio.h>
+#include <sys/endian.h>
+#include <sys/errno.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/sched.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/watchdog.h>
+
+#include <libgen.h>
+#include <limits.h>
+#include <pthread.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <unistd.h>
+
+/*
+ * Proper substitutions:
+ * The following macros replace Linux-specific functions
+ * and macros with their FreeBSD equivalents.
+ */
+
+typedef	int32_t		__s32;
+typedef	uint32_t	__u32;
+typedef	uint64_t	__u64;
+
+typedef	ino_t		ino64_t;
+typedef	sig_t		sighandler_t;
+
+#define	jmp_buf	sigjmp_buf
+
+#define	PTRACE_TRACEME  PT_TRACE_ME
+#define	PTRACE_ATTACH   PT_ATTACH
+#define	PTRACE_PEEKDATA PT_READ_D
+#define	PTRACE_POKEDATA PT_WRITE_D
+#define	PTRACE_DETACH   PT_DETACH
+
+#define	I2C_RDWR		I2CRDWR
+#define	I2C_M_RD		IIC_M_RD
+#define	i2c_msg			iic_msg
+#define	i2c_rdwr_ioctl_data	iic_rdwr_data
+
+#define	bswap_32(x)	bswap32(x)
+
+#define	_IOC_TYPE(nr)	(((nr) >> 8) & 255)
+
+#define	SYS_getdents64	SYS_freebsd11_getdents
+
+#define	mount(src, dest, fstype, flags, data)	\
+	mount(fstype, dest, flags, data)
+
+/*
+ * Improper substitutions:
+ * The following macros are temporary replacements for functions
+ * and macros that exist on Linux and do not exist on FreeBSD.
+ */
+
+#define	ETIME	ETIMEDOUT
+
+#define	MAP_POPULATE	MAP_PREFAULT_READ
+
+#define	MADV_HUGEPAGE	MADV_SEQUENTIAL
+#define	MADV_DONTFORK	MADV_NOSYNC
+
+#define	WDIOC_KEEPALIVE	WDIOCPATPAT
+
+#define	SCHED_RESET_ON_FORK	0
+#define	SCHED_IDLE	SCHED_OTHER
+
+#define	gettid()	getpid()
+
+#define	pthread_sigqueue(pid, signo, value)	\
+	sigqueue(pid, signo, value)
+
+#define	signalfd(fd, mask, flags)	-ENOSYS
+#define	timerfd_create(c, f)		-ENOSYS
+#define	timerfd_settime(fd, f, n, o)	-ENOSYS
+
+/*
+ * Macro conflict resolution.
+ */
+
+#undef	ALIGN
+#undef	PAGE_SIZE
+
+/*
+ * Missing Linux structures.
+ */
+
+struct signalfd_siginfo {
+	uint32_t ssi_signo;
+	uint32_t ssi_pid;
+};
+
+struct kmod_module {
+	size_t size;
+};
+
+typedef struct {
+	char state;
+} proc_t;
+
+#endif /* IGT_FREEBSD_H */
-- 
2.37.3



More information about the igt-dev mailing list