From 407e00dca06e36d2d9b11f998a278109ff330783 Mon Sep 17 00:00:00 2001 From: Arthur Heymans Date: Wed, 19 Oct 2022 20:06:42 +0200 Subject: include/cpu/msr.h: transform into an union This makes it easier to get the content of an msr into a full 64bit variable. Change-Id: I1b026cd3807fd68d805051a74b3d31fcde1c5626 Signed-off-by: Arthur Heymans Reviewed-on: https://review.coreboot.org/c/coreboot/+/68572 Reviewed-by: Raul Rangel Tested-by: build bot (Jenkins) Reviewed-by: Angel Pons --- src/include/cpu/x86/msr.h | 13 ++++--------- src/include/cpu/x86/msr_access.h | 10 +++++++--- 2 files changed, 11 insertions(+), 12 deletions(-) (limited to 'src/include/cpu/x86') 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 -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); -- cgit v1.2.3