Commit 5ca156cf authored by Justin Hibbits's avatar Justin Hibbits Committed by Laurent Vivier
Browse files

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: b255b2c8 ("util: add cacheinfo")
Signed-off-by: default avatarJustin Hibbits <chmeeedalf@gmail.com>
Signed-off-by: default avatarLaurent Vivier <laurent@vivier.eu>
Tested-by: default avatarJustin Hibbits <chmeeedalf@gmail.com>
Message-Id: <20190821082546.5252-2-laurent@vivier.eu>
parent 5c95975d
Loading
Loading
Loading
Loading
+13 −10
Original line number Diff line number Diff line
@@ -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 */