numam-dpdk/lib/eal/linux/eal_cpuflags.c
Bruce Richardson 99a2dd955f lib: remove librte_ prefix from directory names
There is no reason for the DPDK libraries to all have 'librte_' prefix on
the directory names. This prefix makes the directory names longer and also
makes it awkward to add features referring to individual libraries in the
build - should the lib names be specified with or without the prefix.
Therefore, we can just remove the library prefix and use the library's
unique name as the directory name, i.e. 'eal' rather than 'librte_eal'

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
2021-04-21 14:04:09 +02:00

85 lines
1.6 KiB
C

/* 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);
}