#include <sys/utsname.h>
#ifdef _AIX
+#include <sys/systemcfg.h>
#include <sys/vminfo.h>
#endif
#ifdef __APPLE__
#define CPUTYPE_PPCG4 7
#define CPUTYPE_POWER8 8
#define CPUTYPE_POWER9 9
+#define CPUTYPE_POWER10 10
char *cpuname[] = {
"UNKNOWN",
"CELL",
"PPCG4",
"POWER8",
- "POWER9"
+ "POWER9",
+ "POWER10"
};
char *lowercpuname[] = {
"cell",
"ppcg4",
"power8",
- "power9"
+ "power9",
+ "power10"
};
char *corename[] = {
"CELL",
"PPCG4",
"POWER8",
- "POWER8"
+ "POWER9",
+ "POWER10"
};
int detect(void){
-#ifdef linux
+#ifdef __linux
FILE *infile;
char buffer[512], *p;
if (!strncasecmp(p, "POWER6", 6)) return CPUTYPE_POWER6;
if (!strncasecmp(p, "POWER7", 6)) return CPUTYPE_POWER6;
if (!strncasecmp(p, "POWER8", 6)) return CPUTYPE_POWER8;
- if (!strncasecmp(p, "POWER9", 6)) return CPUTYPE_POWER8;
+ if (!strncasecmp(p, "POWER9", 6)) return CPUTYPE_POWER9;
+ if (!strncasecmp(p, "POWER10", 7)) return CPUTYPE_POWER10;
if (!strncasecmp(p, "Cell", 4)) return CPUTYPE_CELL;
if (!strncasecmp(p, "7447", 4)) return CPUTYPE_PPCG4;
#endif
#ifdef _AIX
- FILE *infile;
- char buffer[512], *p;
-
- p = (char *)NULL;
- infile = popen("prtconf|grep 'Processor Type'", "r");
- while (fgets(buffer, sizeof(buffer), infile)){
- if (!strncmp("Pro", buffer, 3)){
- p = strchr(buffer, ':') + 2;
-#if 0
- fprintf(stderr, "%s\n", p);
-#endif
- break;
- }
- }
+ // Cast from int to unsigned to ensure comparisons work for all bits in
+ // the bit mask, even the top bit
+ unsigned implementation = (unsigned) _system_configuration.implementation;
- pclose(infile);
-
- if (!strncasecmp(p, "POWER3", 6)) return CPUTYPE_POWER3;
- if (!strncasecmp(p, "POWER4", 6)) return CPUTYPE_POWER4;
- if (!strncasecmp(p, "PPC970", 6)) return CPUTYPE_PPC970;
- if (!strncasecmp(p, "POWER5", 6)) return CPUTYPE_POWER5;
- if (!strncasecmp(p, "POWER6", 6)) return CPUTYPE_POWER6;
- if (!strncasecmp(p, "POWER7", 6)) return CPUTYPE_POWER6;
- if (!strncasecmp(p, "POWER8", 6)) return CPUTYPE_POWER8;
- if (!strncasecmp(p, "POWER9", 6)) return CPUTYPE_POWER8;
- if (!strncasecmp(p, "Cell", 4)) return CPUTYPE_CELL;
- if (!strncasecmp(p, "7447", 4)) return CPUTYPE_PPCG4;
- return CPUTYPE_POWER5;
+ if (implementation >= 0x40000u) return CPUTYPE_POWER10;
+ else if (implementation & 0x20000) return CPUTYPE_POWER9;
+ else if (implementation & 0x10000) return CPUTYPE_POWER8;
+ else if (implementation & 0x08000) return CPUTYPE_POWER6; // POWER 7
+ else if (implementation & 0x04000) return CPUTYPE_POWER6;
+ else if (implementation & 0x02000) return CPUTYPE_POWER5;
+ else if (implementation & 0x01000) return CPUTYPE_POWER4; // MPC7450
+ else if (implementation & 0x00800) return CPUTYPE_POWER4;
+ else return CPUTYPE_POWER3;
#endif
#ifdef __APPLE__
int id;
__asm __volatile("mfpvr %0" : "=r"(id));
switch ( id >> 16 ) {
+ case 0x80: // POWER10
+ return CPUTYPE_POWER10;
+ break;
case 0x4e: // POWER9
- return CPUTYPE_POWER8;
+ return CPUTYPE_POWER9;
break;
case 0x4d:
case 0x4b: // POWER8/8E
return CPUTYPE_UNKNOWN;
}
#endif
+
+ return CPUTYPE_UNKNOWN;
}
void get_architecture(void){