Skip to content

Commit 0751abb

Browse files
committed
Added support for the Global\\Access_PCI mutex to synchronize the PCI bus access for reading AMD temperature sensors.
1 parent e82b9d7 commit 0751abb

5 files changed

Lines changed: 128 additions & 72 deletions

File tree

Hardware/CPU/AMD0FCPU.cs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ This Source Code Form is subject to the terms of the Mozilla Public
44
License, v. 2.0. If a copy of the MPL was not distributed with this
55
file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
7-
Copyright (C) 2009-2010 Michael Möller <mmoeller@openhardwaremonitor.org>
7+
Copyright (C) 2009-2020 Michael Möller <mmoeller@openhardwaremonitor.org>
88
Copyright (C) 2010 Paul Werelds <paul@werelds.net>
99
1010
*/
@@ -102,24 +102,29 @@ public override string GetReport() {
102102
public override void Update() {
103103
base.Update();
104104

105-
if (miscellaneousControlAddress != Ring0.InvalidPciAddress) {
106-
for (uint i = 0; i < coreTemperatures.Length; i++) {
107-
if (Ring0.WritePciConfig(
108-
miscellaneousControlAddress, THERMTRIP_STATUS_REGISTER,
109-
i > 0 ? thermSenseCoreSelCPU1 : thermSenseCoreSelCPU0)) {
110-
uint value;
111-
if (Ring0.ReadPciConfig(
112-
miscellaneousControlAddress, THERMTRIP_STATUS_REGISTER,
113-
out value))
114-
{
115-
coreTemperatures[i].Value = ((value >> 16) & 0xFF) +
116-
coreTemperatures[i].Parameters[0].Value;
117-
ActivateSensor(coreTemperatures[i]);
118-
} else {
119-
DeactivateSensor(coreTemperatures[i]);
105+
if (Ring0.WaitPciBusMutex(10)) {
106+
107+
if (miscellaneousControlAddress != Ring0.InvalidPciAddress) {
108+
for (uint i = 0; i < coreTemperatures.Length; i++) {
109+
if (Ring0.WritePciConfig(
110+
miscellaneousControlAddress, THERMTRIP_STATUS_REGISTER,
111+
i > 0 ? thermSenseCoreSelCPU1 : thermSenseCoreSelCPU0)) {
112+
uint value;
113+
if (Ring0.ReadPciConfig(
114+
miscellaneousControlAddress, THERMTRIP_STATUS_REGISTER,
115+
out value))
116+
{
117+
coreTemperatures[i].Value = ((value >> 16) & 0xFF) +
118+
coreTemperatures[i].Parameters[0].Value;
119+
ActivateSensor(coreTemperatures[i]);
120+
} else {
121+
DeactivateSensor(coreTemperatures[i]);
122+
}
120123
}
121124
}
122125
}
126+
127+
Ring0.ReleasePciBusMutex();
123128
}
124129

125130
if (HasTimeStampCounter) {

Hardware/CPU/AMD10CPU.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,11 +311,22 @@ private string ReadFirstLine(Stream stream) {
311311
}
312312

313313
private bool ReadSmuRegister(uint address, out uint value) {
314-
if (!Ring0.WritePciConfig(0, 0xB8, address)) {
314+
if (Ring0.WaitPciBusMutex(10)) {
315+
316+
if (!Ring0.WritePciConfig(0, 0xB8, address)) {
317+
value = 0;
318+
319+
Ring0.ReleasePciBusMutex();
320+
return false;
321+
}
322+
var result = Ring0.ReadPciConfig(0, 0xBC, out value);
323+
324+
Ring0.ReleasePciBusMutex();
325+
return result;
326+
} else {
315327
value = 0;
316328
return false;
317329
}
318-
return Ring0.ReadPciConfig(0, 0xBC, out value);
319330
}
320331

321332
public override void Update() {

Hardware/CPU/AMD17CPU.cs

Lines changed: 59 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -160,19 +160,24 @@ public override string GetReport() {
160160
CultureInfo.InvariantCulture));
161161
r.AppendLine();
162162

163-
r.AppendLine("SMN Registers");
164-
r.AppendLine();
165-
r.AppendLine(" Register Value");
166-
var registers = GetSmnRegisters();
167-
for (int i = 0; i < registers.Count; i++)
168-
if (ReadSmnRegister(registers[i], out uint value)) {
169-
r.Append(" ");
170-
r.Append(registers[i].ToString("X8", CultureInfo.InvariantCulture));
171-
r.Append(" ");
172-
r.Append(value.ToString("X8", CultureInfo.InvariantCulture));
173-
r.AppendLine();
174-
}
175-
r.AppendLine();
163+
if (Ring0.WaitPciBusMutex(100)) {
164+
r.AppendLine("SMN Registers");
165+
r.AppendLine();
166+
r.AppendLine(" Register Value");
167+
var registers = GetSmnRegisters();
168+
169+
for (int i = 0; i < registers.Count; i++)
170+
if (ReadSmnRegister(registers[i], out uint value)) {
171+
r.Append(" ");
172+
r.Append(registers[i].ToString("X8", CultureInfo.InvariantCulture));
173+
r.Append(" ");
174+
r.Append(value.ToString("X8", CultureInfo.InvariantCulture));
175+
r.AppendLine();
176+
}
177+
r.AppendLine();
178+
179+
Ring0.ReleasePciBusMutex();
180+
}
176181

177182
return r.ToString();
178183
}
@@ -195,52 +200,57 @@ private bool ReadSmnRegister(uint address, out uint value) {
195200
public override void Update() {
196201
base.Update();
197202

198-
uint value;
199-
if (ReadSmnRegister(FAMILY_17H_M01H_THM_TCON_TEMP, out value)) {
200-
float temperature = ((value >> 21) & 0x7FF) / 8.0f;
201-
if ((value & FAMILY_17H_M01H_THM_TCON_TEMP_RANGE_SEL) != 0)
202-
temperature -= 49;
203+
if (Ring0.WaitPciBusMutex(10)) {
203204

204-
if (tctlTemperature != null) {
205-
tctlTemperature.Value = temperature +
206-
tctlTemperature.Parameters[0].Value;
207-
ActivateSensor(tctlTemperature);
208-
}
205+
uint value;
206+
if (ReadSmnRegister(FAMILY_17H_M01H_THM_TCON_TEMP, out value)) {
207+
float temperature = ((value >> 21) & 0x7FF) / 8.0f;
208+
if ((value & FAMILY_17H_M01H_THM_TCON_TEMP_RANGE_SEL) != 0)
209+
temperature -= 49;
209210

210-
temperature -= tctlOffset;
211+
if (tctlTemperature != null) {
212+
tctlTemperature.Value = temperature +
213+
tctlTemperature.Parameters[0].Value;
214+
ActivateSensor(tctlTemperature);
215+
}
211216

212-
coreTemperature.Value = temperature +
213-
coreTemperature.Parameters[0].Value;
214-
ActivateSensor(coreTemperature);
215-
}
217+
temperature -= tctlOffset;
218+
219+
coreTemperature.Value = temperature +
220+
coreTemperature.Parameters[0].Value;
221+
ActivateSensor(coreTemperature);
222+
}
216223

217-
float maxTemperature = float.MinValue;
218-
int ccdCount = 0;
219-
float ccdTemperatureSum = 0;
220-
for (uint i = 0; i < ccdTemperatures.Length; i++) {
221-
if (ReadSmnRegister(FAMILY_17H_M70H_CCD_TEMP(i), out value)) {
222-
if ((value & FAMILY_17H_M70H_CCD_TEMP_VALID) == 0)
223-
continue;
224+
float maxTemperature = float.MinValue;
225+
int ccdCount = 0;
226+
float ccdTemperatureSum = 0;
227+
for (uint i = 0; i < ccdTemperatures.Length; i++) {
228+
if (ReadSmnRegister(FAMILY_17H_M70H_CCD_TEMP(i), out value)) {
229+
if ((value & FAMILY_17H_M70H_CCD_TEMP_VALID) == 0)
230+
continue;
224231

225-
float temperature = (value & 0x7FF) / 8.0f - 49;
226-
temperature += ccdTemperatures[i].Parameters[0].Value;
232+
float temperature = (value & 0x7FF) / 8.0f - 49;
233+
temperature += ccdTemperatures[i].Parameters[0].Value;
227234

228-
if (temperature > maxTemperature)
229-
maxTemperature = temperature;
230-
ccdCount++;
231-
ccdTemperatureSum += temperature;
235+
if (temperature > maxTemperature)
236+
maxTemperature = temperature;
237+
ccdCount++;
238+
ccdTemperatureSum += temperature;
232239

233-
ccdTemperatures[i].Value = temperature;
234-
ActivateSensor(ccdTemperatures[i]);
240+
ccdTemperatures[i].Value = temperature;
241+
ActivateSensor(ccdTemperatures[i]);
242+
}
235243
}
236-
}
237244

238-
if (ccdCount > 1) {
239-
ccdMaxTemperature.Value = maxTemperature;
240-
ActivateSensor(ccdMaxTemperature);
245+
if (ccdCount > 1) {
246+
ccdMaxTemperature.Value = maxTemperature;
247+
ActivateSensor(ccdMaxTemperature);
248+
249+
ccdAvgTemperature.Value = ccdTemperatureSum / ccdCount;
250+
ActivateSensor(ccdAvgTemperature);
251+
}
241252

242-
ccdAvgTemperature.Value = ccdTemperatureSum / ccdCount;
243-
ActivateSensor(ccdAvgTemperature);
253+
Ring0.ReleasePciBusMutex();
244254
}
245255

246256
if (energyUnitMultiplier != 0 &&

Hardware/Ring0.cs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ internal static class Ring0 {
2222
private static KernelDriver driver;
2323
private static string fileName;
2424
private static Mutex isaBusMutex;
25+
private static Mutex pciBusMutex;
2526
private static readonly StringBuilder report = new StringBuilder();
2627

2728
private const uint OLS_TYPE = 40000;
@@ -196,12 +197,21 @@ public static void Open() {
196197
if (!driver.IsOpen)
197198
driver = null;
198199

199-
string mutexName = "Global\\Access_ISABUS.HTP.Method";
200+
string isaMutexName = "Global\\Access_ISABUS.HTP.Method";
200201
try {
201-
isaBusMutex = new Mutex(false, mutexName);
202+
isaBusMutex = new Mutex(false, isaMutexName);
202203
} catch (UnauthorizedAccessException) {
203204
try {
204-
isaBusMutex = Mutex.OpenExisting(mutexName, MutexRights.Synchronize);
205+
isaBusMutex = Mutex.OpenExisting(isaMutexName, MutexRights.Synchronize);
206+
} catch { }
207+
}
208+
209+
string pciMutexName = "Global\\Access_PCI";
210+
try {
211+
pciBusMutex = new Mutex(false, pciMutexName);
212+
} catch (UnauthorizedAccessException) {
213+
try {
214+
pciBusMutex = Mutex.OpenExisting(pciMutexName, MutexRights.Synchronize);
205215
} catch { }
206216
}
207217
}
@@ -229,6 +239,11 @@ public static void Close() {
229239
isaBusMutex = null;
230240
}
231241

242+
if (pciBusMutex != null) {
243+
pciBusMutex.Close();
244+
pciBusMutex = null;
245+
}
246+
232247
// try to delete temporary driver file again if failed during open
233248
if (fileName != null && File.Exists(fileName)) {
234249
try {
@@ -266,6 +281,21 @@ public static void ReleaseIsaBusMutex() {
266281
isaBusMutex.ReleaseMutex();
267282
}
268283

284+
public static bool WaitPciBusMutex(int millisecondsTimeout) {
285+
if (pciBusMutex == null)
286+
return true;
287+
try {
288+
return pciBusMutex.WaitOne(millisecondsTimeout, false);
289+
} catch (AbandonedMutexException) { return true; }
290+
catch (InvalidOperationException) { return false; }
291+
}
292+
293+
public static void ReleasePciBusMutex() {
294+
if (pciBusMutex == null)
295+
return;
296+
pciBusMutex.ReleaseMutex();
297+
}
298+
269299
public static bool Rdmsr(uint index, out uint eax, out uint edx) {
270300
if (driver == null) {
271301
eax = 0;

Properties/AssemblyVersion.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ This Source Code Form is subject to the terms of the Mozilla Public
1010

1111
using System.Reflection;
1212

13-
[assembly: AssemblyVersion("0.9.3.3")]
14-
[assembly: AssemblyInformationalVersion("0.9.3.3 Alpha")]
13+
[assembly: AssemblyVersion("0.9.3.4")]
14+
[assembly: AssemblyInformationalVersion("0.9.3.4 Alpha")]

0 commit comments

Comments
 (0)