public bool SetPerfBias(PerfBias pb) { uint pb1_eax = 0, pb1_edx = 0, pb2_eax = 0, pb2_edx = 0, pb3_eax = 0, pb3_edx = 0, pb4_eax = 0, pb4_edx = 0, pb5_eax = 0, pb5_edx = 0; // Read current settings if (ols.RdmsrTx(MSR_PERFBIAS1, ref pb1_eax, ref pb1_edx, (UIntPtr)1) != 1) { return(false); } if (ols.RdmsrTx(MSR_PERFBIAS2, ref pb2_eax, ref pb2_edx, (UIntPtr)1) != 1) { return(false); } if (ols.RdmsrTx(MSR_PERFBIAS3, ref pb3_eax, ref pb3_edx, (UIntPtr)1) != 1) { return(false); } if (ols.RdmsrTx(MSR_PERFBIAS4, ref pb4_eax, ref pb4_edx, (UIntPtr)1) != 1) { return(false); } if (ols.RdmsrTx(MSR_PERFBIAS5, ref pb5_eax, ref pb5_edx, (UIntPtr)1) != 1) { return(false); } // Clear by default pb1_eax &= 0xFFFFFFEF; pb2_eax &= 0xFF83FFFF; pb2_eax |= 0x02000000; pb3_eax &= 0xFFFFFFF8; pb4_eax &= 0xFFF9FFEF; pb5_eax &= 0xFFFFFFFE; // Specific settings switch (pb) { case PerfBias.None: pb1_eax |= 0x10; pb2_eax |= (8 & 0x1F) << 18; pb3_eax |= (7 & 0x7); pb4_eax |= 0x10; break; case PerfBias.Cinebench_R11p5: pb2_eax &= 0xF1FFFFEF; pb3_eax |= (7 & 0x7); pb4_eax |= 0x60010; break; /*case PerfBias.Cinebench_R15: * pb2_eax |= (3 & 0x1F) << 18; * pb2_eax &= 0xF1FFFFEF; * pb3_eax |= (6 & 0x7); * pb4_eax |= 0x10; * pb5_eax |= 1; * break;*/ case PerfBias.Cinebench_R15: pb1_edx &= 0xFFF00F0F; pb2_eax |= (3 & 0x1F) << 18; pb2_eax &= 0xF1FFFFEF; pb3_eax |= (7 & 0x7); pb4_eax |= 0x10; pb5_eax |= 1; break; case PerfBias.Geekbench_3: //pb2_eax &= 0xF1FFFFEF; pb2_eax |= (4 & 0x1F) << 18; pb3_eax |= (7 & 0x7); pb4_eax |= 0x10; break; case PerfBias.Auto: default: return(false); } // Rewrite for (int i = 0; i < Threads; i++) { if (ols.WrmsrTx(MSR_PERFBIAS1, pb1_eax, pb1_edx, (UIntPtr)(((UInt64)1) << i)) != 1) { return(false); } if (ols.WrmsrTx(MSR_PERFBIAS2, pb2_eax, pb2_edx, (UIntPtr)(((UInt64)1) << i)) != 1) { return(false); } if (ols.WrmsrTx(MSR_PERFBIAS3, pb3_eax, pb3_edx, (UIntPtr)(((UInt64)1) << i)) != 1) { return(false); } if (ols.WrmsrTx(MSR_PERFBIAS4, pb4_eax, pb4_edx, (UIntPtr)(((UInt64)1) << i)) != 1) { return(false); } if (ols.WrmsrTx(MSR_PERFBIAS5, pb5_eax, pb5_edx, (UIntPtr)(((UInt64)1) << i)) != 1) { return(false); } } PerformanceBias = pb; return(true); }
void tempTimerHandler(object sender, ElapsedEventArgs e) { try { // timeout handling if (di.MemRead(DataInterface.REG_PING_PONG) == 0) { // timeout cleared serviceTimeout = 0; di.MemWrite(DataInterface.REG_PING_PONG, 0x01); } else { serviceTimeout++; if (serviceTimeout > 3) { // 6000ms timeout occured tempTimer.Stop(); MessageBox.Show("Lost contact with ZenStatesSrv", Application.ProductName); Environment.Exit(0); } } bool updateGui = false; // Manage client commands if (waitCmd != DataInterface.NOTIFY_CLEAR) { // Check for execution if (di.MemRead(DataInterface.REG_NOTIFY_STATUS) == DataInterface.NOTIFY_DONE) { // Clear command di.MemWrite(DataInterface.REG_NOTIFY_STATUS, DataInterface.NOTIFY_CLEAR); // Update GUI? if (waitCmdUpdateGui) { updateGui = true; } // Clear wait cmd waitCmd = DataInterface.NOTIFY_CLEAR; } } ServiceVersion = di.MemRead(DataInterface.REG_SERVER_VERSION); if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_IS_AVAILABLE) == 0) { isAvailable = false; } else { isAvailable = true; } if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_SUPPORTED_CPU) == 0) { supportedCpu = false; } else { supportedCpu = true; } if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_SETTINGS_RESET) == 0) { SettingsReset = false; } else { SettingsReset = true; } if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_SETTINGS_SAVED) == 0) { SettingsSaved = false; } else { SettingsSaved = true; } if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_SHUTDOWN_UNCLEAN) == 0) { ShutdownUnclean = false; } else { ShutdownUnclean = true; } if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_P80_TEMP_EN) == 0) { P80Temp = false; } else { P80Temp = true; } if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_TRAY_ICON_AT_START) == 0) { TrayIconAtStart = false; } else { TrayIconAtStart = true; } if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_APPLY_AT_START) == 0) { ApplyAtStart = false; } else { ApplyAtStart = true; } for (int i = 0; i < Pstates; i++) { Pstate[i] = di.MemRead(DataInterface.REG_P0 + i); } for (int i = 0; i < 2; i++) { BoostFreq[i] = di.MemRead(DataInterface.REG_BOOST_FREQ_0 + i); } BoostFreq[2] = Pstate[2]; PstateOc = di.MemRead(DataInterface.REG_PSTATE_OC); if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_C6CORE) == 0) { ZenC6Core = false; } else { ZenC6Core = true; } if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_C6PACKAGE) == 0) { ZenC6Package = false; } else { ZenC6Package = true; } if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_CPB) == 0) { ZenCorePerfBoost = false; } else { ZenCorePerfBoost = true; } if ((di.MemRead(DataInterface.REG_SERVER_FLAGS) & DataInterface.FLAG_OC) == 0) { ZenOc = false; } else { ZenOc = true; } ZenPPT = (int)di.MemRead(DataInterface.REG_PPT); ZenTDC = (int)di.MemRead(DataInterface.REG_TDC); ZenEDC = (int)di.MemRead(DataInterface.REG_EDC); ZenScalar = (int)di.MemRead(DataInterface.REG_SCALAR); perfBias = (PerfBias)di.MemRead(DataInterface.REG_PERF_BIAS); // Temperature display Temp = (int)di.MemRead(DataInterface.REG_TEMP); if (Temp > 99) { Temp = 99; } else if (Temp < 0) { Temp = 0; } notifyIcon.Icon = iconsW[Temp]; if (sf != null) { if (updateGui) { sf.ResetValues(); } sf.SetSavedButton(!SettingsSaved); } // Handle startup /*if (loadWithOs && loadWithOs_state != 1) * { * setServiceStartup("ZenTCsrv", 2); * setSystemStartup(true); * loadWithOs_state = 1; * } * else if (!loadWithOs && loadWithOs_state != 2) * { * setServiceStartup("ZenTCsrv", 3); * setSystemStartup(false); * loadWithOs_state = 2; * }*/ } catch { // Suppress exception } }