فهرست منبع

sys/info: retrieve better CPU description on Darwin

Previously either `ARM` or `ARM64`, now you get something like `Apple
M1`
Laytan Laats 1 سال پیش
والد
کامیت
d40c207fde
2فایلهای تغییر یافته به همراه41 افزوده شده و 13 حذف شده
  1. 21 6
      core/sys/info/cpu_arm.odin
  2. 20 7
      src/bug_report.cpp

+ 21 - 6
core/sys/info/cpu_arm.odin

@@ -1,6 +1,10 @@
 //+build arm32, arm64
 package sysinfo
 
+import "core:sys/unix"
+
+_ :: unix
+
 CPU_Feature :: enum u64 {
 	// Advanced SIMD & floating-point capabilities:
 	asimd,         // General support for Advanced SIMD instructions/neon.
@@ -45,11 +49,22 @@ cpu_name_buf: [128]byte
 
 @(init, private)
 init_cpu_name :: proc "contextless" () {
-	when ODIN_ARCH == .arm64 {
-		copy(cpu_name_buf[:], "ARM64")
-		cpu_name = string(cpu_name_buf[:len("ARM64")])
-	} else {
-		copy(cpu_name_buf[:], "ARM")
-		cpu_name = string(cpu_name_buf[:len("ARM")])
+	generic := true
+
+	when ODIN_OS == .Darwin {
+		if unix.sysctlbyname("machdep.cpu.brand_string", &cpu_name_buf) {
+			cpu_name = string(cstring(rawptr(&cpu_name_buf)))
+			generic = false
+		}
+	}
+
+	if generic {
+		when ODIN_ARCH == .arm64 {
+			copy(cpu_name_buf[:], "ARM64")
+			cpu_name = string(cpu_name_buf[:len("ARM64")])
+		} else {
+			copy(cpu_name_buf[:], "ARM")
+			cpu_name = string(cpu_name_buf[:len("ARM")])
+		}
 	}
 }

+ 20 - 7
src/bug_report.cpp

@@ -204,14 +204,27 @@ gb_internal void report_cpu_info() {
 	}
 
 	#elif defined(GB_CPU_ARM)
-		/*
-			TODO(Jeroen): On *nix, perhaps query `/proc/cpuinfo`.
-		*/
-		#if defined(GB_ARCH_64_BIT)
-			gb_printf("ARM64\n");
-		#else
-			gb_printf("ARM\n");
+		bool generic = true;
+
+		#if defined(GB_SYSTEM_OSX)
+			char cpu_name[128] = {};	
+			size_t cpu_name_size = 128;
+			if (sysctlbyname("machdep.cpu.brand_string", &cpu_name, &cpu_name_size, nullptr, 0) == 0) {
+				generic = false;
+				gb_printf("%s\n", (char *)&cpu_name[0]);
+			}
 		#endif
+
+		if (generic) {
+			/*
+				TODO(Jeroen): On *nix, perhaps query `/proc/cpuinfo`.
+			*/
+			#if defined(GB_ARCH_64_BIT)
+				gb_printf("ARM64\n");
+			#else
+				gb_printf("ARM\n");
+			#endif
+		}
 	#else
 		gb_printf("Unknown\n");
 	#endif