Support QNX OS platform
authorHuang weiliang(weller) <weller.huang@us.bosch.com>
Mon, 3 Jun 2024 22:37:54 +0000 (22:37 +0000)
committerHuang weiliang(weller) <weller.huang@us.bosch.com>
Fri, 12 Jul 2024 15:45:37 +0000 (15:45 +0000)
Compile command: QNX SDP7.1 example
./configure --cc=aarch64-unknown-nto-qnx7.1.0-gcc --disable-shm
make

Function is verified by UFS device read and write test.

Signed-off-by: Huang weiliang <weller.huang@us.bosch.com>
configure
engines/e4defrag.c
os/os-qnx.h [new file with mode: 0755]
os/os.h

index 3eef022b909f48e5331c640af63f8cb674c28350..f3cb18a0c4bec541ccf0471f3ab34b725a3c853f 100755 (executable)
--- a/configure
+++ b/configure
@@ -366,6 +366,8 @@ elif check_define __sun__ ; then
   CFLAGS="$CFLAGS -D_REENTRANT"
 elif check_define _WIN32 ; then
   targetos='CYGWIN'
+elif check_define __QNX__ ; then
+  targetos='QNX'
 else
   targetos=`uname -s`
 fi
@@ -466,6 +468,9 @@ CYGWIN*)
   pthread_condattr_setclock="no"
   pthread_affinity="no"
   ;;
+QNX)
+  LIBS="-lsocket"
+  ;;
 esac
 
 # Now we know the target platform we can have another guess at the preferred
@@ -1090,6 +1095,7 @@ if test "$have_vasprintf" != "yes" ; then
 fi
 cat > $TMPC << EOF
 #include <stdio.h>
+#include <stdarg.h>
 
 int main(int argc, char **argv)
 {
index 37cc2ada817dad98faa6968c9d3c8b2e8d0a8af9..65ef0da700bf2027d1cbab2637ee8d0a0d37d40f 100644 (file)
@@ -11,6 +11,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <stdint.h>
 
 #include "../fio.h"
 #include "../optgroup.h"
diff --git a/os/os-qnx.h b/os/os-qnx.h
new file mode 100755 (executable)
index 0000000..8c0b765
--- /dev/null
@@ -0,0 +1,100 @@
+#ifndef FIO_OS_QNX_H
+#define FIO_OS_QNX_H
+
+#define        FIO_OS  os_qnx
+#include <stdint.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/param.h>
+#include <sys/statvfs.h>
+#include <sys/ioctl.h>
+#include <sys/utsname.h>
+#include <sys/sysctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/dcmd_cam.h>
+
+/* XXX hack to avoid conflicts between rbtree.h and <sys/tree.h> */
+#undef RB_BLACK
+#undef RB_RED
+#undef RB_ROOT
+
+#include "../file.h"
+
+/* QNX is not supporting SA_RESTART. Use SA_NOCLDSTOP instead of it */
+#ifndef SA_RESTART
+#define SA_RESTART SA_NOCLDSTOP
+#endif
+
+#define FIO_NO_HAVE_SHM_H
+
+typedef uint64_t __u64;
+typedef unsigned int __u32;
+
+#define FIO_USE_GENERIC_INIT_RANDOM_STATE
+#define FIO_HAVE_FS_STAT
+#define FIO_HAVE_GETTID
+
+#define OS_MAP_ANON            MAP_ANON
+
+#ifndef PTHREAD_STACK_MIN
+#define PTHREAD_STACK_MIN 4096
+#endif
+
+#define fio_swap16(x)  swap16(x)
+#define fio_swap32(x)  swap32(x)
+#define fio_swap64(x)  swap64(x)
+
+#ifdef CONFIG_PTHREAD_GETAFFINITY
+#define FIO_HAVE_GET_THREAD_AFFINITY
+#define fio_get_thread_affinity(mask)  \
+       pthread_getaffinity_np(pthread_self(), sizeof(mask), &(mask))
+#endif
+
+static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes)
+{
+       struct stat statbuf;
+       if (fstat(f->fd, &statbuf) == -1) {
+               perror("fstat");
+       } else {
+               *bytes = (unsigned long long)(statbuf.st_blocksize * statbuf.st_nblocks);
+               return 0;
+       }
+
+       *bytes = 0;
+       return errno;
+}
+
+static inline int blockdev_invalidate_cache(struct fio_file *f)
+{
+       return ENOTSUP;
+}
+
+static inline unsigned long long os_phys_mem(void)
+{
+       int mib[2] = { CTL_HW, HW_PHYSMEM64 };
+       uint64_t mem;
+       size_t len = sizeof(mem);
+
+       sysctl(mib, 2, &mem, &len, NULL, 0);
+       return mem;
+}
+
+static inline unsigned long long get_fs_free_size(const char *path)
+{
+       unsigned long long ret;
+       struct statvfs s;
+
+       if (statvfs(path, &s) < 0)
+               return -1ULL;
+
+       ret = s.f_frsize;
+       ret *= (unsigned long long) s.f_bfree;
+       return ret;
+}
+
+#ifdef MADV_FREE
+#define FIO_MADV_FREE  MADV_FREE
+#endif
+
+#endif
diff --git a/os/os.h b/os/os.h
index 0f1823240faa9f11e638b95c2207f03f5480b4ff..d54e7c0dd7402c4d4f653dd3f456c0e9a06763c3 100644 (file)
--- a/os/os.h
+++ b/os/os.h
@@ -24,6 +24,7 @@ enum {
        os_windows,
        os_android,
        os_dragonfly,
+       os_qnx,
 
        os_nr,
 };
@@ -39,6 +40,8 @@ typedef enum {
 #include "os-freebsd.h"
 #elif defined(__OpenBSD__)
 #include "os-openbsd.h"
+#elif defined(__QNX__)
+#include "os-qnx.h"
 #elif defined(__NetBSD__)
 #include "os-netbsd.h"
 #elif defined(__sun__)