summaryrefslogtreecommitdiff
path: root/src/include/cpu
diff options
context:
space:
mode:
authorMichael Niewöhner <foss@mniewoehner.de>2020-10-13 22:58:28 +0200
committerNico Huber <nico.h@gmx.de>2020-10-16 22:20:47 +0000
commit90df9166834f26a7600d089bc2fade0f34fd6681 (patch)
tree19123d60f02b305111e513c262952f0f9a379705 /src/include/cpu
parentd32bb116f063d04e0c5f72e6fd0367d6e542c9fb (diff)
include/cpu/x86: introduce new helper for (un)setting MSRs
msr_set_bit can only set single bits in MSRs and causes mixing of bit positions and bitmasks in the MSR header files. Thus, replace the helper by versions which can unset and set whole MSR bitmasks, just like the "and-or"-helper, but in the way commit 64a6b6c was done (inversion done in the helper). This helps keeping the MSR macros unified in bitmask style. In sum, the three helpers msr_set, msr_unset and msr_unset_and_set get added. The few uses of msr_set_bit have been replaced by the new version, while the used macros have been converted accordingly. Change-Id: Idfe9b66e7cfe78ec295a44a2a193f530349f7689 Signed-off-by: Michael Niewöhner <foss@mniewoehner.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/46354 Reviewed-by: Nico Huber <nico.h@gmx.de> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/include/cpu')
-rw-r--r--src/include/cpu/x86/msr.h49
1 files changed, 36 insertions, 13 deletions
diff --git a/src/include/cpu/x86/msr.h b/src/include/cpu/x86/msr.h
index 3deb133240..058419fd1e 100644
--- a/src/include/cpu/x86/msr.h
+++ b/src/include/cpu/x86/msr.h
@@ -299,23 +299,46 @@ static inline enum mca_err_code_types mca_err_type(msr_t reg)
return MCA_ERRTYPE_UNKNOWN;
}
-/* Helper for setting single MSR bits */
-static inline void msr_set_bit(unsigned int reg, unsigned int bit)
+/**
+ * Helper for (un)setting MSR bitmasks
+ *
+ * @param[in] reg The MSR.
+ * @param[in] unset Bitmask with ones to the bits to unset from the MSR.
+ * @param[in] set Bitmask with ones to the bits to set from the MSR.
+ */
+static inline void msr_unset_and_set(unsigned int reg, uint64_t unset, uint64_t set)
{
- msr_t msr = rdmsr(reg);
-
- if (bit < 32) {
- if (msr.lo & (1 << bit))
- return;
- msr.lo |= 1 << bit;
- } else {
- if (msr.hi & (1 << (bit - 32)))
- return;
- msr.hi |= 1 << (bit - 32);
- }
+ msr_t msr;
+ msr = rdmsr(reg);
+ msr.lo &= (unsigned int)~unset;
+ msr.hi &= (unsigned int)~(unset >> 32);
+ msr.lo |= (unsigned int)set;
+ msr.hi |= (unsigned int)(set >> 32);
wrmsr(reg, msr);
}
+/**
+ * Helper for setting MSR bitmasks
+ *
+ * @param[in] reg The MSR.
+ * @param[in] set Bitmask with ones to the bits to set from the MSR.
+ */
+static inline void msr_set(unsigned int reg, uint64_t set)
+{
+ msr_unset_and_set(reg, 0, set);
+}
+
+/**
+ * Helper for unsetting MSR bitmasks
+ *
+ * @param[in] reg The MSR.
+ * @param[in] unset Bitmask with ones to the bits to unset from the MSR.
+ */
+static inline void msr_unset(unsigned int reg, uint64_t unset)
+{
+ msr_unset_and_set(reg, unset, 0);
+}
+
#endif /* __ASSEMBLER__ */
#endif /* CPU_X86_MSR_H */