m1cpu: able to read p-core and e-core counts
diff --git a/cpu.go b/cpu.go
index aa261bb..e04c9ee 100644
--- a/cpu.go
+++ b/cpu.go
@@ -5,11 +5,14 @@
 // #cgo LDFLAGS: -framework CoreFoundation -framework IOKit
 // #include <CoreFoundation/CoreFoundation.h>
 // #include <IOKit/IOKitLib.h>
+// #include <sys/sysctl.h>
 //
 // #define HzToGHz(hz) ((hz) / 1000000000.0)
 //
 // UInt64 global_pCoreHz;
 // UInt64 global_eCoreHz;
+// int global_pCoreCount;
+// int global_eCoreCount;
 //
 // UInt64 getFrequency(CFTypeRef typeRef) {
 // CFDataRef cfData = typeRef;
@@ -27,7 +30,17 @@
 // return pCoreHz;
 // }
 //
+// int sysctl_int(const char * name) {
+//  int value = -1;
+//  size_t size = 8;
+//  sysctlbyname(name, &value, &size, NULL, 0);
+//  return value;
+// }
+//
 // void initialize() {
+//   global_pCoreCount = sysctl_int("hw.perflevel0.physicalcpu");
+//   global_eCoreCount = sysctl_int("hw.perflevel1.physicalcpu");
+//
 //   CFMutableDictionaryRef matching = IOServiceMatching("AppleARMIODevice");
 //   io_iterator_t  iter;
 //   IOServiceGetMatchingServices(kIOMainPortDefault, matching, &iter);
@@ -68,6 +81,14 @@
 // Float64 pCoreGHz() {
 //   return HzToGHz(global_pCoreHz);
 // }
+//
+// int pCoreCount() {
+//   return global_pCoreCount;
+// }
+//
+// int eCoreCount() {
+//   return global_eCoreCount;
+// }
 import "C"
 
 func init() {
@@ -98,3 +119,13 @@
 func ECoreGHz() float64 {
 	return float64(C.eCoreGHz())
 }
+
+// PCoreCount returns the number of physical P (performance) cores.
+func PCoreCount() int {
+	return int(C.pCoreCount())
+}
+
+// ECoreCount returns the number of physical E (efficiency) cores.
+func ECoreCount() int {
+	return int(C.eCoreCount())
+}
diff --git a/cpu_test.go b/cpu_test.go
index 1edc836..34f32e1 100644
--- a/cpu_test.go
+++ b/cpu_test.go
@@ -33,4 +33,6 @@
 	t.Log("eCore Hz", ECoreHz())
 	t.Log("pCore GHz", PCoreGHz())
 	t.Log("eCore GHz", ECoreGHz())
+	t.Log("pCore count", PCoreCount())
+	t.Log("eCoreCount", ECoreCount())
 }
\ No newline at end of file
diff --git a/incompatible.go b/incompatible.go
index 76c1d8b..0a9ddf2 100644
--- a/incompatible.go
+++ b/incompatible.go
@@ -7,22 +7,32 @@
 	return false
 }
 
-// PCoreHZ returns the max frequency in Hertz of the P-Core of an Apple Silicon CPU.
+// PCoreHZ requires darwin/arm64
 func PCoreHz() uint64 {
 	panic("m1cpu: not a darwin/arm64 system")
 }
 
-// ECoreHZ returns the max frequency in Hertz of the E-Core of an Apple Silicon CPU.
+// ECoreHZ requires darwin/arm64
 func ECoreHz() uint64 {
 	panic("m1cpu: not a darwin/arm64 system")
 }
 
-// PCoreGHz returns the max frequency in Gigahertz of the P-Core of an Apple Silicon CPU.
+// PCoreGHz requires darwin/arm64
 func PCoreGHz() float64 {
 	panic("m1cpu: not a darwin/arm64 system")
 }
 
-// ECoreGHz returns the max frequency in Gigahertz of the E-Core of an Apple Silicon CPU.
+// ECoreGHz requires darwin/arm64
 func ECoreGHz() float64 {
 	panic("m1cpu: not a darwin/arm64 system")
 }
+
+// PCoreCount requires darwin/arm64
+func PCoreCount() int {
+	panic("m1cpu: not a darwin/arm64 system")
+}
+
+// ECoreCount requires darwin/arm64
+func ECoreCount() int {
+	panic("m1cpu: not a darwin/arm64 system")
+}