From 9b4336cf418d22551bea09d93e1cee79281b110e Mon Sep 17 00:00:00 2001 From: Eric Biederman Date: Sat, 19 Jul 2003 04:28:22 +0000 Subject: - Major cleanup of the bootpath - Changes to allow more code to be compiled both ways - Working SMP support git-svn-id: svn://svn.coreboot.org/coreboot/trunk@987 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- src/include/cpu/p6/msr.h | 126 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 97 insertions(+), 29 deletions(-) (limited to 'src/include/cpu/p6/msr.h') diff --git a/src/include/cpu/p6/msr.h b/src/include/cpu/p6/msr.h index 4977b0201d..d7632ba6de 100644 --- a/src/include/cpu/p6/msr.h +++ b/src/include/cpu/p6/msr.h @@ -1,33 +1,101 @@ #ifndef CPU_P6_MSR_H #define CPU_P6_MSR_H -/* - * Access to machine-specific registers (available on 586 and better only) - * Note: the rd* operations modify the parameters directly (without using - * pointer indirection), this allows gcc to optimize better - */ - -#define rdmsr(msr,val1,val2) \ - __asm__ __volatile__("rdmsr" \ - : "=a" (val1), "=d" (val2) \ - : "c" (msr)) - -#define wrmsr(msr,val1,val2) \ - __asm__ __volatile__("wrmsr" \ - : /* no outputs */ \ - : "c" (msr), "a" (val1), "d" (val2)) - -#define rdtsc(low,high) \ - __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)) - -#define rdtscl(low) \ - __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") - -#define rdtscll(val) \ - __asm__ __volatile__ ("rdtsc" : "=A" (val)) - -#define rdpmc(counter,low,high) \ - __asm__ __volatile__("rdpmc" \ - : "=a" (low), "=d" (high) \ - : "c" (counter)) + +#ifdef __ROMCC__ + +typedef __builtin_msr_t msr_t; + +static msr_t rdmsr(unsigned long index) +{ + return __builtin_rdmsr(index); +} + +static void wrmsr(unsigned long index, msr_t msr) +{ + __builtin_wrmsr(index, msr.lo, msr.hi); +} + + +struct tsc_struct { + unsigned lo; + unsigned hi; +}; +typedef struct tsc_struct tsc_t; + +static tsc_t rdtsc(void) +{ + tsc_t res; + asm ("rdtsc" + : "=a" (res.lo), "=d"(res.hi) /* outputs */ + : /* inputs */ + : /* Clobbers */ + ); + return res; +} +#endif + +#ifdef __GNUC__ + +typedef struct msr_struct +{ + unsigned lo; + unsigned hi; +} msr_t; + +static inline msr_t rdmsr(unsigned index) +{ + msr_t result; + __asm__ __volatile__ ( + "rdmsr" + : "=a" (result.lo), "=d" (result.hi) + : "c" (index) + ); + return result; +} + +static inline void wrmsr(unsigned index, msr_t msr) +{ + __asm__ __volatile__ ( + "wrmsr" + : /* No outputs */ + : "c" (index), "a" (msr.lo), "d" (msr.hi) + ); +} + +typedef struct tsc_struct +{ + unsigned lo; + unsigned hi; +} tsc_t; + +static inline tsc_t rdtsc(void) +{ + tsc_t result; + __asm__ __volatile__( + "rdtsc" + : "=a" (result.lo), "=d" (result.hi) + ); + return result; +} + +typedef struct pmc_struct +{ + unsigned lo; + unsigned hi; +} pmc_t; + +static inline pmc_t rdpmc(unsigned counter) +{ + pmc_t result; + __asm__ __volatile__( + "rdpmc" + : "=a" (result.lo), "=d" (result.hi) + : "c" (counter) + ); + return result; +} + +#endif + #endif /* CPU_P6_MSR_H */ -- cgit v1.2.3