Detect AppleSilicon cpu on OSX
*****************************************************************************/
#include <string.h>
+#ifdef OS_DARWIN
+#include <sys/sysctl.h>
+int32_t value;
+size_t length=sizeof(value);
+#endif
#define CPU_UNKNOWN 0
#define CPU_ARMV8 1
#define CPU_TSV110 9
// Ampere
#define CPU_EMAG8180 10
+// Apple
+#define CPU_SILICON 11
static char *cpuname[] = {
"UNKNOWN",
@@ -59,7 +66,8 @@ static char *cpuname[] = {
"TSV110",
"EMAG8180",
"NEOVERSEN1",
- "THUNDERX3T110"
+ "THUNDERX3T110",
+ "SILICON"
};
static char *cpuname_lower[] = {
@@ -75,7 +83,8 @@ static char *cpuname_lower[] = {
"tsv110",
"emag8180",
"neoversen1",
- "thunderx3t110"
+ "thunderx3t110",
+ "silicon"
};
int get_feature(char *search)
@@ -198,6 +207,10 @@ int detect(void)
}
#else
+#ifdef DARWIN
+ sysctlbyname("hw.cpufamily",&value,&length,NULL,0);
+ if (value ==131287967) return CPU_SILICON;
+#endif
return CPU_ARMV8;
#endif
@@ -247,7 +260,10 @@ int n=0;
printf("#define NUM_CORES %d\n",n);
#endif
-
+#ifdef DARWIN
+ sysctlbyname("hw.physicalcpu_max",&value,&length,NULL,0);
+ printf("#define NUM_CORES %d\n",value);
+#endif
}
@@ -398,6 +414,19 @@ void get_cpuconfig(void)
printf("#define DTB_DEFAULT_ENTRIES 64 \n");
printf("#define DTB_SIZE 4096 \n");
break;
+#ifdef DARWIN
+ case CPU_SILICON:
+ printf("#define SILICON \n");
+ sysctlbyname("hw.l1icachesize",&value,&length,NULL,0);
+ printf("#define L1_CODE_SIZE %d \n",value);
+ sysctlbyname("hw.cachelinesize",&value,&length,NULL,0);
+ printf("#define L1_CODE_LINESIZE %d \n",value);
+ sysctlbyname("hw.l1dcachesize",&value,&length,NULL,0);
+ printf("#define L1_DATA_SIZE %d \n",value);
+ sysctlbyname("hw.l2dcachesize",&value,&length,NULL,0);
+ printf("#define L2_DATA_SIZE %d \n",value);
+ break;
+#endif
}
get_cpucount();
}
