x86: Make reading / writing of CRx registers 64bit proof

Change-Id: I782007fe9754ec3ae0b5dc31e7865f7e46cfbc74
Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Signed-off-by: Scott Duplichan <scott@notabs.org>
Reviewed-on: http://review.coreboot.org/10576
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Marc Jones <marc.jones@se-eng.com>
This commit is contained in:
Stefan Reinauer 2015-06-17 16:11:18 -07:00
parent 7c35af2bc3
commit bef400b96c

View file

@ -32,46 +32,55 @@
#define COMPILER_BARRIER "memory" #define COMPILER_BARRIER "memory"
#endif #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__ ( __asm__ __volatile__ (
"mov %%cr0, %0" "mov %%cr0, %0"
: "=r" (value) : CRx_RET (value)
: :
: COMPILER_BARRIER : COMPILER_BARRIER
); );
return value; return value;
} }
static alwaysinline void write_cr0(uint32_t data) static alwaysinline void write_cr0(CRx_TYPE data)
{ {
__asm__ __volatile__ ( __asm__ __volatile__ (
"mov %0, %%cr0" "mov %0, %%cr0"
: :
: "r" (data) : CRx_IN (data)
: COMPILER_BARRIER : COMPILER_BARRIER
); );
} }
static alwaysinline uint32_t read_cr4(void) static alwaysinline CRx_TYPE read_cr4(void)
{ {
uint32_t value; CRx_TYPE value;
__asm__ __volatile__ ( __asm__ __volatile__ (
"mov %%cr4, %0" "mov %%cr4, %0"
: "=r" (value) : CRx_RET (value)
: :
: COMPILER_BARRIER : COMPILER_BARRIER
); );
return value; return value;
} }
static alwaysinline void write_cr4(uint32_t data) static alwaysinline void write_cr4(CRx_TYPE data)
{ {
__asm__ __volatile__ ( __asm__ __volatile__ (
"mov %0, %%cr4" "mov %0, %%cr4"
: :
: "r" (data) : CRx_IN (data)
: COMPILER_BARRIER : COMPILER_BARRIER
); );
} }