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: b255b2c8a548 ("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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Justin Hibbits
						Justin Hibbits