34 lines
916 B
C
34 lines
916 B
C
|
#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))
|
||
|
#endif /* CPU_P6_MSR_H */
|