eal: fix build on FreeBSD
authorThomas Monjalon <thomas@monjalon.net>
Fri, 27 Apr 2018 01:49:19 +0000 (03:49 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Fri, 27 Apr 2018 09:13:59 +0000 (11:13 +0200)
The auxiliary vector read is implemented only for Linux.
It could be done with procstat_getauxv() for FreeBSD.

Since the commit below, the auxiliary vector functions
are compiled for every architectures, including x86
which is tested with FreeBSD.

This patch is moving the Linux implementation in Linux directory,
and adding a fake/empty implementation for FreeBSD.

Fixes: 2ed9bf330709 ("eal: abstract away the auxiliary vector")

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Maxime Coquelin <maxime.coquelin@redhat.com>
lib/librte_eal/bsdapp/eal/Makefile
lib/librte_eal/bsdapp/eal/eal_cpuflags.c [new file with mode: 0644]
lib/librte_eal/bsdapp/eal/meson.build
lib/librte_eal/common/eal_common_cpuflags.c
lib/librte_eal/linuxapp/eal/Makefile
lib/librte_eal/linuxapp/eal/eal_cpuflags.c [new file with mode: 0644]
lib/librte_eal/linuxapp/eal/meson.build

index 200285e..3fd33f1 100644 (file)
@@ -25,6 +25,7 @@ LIBABIVER := 7
 
 # specific to bsdapp exec-env
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) := eal.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_cpuflags.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_memory.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_hugepage_info.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_thread.c
diff --git a/lib/librte_eal/bsdapp/eal/eal_cpuflags.c b/lib/librte_eal/bsdapp/eal/eal_cpuflags.c
new file mode 100644 (file)
index 0000000..69b161e
--- /dev/null
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2018 Mellanox Technologies, Ltd
+ */
+
+#include <rte_common.h>
+#include <rte_cpuflags.h>
+
+unsigned long
+rte_cpu_getauxval(unsigned long type __rte_unused)
+{
+       /* not implemented */
+       return 0;
+}
+
+int
+rte_cpu_strcmp_auxval(unsigned long type __rte_unused,
+               const char *str __rte_unused)
+{
+       /* not implemented */
+       return -1;
+}
index 4c56118..47e16a6 100644 (file)
@@ -4,6 +4,7 @@
 env_objs = []
 env_headers = []
 env_sources = files('eal_alarm.c',
+               'eal_cpuflags.c',
                'eal_debug.c',
                'eal_hugepage_info.c',
                'eal_interrupts.c',
index 6a9dbae..3a055f7 100644 (file)
@@ -2,90 +2,11 @@
  * Copyright(c) 2010-2014 Intel Corporation
  */
 
-#include <elf.h>
-#include <fcntl.h>
 #include <stdio.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
-#if __GLIBC_PREREQ(2, 16)
-#include <sys/auxv.h>
-#define HAS_AUXV 1
-#endif
-#endif
 
 #include <rte_common.h>
 #include <rte_cpuflags.h>
 
-#ifndef HAS_AUXV
-static unsigned long
-getauxval(unsigned long type __rte_unused)
-{
-       errno = ENOTSUP;
-       return 0;
-}
-#endif
-
-#ifdef RTE_ARCH_64
-typedef Elf64_auxv_t Internal_Elfx_auxv_t;
-#else
-typedef Elf32_auxv_t Internal_Elfx_auxv_t;
-#endif
-
-
-/**
- * Provides a method for retrieving values from the auxiliary vector and
- * possibly running a string comparison.
- *
- * @return Always returns a result.  When the result is 0, check errno
- * to see if an error occurred during processing.
- */
-static unsigned long
-_rte_cpu_getauxval(unsigned long type, const char *str)
-{
-       unsigned long val;
-
-       errno = 0;
-       val = getauxval(type);
-
-       if (!val && (errno == ENOTSUP || errno == ENOENT)) {
-               int auxv_fd = open("/proc/self/auxv", O_RDONLY);
-               Internal_Elfx_auxv_t auxv;
-
-               if (auxv_fd == -1)
-                       return 0;
-
-               errno = ENOENT;
-               while (read(auxv_fd, &auxv, sizeof(auxv)) == sizeof(auxv)) {
-                       if (auxv.a_type == type) {
-                               errno = 0;
-                               val = auxv.a_un.a_val;
-                               if (str)
-                                       val = strcmp((const char *)val, str);
-                               break;
-                       }
-               }
-               close(auxv_fd);
-       }
-
-       return val;
-}
-
-unsigned long
-rte_cpu_getauxval(unsigned long type)
-{
-       return _rte_cpu_getauxval(type, NULL);
-}
-
-int
-rte_cpu_strcmp_auxval(unsigned long type, const char *str)
-{
-       return _rte_cpu_getauxval(type, str);
-}
-
 /**
  * Checks if the machine is adequate for running the binary. If it is not, the
  * program exits with status 1.
index 45517a2..3719ec9 100644 (file)
@@ -30,6 +30,7 @@ endif
 
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) := eal.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_cpuflags.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_hugepage_info.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_memory.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_thread.c
diff --git a/lib/librte_eal/linuxapp/eal/eal_cpuflags.c b/lib/librte_eal/linuxapp/eal/eal_cpuflags.c
new file mode 100644 (file)
index 0000000..d38296e
--- /dev/null
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2018 Red Hat, Inc.
+ */
+
+#include <elf.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
+#if __GLIBC_PREREQ(2, 16)
+#include <sys/auxv.h>
+#define HAS_AUXV 1
+#endif
+#endif
+
+#include <rte_cpuflags.h>
+
+#ifndef HAS_AUXV
+static unsigned long
+getauxval(unsigned long type __rte_unused)
+{
+       errno = ENOTSUP;
+       return 0;
+}
+#endif
+
+#ifdef RTE_ARCH_64
+typedef Elf64_auxv_t Internal_Elfx_auxv_t;
+#else
+typedef Elf32_auxv_t Internal_Elfx_auxv_t;
+#endif
+
+/**
+ * Provides a method for retrieving values from the auxiliary vector and
+ * possibly running a string comparison.
+ *
+ * @return Always returns a result.  When the result is 0, check errno
+ * to see if an error occurred during processing.
+ */
+static unsigned long
+_rte_cpu_getauxval(unsigned long type, const char *str)
+{
+       unsigned long val;
+
+       errno = 0;
+       val = getauxval(type);
+
+       if (!val && (errno == ENOTSUP || errno == ENOENT)) {
+               int auxv_fd = open("/proc/self/auxv", O_RDONLY);
+               Internal_Elfx_auxv_t auxv;
+
+               if (auxv_fd == -1)
+                       return 0;
+
+               errno = ENOENT;
+               while (read(auxv_fd, &auxv, sizeof(auxv)) == sizeof(auxv)) {
+                       if (auxv.a_type == type) {
+                               errno = 0;
+                               val = auxv.a_un.a_val;
+                               if (str)
+                                       val = strcmp((const char *)val, str);
+                               break;
+                       }
+               }
+               close(auxv_fd);
+       }
+
+       return val;
+}
+
+unsigned long
+rte_cpu_getauxval(unsigned long type)
+{
+       return _rte_cpu_getauxval(type, NULL);
+}
+
+int
+rte_cpu_strcmp_auxval(unsigned long type, const char *str)
+{
+       return _rte_cpu_getauxval(type, str);
+}
index 9c01931..cce3771 100644 (file)
@@ -7,6 +7,7 @@ install_subdir('include/exec-env', install_dir: get_option('includedir'))
 env_objs = []
 env_headers = []
 env_sources = files('eal_alarm.c',
+               'eal_cpuflags.c',
                'eal_debug.c',
                'eal_hugepage_info.c',
                'eal_interrupts.c',