From bef400b96cbce8a4947f6b147b4030a9422c2b7f Mon Sep 17 00:00:00 2001 From: Stefan Reinauer Date: Wed, 17 Jun 2015 16:11:18 -0700 Subject: x86: Make reading / writing of CRx registers 64bit proof Change-Id: I782007fe9754ec3ae0b5dc31e7865f7e46cfbc74 Signed-off-by: Stefan Reinauer Signed-off-by: Scott Duplichan Reviewed-on: http://review.coreboot.org/10576 Tested-by: build bot (Jenkins) Reviewed-by: Paul Menzel Reviewed-by: Marc Jones --- src/include/cpu/x86/cr.h | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'src/include/cpu') diff --git a/src/include/cpu/x86/cr.h b/src/include/cpu/x86/cr.h index 4d2be3a77a..8f77aec1d3 100644 --- a/src/include/cpu/x86/cr.h +++ b/src/include/cpu/x86/cr.h @@ -32,46 +32,55 @@ #define COMPILER_BARRIER "memory" #endif -static alwaysinline uint32_t read_cr0(void) +#ifdef __x86_64__ +#define CRx_TYPE uint64_t +#define CRx_IN "q" +#define CRx_RET "=q" +#else +#define CRx_TYPE uint32_t +#define CRx_IN "r" +#define CRx_RET "=r" +#endif +static alwaysinline CRx_TYPE read_cr0(void) { - uint32_t value; + CRx_TYPE value; __asm__ __volatile__ ( "mov %%cr0, %0" - : "=r" (value) + : CRx_RET (value) : : COMPILER_BARRIER ); return value; } -static alwaysinline void write_cr0(uint32_t data) +static alwaysinline void write_cr0(CRx_TYPE data) { __asm__ __volatile__ ( "mov %0, %%cr0" : - : "r" (data) + : CRx_IN (data) : COMPILER_BARRIER ); } -static alwaysinline uint32_t read_cr4(void) +static alwaysinline CRx_TYPE read_cr4(void) { - uint32_t value; + CRx_TYPE value; __asm__ __volatile__ ( "mov %%cr4, %0" - : "=r" (value) + : CRx_RET (value) : : COMPILER_BARRIER ); return value; } -static alwaysinline void write_cr4(uint32_t data) +static alwaysinline void write_cr4(CRx_TYPE data) { __asm__ __volatile__ ( "mov %0, %%cr4" : - : "r" (data) + : CRx_IN (data) : COMPILER_BARRIER ); } -- cgit v1.2.3