* 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>
79 lines
2.0 KiB
C#
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();
|
|
}
|