Files
ReLibreHardwareMonitor/LibreHardwareMonitorLib/PawnIo/AmdFamily10.cs
T
namazsoandPhyxionNL eb5e1a20be Swap WinRing0 to PawnIO (#1857)
* Replace WinRing0 with PawnIO

* Update RAMSPDToolkit

* Add install check + cleanup

* Move folder + formatting

* Add back missing TryLoadDll

* Update PawnIo.cs

* Add third party notices file

* Remove the how to apply section

* Drop silent

* Don't crash if PawnIO isn't installed

* Formatting

---------

Co-authored-by: PhyxionNL <7643972+PhyxionNL@users.noreply.github.com>
2025-09-16 11:58:31 +02:00

79 lines
2.0 KiB
C#

using LibreHardwareMonitor.Hardware;
namespace LibreHardwareMonitor.PawnIo;
public class AmdFamily10
{
private readonly PawnIo _pawnIo = PawnIo.LoadModuleFromResource(typeof(AmdFamily0F).Assembly, $"{nameof(LibreHardwareMonitor)}.Resources.PawnIo.AMDFamily10.bin");
public void MeasureTscMultiplier(out long ctrPerTick, out long cofVid)
{
long[] result = _pawnIo.Execute("ioctl_measure_tsc_multiplier", [], 2);
ctrPerTick = result[0];
cofVid = result[1];
}
public bool HaveCstateResidencyInfo()
{
try
{
ReadCstateResidency();
return true;
}
catch
{
// ignored
}
return false;
}
public byte[] ReadCstateResidency()
{
long[] result = _pawnIo.Execute("ioctl_read_cstate_residency", [], 2);
return [(byte)result[0], (byte)result[1]];
}
public uint ReadMiscCtl(int cpu, uint offset)
{
long[] result = _pawnIo.Execute("ioctl_read_miscctl", [cpu, offset], 1);
return (uint)result[0];
}
public uint ReadSmu(uint offset)
{
long[] result = _pawnIo.Execute("ioctl_read_smu", [offset], 1);
return (uint)result[0];
}
public bool ReadMsr(uint index, out uint eax, out uint edx)
{
long[] inArray = new long[1];
inArray[0] = index;
eax = 0;
edx = 0;
try
{
long[] outArray = _pawnIo.Execute("ioctl_read_msr", inArray, 1);
eax = (uint)outArray[0];
edx = (uint)(outArray[0] >> 32);
}
catch
{
return false;
}
return true;
}
public bool ReadMsr(uint index, out uint eax, out uint edx, GroupAffinity affinity)
{
GroupAffinity previousAffinity = ThreadAffinity.Set(affinity);
bool result = ReadMsr(index, out eax, out edx);
ThreadAffinity.Set(previousAffinity);
return result;
}
public void Close() => _pawnIo.Close();
}