[PATCH] x86_64 merge: arch + asm
[opensuse:kernel.git] / include / asm-x86_64 / msr.h
1 #ifndef X86_64_MSR_H
2 #define X86_64_MSR_H 1
3 /*
4  * Access to machine-specific registers (available on 586 and better only)
5  * Note: the rd* operations modify the parameters directly (without using
6  * pointer indirection), this allows gcc to optimize better
7  */
8
9 #define rdmsr(msr,val1,val2) \
10        __asm__ __volatile__("rdmsr" \
11                             : "=a" (val1), "=d" (val2) \
12                             : "c" (msr))
13
14
15 #define rdmsrl(msr,val) do { unsigned long a__,b__; \
16        __asm__ __volatile__("rdmsr" \
17                             : "=a" (a__), "=d" (b__) \
18                             : "c" (msr)); \
19        val = a__ | (b__<<32); \
20 } while(0); 
21
22 #define wrmsr(msr,val1,val2) \
23      __asm__ __volatile__("wrmsr" \
24                           : /* no outputs */ \
25                           : "c" (msr), "a" (val1), "d" (val2))
26
27 #define wrmsrl(msr,val) wrmsr(msr,(__u32)((__u64)(val)),((__u64)(val))>>32) 
28
29 /* wrmsrl with exception handling */
30 #define checking_wrmsrl(msr,val) ({ int ret__;                                          \
31         asm volatile("2: wrmsr ; xorl %0,%0\n"                                          \
32                      "1:\n\t"                                                           \
33                      ".section .fixup,\"ax\"\n\t"                                       \
34                      "3:  movl %4,%0 ; jmp 1b\n\t"                                      \
35                      ".previous\n\t"                                                    \
36                      ".section __ex_table,\"a\"\n"                                      \
37                      "   .align 8\n\t"                                                  \
38                      "   .quad  2b,3b\n\t"                                              \
39                      ".previous"                                                        \
40                      : "=a" (ret__)                                                     \
41                      : "c" (msr), "0" ((__u32)val), "d" ((val)>>32), "i" (-EFAULT));    \
42         ret__; })
43
44 #define rdtsc(low,high) \
45      __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))
46
47 #define rdtscl(low) \
48      __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx")
49
50 #define rdtscll(val) \
51      __asm__ __volatile__ ("rdtsc" : "=A" (val))
52
53 #define write_tsc(val1,val2) wrmsr(0x10, val1, val2)
54
55 #define rdpmc(counter,low,high) \
56      __asm__ __volatile__("rdpmc" \
57                           : "=a" (low), "=d" (high) \
58                           : "c" (counter))
59
60
61 /* AMD/K8 specific MSRs */ 
62 #define MSR_EFER 0xc0000080             /* extended feature register */
63 #define MSR_STAR 0xc0000081             /* legacy mode SYSCALL target */
64 #define MSR_LSTAR 0xc0000082            /* long mode SYSCALL target */
65 #define MSR_CSTAR 0xc0000083            /* compatibility mode SYSCALL target */
66 #define MSR_SYSCALL_MASK 0xc0000084     /* EFLAGS mask for syscall */
67 #define MSR_FS_BASE 0xc0000100          /* 64bit GS base */
68 #define MSR_GS_BASE 0xc0000101          /* 64bit FS base */
69 #define MSR_KERNEL_GS_BASE  0xc0000102  /* SwapGS GS shadow (or USER_GS from kernel view) */ 
70
71
72 /* Intel MSRs. Some also available on other CPUs */
73 #define MSR_IA32_PLATFORM_ID    0x17
74
75 #define MSR_IA32_PERFCTR0      0xc1
76 #define MSR_IA32_PERFCTR1      0xc2
77
78 #define MSR_IA32_BBL_CR_CTL        0x119
79
80 #define MSR_IA32_MCG_CAP       0x179
81 #define MSR_IA32_MCG_STATUS        0x17a
82 #define MSR_IA32_MCG_CTL       0x17b
83
84 #define MSR_IA32_EVNTSEL0      0x186
85 #define MSR_IA32_EVNTSEL1      0x187
86
87 #define MSR_IA32_DEBUGCTLMSR       0x1d9
88 #define MSR_IA32_LASTBRANCHFROMIP  0x1db
89 #define MSR_IA32_LASTBRANCHTOIP        0x1dc
90 #define MSR_IA32_LASTINTFROMIP     0x1dd
91 #define MSR_IA32_LASTINTTOIP       0x1de
92
93 #define MSR_IA32_MC0_CTL       0x400
94 #define MSR_IA32_MC0_STATUS        0x401
95 #define MSR_IA32_MC0_ADDR      0x402
96 #define MSR_IA32_MC0_MISC      0x403
97
98 /* K7 MSRs */
99 #define MSR_K7_EVNTSEL0            0xC0010000
100 #define MSR_K7_PERFCTR0            0xC0010004
101
102 /* K6 MSRs */
103 #define MSR_K6_EFER                     0xC0000080
104 #define MSR_K6_STAR                     0xC0000081
105 #define MSR_K6_WHCR                     0xC0000082
106 #define MSR_K6_UWCCR                    0xC0000085
107 #define MSR_K6_PSOR                     0xC0000087
108 #define MSR_K6_PFIR                     0xC0000088
109
110 /* Centaur-Hauls/IDT defined MSRs. */
111 #define MSR_IDT_FCR1                    0x107
112 #define MSR_IDT_FCR2                    0x108
113 #define MSR_IDT_FCR3                    0x109
114 #define MSR_IDT_FCR4                    0x10a
115
116 #define MSR_IDT_MCR0                    0x110
117 #define MSR_IDT_MCR1                    0x111
118 #define MSR_IDT_MCR2                    0x112
119 #define MSR_IDT_MCR3                    0x113
120 #define MSR_IDT_MCR4                    0x114
121 #define MSR_IDT_MCR5                    0x115
122 #define MSR_IDT_MCR6                    0x116
123 #define MSR_IDT_MCR7                    0x117
124 #define MSR_IDT_MCR_CTRL                0x120
125
126 /* VIA Cyrix defined MSRs*/
127 #define MSR_VIA_FCR                     0x1107
128
129 /* Intel defined MSRs. */
130 #define MSR_IA32_P5_MC_ADDR             0
131 #define MSR_IA32_P5_MC_TYPE             1
132 #define MSR_IA32_PLATFORM_ID            0x17
133 #define MSR_IA32_EBL_CR_POWERON         0x2a
134
135 #define MSR_IA32_APICBASE               0x1b
136 #define MSR_IA32_APICBASE_BSP           (1<<8)
137 #define MSR_IA32_APICBASE_ENABLE        (1<<11)
138 #define MSR_IA32_APICBASE_BASE          (0xfffff<<12)
139
140 #endif