Merge pull request #1868 from martin-frbg/aix_cpuid

Use prtconf to determine CPU type on AIX
This commit is contained in:
Martin Kroeker 2018-11-20 17:25:57 +01:00 committed by GitHub
commit 45c3c459e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 36 additions and 4 deletions

View File

@ -56,6 +56,7 @@
#define CPUTYPE_CELL 6 #define CPUTYPE_CELL 6
#define CPUTYPE_PPCG4 7 #define CPUTYPE_PPCG4 7
#define CPUTYPE_POWER8 8 #define CPUTYPE_POWER8 8
#define CPUTYPE_POWER9 9
char *cpuname[] = { char *cpuname[] = {
"UNKNOWN", "UNKNOWN",
@ -66,7 +67,8 @@ char *cpuname[] = {
"POWER6", "POWER6",
"CELL", "CELL",
"PPCG4", "PPCG4",
"POWER8" "POWER8",
"POWER9"
}; };
char *lowercpuname[] = { char *lowercpuname[] = {
@ -78,7 +80,8 @@ char *lowercpuname[] = {
"power6", "power6",
"cell", "cell",
"ppcg4", "ppcg4",
"power8" "power8",
"power9"
}; };
char *corename[] = { char *corename[] = {
@ -90,6 +93,7 @@ char *corename[] = {
"POWER6", "POWER6",
"CELL", "CELL",
"PPCG4", "PPCG4",
"POWER8",
"POWER8" "POWER8"
}; };
@ -120,6 +124,7 @@ int detect(void){
if (!strncasecmp(p, "POWER6", 6)) return CPUTYPE_POWER6; if (!strncasecmp(p, "POWER6", 6)) return CPUTYPE_POWER6;
if (!strncasecmp(p, "POWER7", 6)) return CPUTYPE_POWER6; if (!strncasecmp(p, "POWER7", 6)) return CPUTYPE_POWER6;
if (!strncasecmp(p, "POWER8", 6)) return CPUTYPE_POWER8; 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, "Cell", 4)) return CPUTYPE_CELL;
if (!strncasecmp(p, "7447", 4)) return CPUTYPE_PPCG4; if (!strncasecmp(p, "7447", 4)) return CPUTYPE_PPCG4;
@ -127,6 +132,33 @@ int detect(void){
#endif #endif
#ifdef _AIX #ifdef _AIX
FILE *infile;
char buffer[512], *p;
p = (char *)NULL;
infile = popen("prtconf|grep 'Processor Type'");
while (fgets(buffer, sizeof(buffer), infile)){
if (!strncmp("Pro", buffer, 3)){
p = strchr(buffer, ':') + 2;
#if 0
fprintf(stderr, "%s\n", p);
#endif
break;
}
}
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; return CPUTYPE_POWER5;
#endif #endif
@ -148,7 +180,7 @@ int id;
id = __asm __volatile("mfpvr %0" : "=r"(id)); id = __asm __volatile("mfpvr %0" : "=r"(id));
switch ( id >> 16 ) { switch ( id >> 16 ) {
case 0x4e: // POWER9 case 0x4e: // POWER9
return return CPUTYPE_POWER8; return CPUTYPE_POWER8;
break; break;
case 0x4d: case 0x4d:
case 0x4b: // POWER8/8E case 0x4b: // POWER8/8E