Index: tools/telemetry/telemetry/core/platform/power_monitor/msr_power_monitor.py |
diff --git a/tools/telemetry/telemetry/core/platform/power_monitor/msr_power_monitor.py b/tools/telemetry/telemetry/core/platform/power_monitor/msr_power_monitor.py |
index cf100174e197d2d60870851cde792e4d03d06154..c4ecd8547815e6f3c9c536a3935c2b9841e67b70 100644 |
--- a/tools/telemetry/telemetry/core/platform/power_monitor/msr_power_monitor.py |
+++ b/tools/telemetry/telemetry/core/platform/power_monitor/msr_power_monitor.py |
@@ -78,8 +78,9 @@ class MsrPowerMonitor(power_monitor.PowerMonitor): |
energy_consumption_j = self._PackageEnergyJoules() - self._start_energy_j |
average_temp_c = (self._TemperatureCelsius() + self._start_temp_c) / 2. |
- assert energy_consumption_j >= 0, ('Negative energy consumption. (Starting ' |
- 'energy was %s.)' % self._start_energy_j) |
+ if energy_consumption_j < 0: # Correct overflow. |
+ # The energy portion of the MSR is 4 bytes. |
+ energy_consumption_j += 2 ** 32 * self._EnergyMultiplier() |
self._start_energy_j = None |
self._start_temp_c = None |
@@ -96,19 +97,18 @@ class MsrPowerMonitor(power_monitor.PowerMonitor): |
@decorators.Cache |
def _EnergyMultiplier(self): |
- return 0.5 ** ((self._backend.ReadMsr(MSR_RAPL_POWER_UNIT) >> 8) & 0x1f) |
+ return 0.5 ** self._backend.ReadMsr(MSR_RAPL_POWER_UNIT, 8, 5) |
def _PackageEnergyJoules(self): |
- return (self._backend.ReadMsr(MSR_PKG_ENERGY_STATUS) * |
+ return (self._backend.ReadMsr(MSR_PKG_ENERGY_STATUS, 0, 32) * |
self._EnergyMultiplier()) |
def _TemperatureCelsius(self): |
- tcc_activation_temp = ( |
- self._backend.ReadMsr(IA32_TEMPERATURE_TARGET) >> 16 & 0x7f) |
+ tcc_activation_temp = self._backend.ReadMsr(IA32_TEMPERATURE_TARGET, 16, 7) |
if tcc_activation_temp <= 0: |
tcc_activation_temp = 105 |
- package_temp_headroom = ( |
- self._backend.ReadMsr(IA32_PACKAGE_THERM_STATUS) >> 16 & 0x7f) |
+ package_temp_headroom = self._backend.ReadMsr( |
+ IA32_PACKAGE_THERM_STATUS, 16, 7) |
return tcc_activation_temp - package_temp_headroom |
def _CheckMSRs(self): |