Fix cacheline detection on FreeBSD/powerpc.
machdep.cacheline_size is an integer, not a long. Since PowerPC is
big-endian this causes sysctlbyname() to fill in the upper bits of the
argument, rather than the correct 'lower bits' of the word. Specify the
correct type to fix this.
Fixes: b255b2c8a5
("util: add cacheinfo")
Signed-off-by: Justin Hibbits <chmeeedalf@gmail.com>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Tested-by: Justin Hibbits <chmeeedalf@gmail.com>
Message-Id: <20190821082546.5252-2-laurent@vivier.eu>
This commit is contained in:
parent
5c95975d8d
commit
5ca156cfde
@ -65,25 +65,28 @@ static void sys_cache_info(int *isize, int *dsize)
|
||||
g_free(buf);
|
||||
}
|
||||
|
||||
#elif defined(__APPLE__) \
|
||||
|| defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
#elif defined(__APPLE__)
|
||||
# include <sys/sysctl.h>
|
||||
# if defined(__APPLE__)
|
||||
# define SYSCTL_CACHELINE_NAME "hw.cachelinesize"
|
||||
# else
|
||||
# define SYSCTL_CACHELINE_NAME "machdep.cacheline_size"
|
||||
# endif
|
||||
|
||||
static void sys_cache_info(int *isize, int *dsize)
|
||||
{
|
||||
/* There's only a single sysctl for both I/D cache line sizes. */
|
||||
long size;
|
||||
size_t len = sizeof(size);
|
||||
if (!sysctlbyname(SYSCTL_CACHELINE_NAME, &size, &len, NULL, 0)) {
|
||||
if (!sysctlbyname("hw.cachelinesize", &size, &len, NULL, 0)) {
|
||||
*isize = *dsize = size;
|
||||
}
|
||||
}
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
# include <sys/sysctl.h>
|
||||
static void sys_cache_info(int *isize, int *dsize)
|
||||
{
|
||||
/* There's only a single sysctl for both I/D cache line sizes. */
|
||||
int size;
|
||||
size_t len = sizeof(size);
|
||||
if (!sysctlbyname("machdep.cacheline_size", &size, &len, NULL, 0)) {
|
||||
*isize = *dsize = size;
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
/* POSIX */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user