mirror of https://github.com/xemu-project/xemu.git
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);
|
g_free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__APPLE__) \
|
#elif defined(__APPLE__)
|
||||||
|| defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
|
||||||
# include <sys/sysctl.h>
|
# 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)
|
static void sys_cache_info(int *isize, int *dsize)
|
||||||
{
|
{
|
||||||
/* There's only a single sysctl for both I/D cache line sizes. */
|
/* There's only a single sysctl for both I/D cache line sizes. */
|
||||||
long size;
|
long size;
|
||||||
size_t len = sizeof(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;
|
*isize = *dsize = size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* POSIX */
|
/* POSIX */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue