summaryrefslogtreecommitdiff
path: root/src/include/cpu/x86
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/cpu/x86')
-rw-r--r--src/include/cpu/x86/msr.h13
-rw-r--r--src/include/cpu/x86/msr_access.h10
2 files changed, 11 insertions, 12 deletions
diff --git a/src/include/cpu/x86/msr.h b/src/include/cpu/x86/msr.h
index f4e39859cf..33eb457f1a 100644
--- a/src/include/cpu/x86/msr.h
+++ b/src/include/cpu/x86/msr.h
@@ -285,7 +285,7 @@ static inline enum mca_err_code_types mca_err_type(msr_t reg)
static inline uint64_t msr_read(unsigned int reg)
{
msr_t msr = rdmsr(reg);
- return (((uint64_t)msr.hi << 32) | msr.lo);
+ return msr.raw;
}
/**
@@ -296,10 +296,7 @@ static inline uint64_t msr_read(unsigned int reg)
*/
static inline void msr_write(unsigned int reg, uint64_t value)
{
- msr_t msr = {
- .lo = (unsigned int)value,
- .hi = (unsigned int)(value >> 32)
- };
+ msr_t msr = { .raw = value };
wrmsr(reg, msr);
}
@@ -315,10 +312,8 @@ static inline void msr_unset_and_set(unsigned int reg, uint64_t unset, uint64_t
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);
+ msr.raw &= ~unset;
+ msr.raw |= set;
wrmsr(reg, msr);
}
diff --git a/src/include/cpu/x86/msr_access.h b/src/include/cpu/x86/msr_access.h
index a7f72fd077..33029cc653 100644
--- a/src/include/cpu/x86/msr_access.h
+++ b/src/include/cpu/x86/msr_access.h
@@ -6,10 +6,14 @@
#ifndef __ASSEMBLER__
#include <types.h>
-typedef struct msr_struct {
- unsigned int lo;
- unsigned int hi;
+typedef union msr_union {
+ struct {
+ unsigned int lo;
+ unsigned int hi;
+ };
+ uint64_t raw;
} msr_t;
+_Static_assert(sizeof(msr_t) == sizeof(uint64_t), "Incorrect size for msr_t");
#if CONFIG(SOC_SETS_MSRS)
msr_t soc_msr_read(unsigned int index);