Added CPU handling for Apple Silicon

This commit is contained in:
Intelli 2025-04-11 18:33:33 -06:00
parent bb86b1b555
commit 90a2e481f2
2 changed files with 194 additions and 1 deletions

View file

@ -17,6 +17,7 @@ import net.coreprotect.patch.Patch;
import net.coreprotect.thread.NetworkHandler; import net.coreprotect.thread.NetworkHandler;
import net.coreprotect.utility.Chat; import net.coreprotect.utility.Chat;
import net.coreprotect.utility.Color; import net.coreprotect.utility.Color;
import net.coreprotect.utility.SystemUtils;
import net.coreprotect.utility.VersionUtils; import net.coreprotect.utility.VersionUtils;
public class StatusCommand { public class StatusCommand {
@ -116,7 +117,17 @@ public class StatusCommand {
} }
String cpuSpeed = String.valueOf(ConfigHandler.processorInfo.getMaxFreq()); String cpuSpeed = String.valueOf(ConfigHandler.processorInfo.getMaxFreq());
cpuSpeed = String.format("%.2f", Long.valueOf(cpuSpeed) / 1000000000.0); double speedVal = Long.valueOf(cpuSpeed) / 1000000000.0;
// Fix for Apple Silicon processors reporting 0 GHz
if (speedVal < 0.01 && SystemUtils.isAppleSilicon()) {
Double appleSiliconSpeed = SystemUtils.getAppleSiliconSpeed();
if (appleSiliconSpeed != null) {
speedVal = appleSiliconSpeed;
}
}
cpuSpeed = String.format("%.2f", speedVal);
cpuInfo = "x" + Runtime.getRuntime().availableProcessors() + " " + cpuSpeed + "GHz " + modelName + "."; cpuInfo = "x" + Runtime.getRuntime().availableProcessors() + " " + cpuSpeed + "GHz " + modelName + ".";
} }
else { else {

View file

@ -1,5 +1,11 @@
package net.coreprotect.utility; package net.coreprotect.utility;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.config.Configurator; import org.apache.logging.log4j.core.config.Configurator;
@ -11,6 +17,7 @@ public class SystemUtils {
private static boolean testMode = Boolean.getBoolean("net.coreprotect.test"); private static boolean testMode = Boolean.getBoolean("net.coreprotect.test");
private static String processorInfo = null; private static String processorInfo = null;
private static boolean log4jInitialized = false; private static boolean log4jInitialized = false;
private static Double appleProcessorSpeed = null;
private SystemUtils() { private SystemUtils() {
throw new IllegalStateException("Utility class"); throw new IllegalStateException("Utility class");
@ -29,6 +36,181 @@ public class SystemUtils {
} }
} }
/**
* Check if running on Apple Silicon
*
* @return True if running on Apple Silicon
*/
public static boolean isAppleSilicon() {
String osName = System.getProperty("os.name", "").toLowerCase();
String osArch = System.getProperty("os.arch", "").toLowerCase();
return osName.contains("mac") && (osArch.contains("aarch64") || osArch.contains("arm"));
}
/**
* Get processor clock speed for Apple Silicon
*
* @return Processor speed in GHz, or null if unavailable
*/
public static Double getAppleSiliconSpeed() {
if (appleProcessorSpeed != null) {
return appleProcessorSpeed;
}
if (testMode) {
return 3.2; // Default test value
}
// Try to determine the CPU model first to use for frequency lookup
String modelName = getProcessorModel();
// First attempt: Get frequency from machdep.cpu.brand_string if it contains GHz info
if (modelName != null && modelName.contains("GHz")) {
try {
Pattern pattern = Pattern.compile("(\\d+\\.\\d+)GHz");
Matcher matcher = pattern.matcher(modelName);
if (matcher.find()) {
appleProcessorSpeed = Double.parseDouble(matcher.group(1));
return appleProcessorSpeed;
}
}
catch (Exception e) {
// Failed to extract frequency from model name
}
}
// Second attempt: Use sysctl method to detect P-core maximum frequencies
try {
ProcessBuilder pb = new ProcessBuilder("sysctl", "-n", "machdep.cpu.brand_string");
Process process = pb.start();
if (process.waitFor(500, TimeUnit.MILLISECONDS)) {
String appleChipInfo = null;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
appleChipInfo = reader.readLine();
}
if (appleChipInfo != null) {
// Extract M-series info
if (appleChipInfo.contains("M1")) {
return getMSeriesSpeed("M1", appleChipInfo);
}
else if (appleChipInfo.contains("M2")) {
return getMSeriesSpeed("M2", appleChipInfo);
}
else if (appleChipInfo.contains("M3")) {
return getMSeriesSpeed("M3", appleChipInfo);
}
else if (appleChipInfo.contains("M4")) {
return getMSeriesSpeed("M4", appleChipInfo);
}
}
}
}
catch (Exception e) {
// Failed with sysctl method
}
// Fallback to reasonable defaults based on processor model
if (modelName != null) {
if (modelName.contains("M1")) {
appleProcessorSpeed = 3.2;
}
else if (modelName.contains("M2")) {
appleProcessorSpeed = 3.7;
}
else if (modelName.contains("M3")) {
appleProcessorSpeed = 4.05;
}
else if (modelName.contains("M4")) {
appleProcessorSpeed = 4.5;
}
else {
appleProcessorSpeed = 3.0; // Generic fallback
}
return appleProcessorSpeed;
}
return 3.2; // Default fallback
}
/**
* Get the processor speed based on the M-series chip variant
*
* @param series
* The M-series (M1, M2, M3, M4)
* @param chipInfo
* The full chip info string
* @return The processor speed in GHz
*/
private static Double getMSeriesSpeed(String series, String chipInfo) {
switch (series) {
case "M1":
if (chipInfo.contains("Pro") || chipInfo.contains("Max") || chipInfo.contains("Ultra")) {
appleProcessorSpeed = 3.23; // M1 Pro/Max/Ultra P cores
}
else {
appleProcessorSpeed = 3.2; // Base M1 P cores
}
break;
case "M2":
if (chipInfo.contains("Pro") || chipInfo.contains("Max") || chipInfo.contains("Ultra")) {
appleProcessorSpeed = 3.7; // M2 Pro/Max/Ultra P cores
}
else {
appleProcessorSpeed = 3.5; // Base M2 P cores
}
break;
case "M3":
if (chipInfo.contains("Pro") || chipInfo.contains("Max")) {
appleProcessorSpeed = 4.05; // M3 Pro/Max P cores
}
else {
appleProcessorSpeed = 4.0; // Base M3 P cores
}
break;
case "M4":
if (chipInfo.contains("Max")) {
appleProcessorSpeed = 4.5; // M4 Max P cores
}
else if (chipInfo.contains("Pro")) {
appleProcessorSpeed = 4.5; // M4 Pro P cores
}
else {
appleProcessorSpeed = 4.3; // Base M4 P cores
}
break;
default:
appleProcessorSpeed = 3.2; // Default
break;
}
return appleProcessorSpeed;
}
/**
* Get processor model name for Apple Silicon
*
* @return Processor model name, or null if unavailable
*/
private static String getProcessorModel() {
try {
ProcessBuilder pb = new ProcessBuilder("sysctl", "-n", "machdep.cpu.brand_string");
Process process = pb.start();
if (process.waitFor(500, TimeUnit.MILLISECONDS)) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
return reader.readLine();
}
}
}
catch (Exception e) {
// Failed to get CPU model
}
return null;
}
public static CentralProcessor getProcessorInfo() { public static CentralProcessor getProcessorInfo() {
// In test mode, don't actually try to initialize hardware components // In test mode, don't actually try to initialize hardware components
if (testMode || isLog4jDisabled()) { if (testMode || isLog4jDisabled()) {