diff options
Diffstat (limited to 'include/asm-x86_64')
33 files changed, 305 insertions, 268 deletions
diff --git a/include/asm-x86_64/Kbuild b/include/asm-x86_64/Kbuild index 1ee9b07f3fe6..ebd7117782a6 100644 --- a/include/asm-x86_64/Kbuild +++ b/include/asm-x86_64/Kbuild | |||
@@ -6,13 +6,11 @@ ALTARCHDEF := defined __i386__ | |||
6 | 6 | ||
7 | header-y += boot.h | 7 | header-y += boot.h |
8 | header-y += bootsetup.h | 8 | header-y += bootsetup.h |
9 | header-y += cpufeature.h | ||
10 | header-y += debugreg.h | 9 | header-y += debugreg.h |
11 | header-y += ldt.h | 10 | header-y += ldt.h |
12 | header-y += msr.h | 11 | header-y += msr.h |
13 | header-y += prctl.h | 12 | header-y += prctl.h |
14 | header-y += ptrace-abi.h | 13 | header-y += ptrace-abi.h |
15 | header-y += setup.h | ||
16 | header-y += sigcontext32.h | 14 | header-y += sigcontext32.h |
17 | header-y += ucontext.h | 15 | header-y += ucontext.h |
18 | header-y += vsyscall32.h | 16 | header-y += vsyscall32.h |
diff --git a/include/asm-x86_64/acpi.h b/include/asm-x86_64/acpi.h index ed59aa4c6ff9..9d1916e59c04 100644 --- a/include/asm-x86_64/acpi.h +++ b/include/asm-x86_64/acpi.h | |||
@@ -163,6 +163,7 @@ extern u8 x86_acpiid_to_apicid[]; | |||
163 | #define ARCH_HAS_POWER_INIT 1 | 163 | #define ARCH_HAS_POWER_INIT 1 |
164 | 164 | ||
165 | extern int acpi_skip_timer_override; | 165 | extern int acpi_skip_timer_override; |
166 | extern int acpi_use_timer_override; | ||
166 | 167 | ||
167 | #endif /*__KERNEL__*/ | 168 | #endif /*__KERNEL__*/ |
168 | 169 | ||
diff --git a/include/asm-x86_64/alternative.h b/include/asm-x86_64/alternative.h index a584826cc570..a6657b4f3e0e 100644 --- a/include/asm-x86_64/alternative.h +++ b/include/asm-x86_64/alternative.h | |||
@@ -4,6 +4,7 @@ | |||
4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
5 | 5 | ||
6 | #include <linux/types.h> | 6 | #include <linux/types.h> |
7 | #include <linux/stddef.h> | ||
7 | #include <asm/cpufeature.h> | 8 | #include <asm/cpufeature.h> |
8 | 9 | ||
9 | struct alt_instr { | 10 | struct alt_instr { |
@@ -133,4 +134,15 @@ static inline void alternatives_smp_switch(int smp) {} | |||
133 | #define LOCK_PREFIX "" | 134 | #define LOCK_PREFIX "" |
134 | #endif | 135 | #endif |
135 | 136 | ||
137 | struct paravirt_patch; | ||
138 | #ifdef CONFIG_PARAVIRT | ||
139 | void apply_paravirt(struct paravirt_patch *start, struct paravirt_patch *end); | ||
140 | #else | ||
141 | static inline void | ||
142 | apply_paravirt(struct paravirt_patch *start, struct paravirt_patch *end) | ||
143 | {} | ||
144 | #define __start_parainstructions NULL | ||
145 | #define __stop_parainstructions NULL | ||
146 | #endif | ||
147 | |||
136 | #endif /* _X86_64_ALTERNATIVE_H */ | 148 | #endif /* _X86_64_ALTERNATIVE_H */ |
diff --git a/include/asm-x86_64/atomic.h b/include/asm-x86_64/atomic.h index 007e88d6d43f..706ca4b60000 100644 --- a/include/asm-x86_64/atomic.h +++ b/include/asm-x86_64/atomic.h | |||
@@ -21,7 +21,7 @@ | |||
21 | * on us. We need to use _exactly_ the address the user gave us, | 21 | * on us. We need to use _exactly_ the address the user gave us, |
22 | * not some alias that contains the same information. | 22 | * not some alias that contains the same information. |
23 | */ | 23 | */ |
24 | typedef struct { volatile int counter; } atomic_t; | 24 | typedef struct { int counter; } atomic_t; |
25 | 25 | ||
26 | #define ATOMIC_INIT(i) { (i) } | 26 | #define ATOMIC_INIT(i) { (i) } |
27 | 27 | ||
@@ -189,9 +189,9 @@ static __inline__ int atomic_add_return(int i, atomic_t *v) | |||
189 | { | 189 | { |
190 | int __i = i; | 190 | int __i = i; |
191 | __asm__ __volatile__( | 191 | __asm__ __volatile__( |
192 | LOCK_PREFIX "xaddl %0, %1;" | 192 | LOCK_PREFIX "xaddl %0, %1" |
193 | :"=r"(i) | 193 | :"+r" (i), "+m" (v->counter) |
194 | :"m"(v->counter), "0"(i)); | 194 | : : "memory"); |
195 | return i + __i; | 195 | return i + __i; |
196 | } | 196 | } |
197 | 197 | ||
diff --git a/include/asm-x86_64/calgary.h b/include/asm-x86_64/calgary.h index 6b93f5a3a5c8..7ee900645719 100644 --- a/include/asm-x86_64/calgary.h +++ b/include/asm-x86_64/calgary.h | |||
@@ -51,6 +51,8 @@ struct iommu_table { | |||
51 | #define TCE_TABLE_SIZE_4M 6 | 51 | #define TCE_TABLE_SIZE_4M 6 |
52 | #define TCE_TABLE_SIZE_8M 7 | 52 | #define TCE_TABLE_SIZE_8M 7 |
53 | 53 | ||
54 | extern int use_calgary; | ||
55 | |||
54 | #ifdef CONFIG_CALGARY_IOMMU | 56 | #ifdef CONFIG_CALGARY_IOMMU |
55 | extern int calgary_iommu_init(void); | 57 | extern int calgary_iommu_init(void); |
56 | extern void detect_calgary(void); | 58 | extern void detect_calgary(void); |
diff --git a/include/asm-x86_64/checksum.h b/include/asm-x86_64/checksum.h index 989469e8e0b7..419fe88a0342 100644 --- a/include/asm-x86_64/checksum.h +++ b/include/asm-x86_64/checksum.h | |||
@@ -19,15 +19,16 @@ | |||
19 | * the last step before putting a checksum into a packet. | 19 | * the last step before putting a checksum into a packet. |
20 | * Make sure not to mix with 64bit checksums. | 20 | * Make sure not to mix with 64bit checksums. |
21 | */ | 21 | */ |
22 | static inline unsigned int csum_fold(unsigned int sum) | 22 | static inline __sum16 csum_fold(__wsum sum) |
23 | { | 23 | { |
24 | __asm__( | 24 | __asm__( |
25 | " addl %1,%0\n" | 25 | " addl %1,%0\n" |
26 | " adcl $0xffff,%0" | 26 | " adcl $0xffff,%0" |
27 | : "=r" (sum) | 27 | : "=r" (sum) |
28 | : "r" (sum << 16), "0" (sum & 0xffff0000) | 28 | : "r" ((__force u32)sum << 16), |
29 | "0" ((__force u32)sum & 0xffff0000) | ||
29 | ); | 30 | ); |
30 | return (~sum) >> 16; | 31 | return (__force __sum16)(~(__force u32)sum >> 16); |
31 | } | 32 | } |
32 | 33 | ||
33 | /* | 34 | /* |
@@ -43,7 +44,7 @@ static inline unsigned int csum_fold(unsigned int sum) | |||
43 | * iph: ipv4 header | 44 | * iph: ipv4 header |
44 | * ihl: length of header / 4 | 45 | * ihl: length of header / 4 |
45 | */ | 46 | */ |
46 | static inline unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl) | 47 | static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl) |
47 | { | 48 | { |
48 | unsigned int sum; | 49 | unsigned int sum; |
49 | 50 | ||
@@ -70,7 +71,7 @@ static inline unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl) | |||
70 | : "=r" (sum), "=r" (iph), "=r" (ihl) | 71 | : "=r" (sum), "=r" (iph), "=r" (ihl) |
71 | : "1" (iph), "2" (ihl) | 72 | : "1" (iph), "2" (ihl) |
72 | : "memory"); | 73 | : "memory"); |
73 | return(sum); | 74 | return (__force __sum16)sum; |
74 | } | 75 | } |
75 | 76 | ||
76 | /** | 77 | /** |
@@ -84,16 +85,17 @@ static inline unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl) | |||
84 | * Returns the pseudo header checksum the input data. Result is | 85 | * Returns the pseudo header checksum the input data. Result is |
85 | * 32bit unfolded. | 86 | * 32bit unfolded. |
86 | */ | 87 | */ |
87 | static inline unsigned long | 88 | static inline __wsum |
88 | csum_tcpudp_nofold(unsigned saddr, unsigned daddr, unsigned short len, | 89 | csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len, |
89 | unsigned short proto, unsigned int sum) | 90 | unsigned short proto, __wsum sum) |
90 | { | 91 | { |
91 | asm(" addl %1, %0\n" | 92 | asm(" addl %1, %0\n" |
92 | " adcl %2, %0\n" | 93 | " adcl %2, %0\n" |
93 | " adcl %3, %0\n" | 94 | " adcl %3, %0\n" |
94 | " adcl $0, %0\n" | 95 | " adcl $0, %0\n" |
95 | : "=r" (sum) | 96 | : "=r" (sum) |
96 | : "g" (daddr), "g" (saddr), "g" ((ntohs(len)<<16)+proto*256), "0" (sum)); | 97 | : "g" (daddr), "g" (saddr), |
98 | "g" ((len + proto)<<8), "0" (sum)); | ||
97 | return sum; | 99 | return sum; |
98 | } | 100 | } |
99 | 101 | ||
@@ -109,9 +111,9 @@ csum_tcpudp_nofold(unsigned saddr, unsigned daddr, unsigned short len, | |||
109 | * Returns the 16bit pseudo header checksum the input data already | 111 | * Returns the 16bit pseudo header checksum the input data already |
110 | * complemented and ready to be filled in. | 112 | * complemented and ready to be filled in. |
111 | */ | 113 | */ |
112 | static inline unsigned short int | 114 | static inline __sum16 |
113 | csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, | 115 | csum_tcpudp_magic(__be32 saddr, __be32 daddr, |
114 | unsigned short len, unsigned short proto, unsigned int sum) | 116 | unsigned short len, unsigned short proto, __wsum sum) |
115 | { | 117 | { |
116 | return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum)); | 118 | return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum)); |
117 | } | 119 | } |
@@ -126,25 +128,25 @@ csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, | |||
126 | * Before filling it in it needs to be csum_fold()'ed. | 128 | * Before filling it in it needs to be csum_fold()'ed. |
127 | * buff should be aligned to a 64bit boundary if possible. | 129 | * buff should be aligned to a 64bit boundary if possible. |
128 | */ | 130 | */ |
129 | extern unsigned int csum_partial(const unsigned char *buff, unsigned len, unsigned int sum); | 131 | extern __wsum csum_partial(const void *buff, int len, __wsum sum); |
130 | 132 | ||
131 | #define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER 1 | 133 | #define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER 1 |
132 | #define HAVE_CSUM_COPY_USER 1 | 134 | #define HAVE_CSUM_COPY_USER 1 |
133 | 135 | ||
134 | 136 | ||
135 | /* Do not call this directly. Use the wrappers below */ | 137 | /* Do not call this directly. Use the wrappers below */ |
136 | extern unsigned long csum_partial_copy_generic(const unsigned char *src, const unsigned char *dst, | 138 | extern __wsum csum_partial_copy_generic(const void *src, const void *dst, |
137 | unsigned len, | 139 | int len, |
138 | unsigned sum, | 140 | __wsum sum, |
139 | int *src_err_ptr, int *dst_err_ptr); | 141 | int *src_err_ptr, int *dst_err_ptr); |
140 | 142 | ||
141 | 143 | ||
142 | extern unsigned int csum_partial_copy_from_user(const unsigned char __user *src, unsigned char *dst, | 144 | extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst, |
143 | int len, unsigned int isum, int *errp); | 145 | int len, __wsum isum, int *errp); |
144 | extern unsigned int csum_partial_copy_to_user(const unsigned char *src, unsigned char __user *dst, | 146 | extern __wsum csum_partial_copy_to_user(const void *src, void __user *dst, |
145 | int len, unsigned int isum, int *errp); | 147 | int len, __wsum isum, int *errp); |
146 | extern unsigned int csum_partial_copy_nocheck(const unsigned char *src, unsigned char *dst, int len, | 148 | extern __wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, |
147 | unsigned int sum); | 149 | __wsum sum); |
148 | 150 | ||
149 | /* Old names. To be removed. */ | 151 | /* Old names. To be removed. */ |
150 | #define csum_and_copy_to_user csum_partial_copy_to_user | 152 | #define csum_and_copy_to_user csum_partial_copy_to_user |
@@ -158,7 +160,7 @@ extern unsigned int csum_partial_copy_nocheck(const unsigned char *src, unsigned | |||
158 | * Returns the 16bit folded/inverted checksum of the passed buffer. | 160 | * Returns the 16bit folded/inverted checksum of the passed buffer. |
159 | * Ready to fill in. | 161 | * Ready to fill in. |
160 | */ | 162 | */ |
161 | extern unsigned short ip_compute_csum(unsigned char * buff, int len); | 163 | extern __sum16 ip_compute_csum(const void *buff, int len); |
162 | 164 | ||
163 | /** | 165 | /** |
164 | * csum_ipv6_magic - Compute checksum of an IPv6 pseudo header. | 166 | * csum_ipv6_magic - Compute checksum of an IPv6 pseudo header. |
@@ -176,9 +178,9 @@ extern unsigned short ip_compute_csum(unsigned char * buff, int len); | |||
176 | struct in6_addr; | 178 | struct in6_addr; |
177 | 179 | ||
178 | #define _HAVE_ARCH_IPV6_CSUM 1 | 180 | #define _HAVE_ARCH_IPV6_CSUM 1 |
179 | extern unsigned short | 181 | extern __sum16 |
180 | csum_ipv6_magic(struct in6_addr *saddr, struct in6_addr *daddr, | 182 | csum_ipv6_magic(const struct in6_addr *saddr, const struct in6_addr *daddr, |
181 | __u32 len, unsigned short proto, unsigned int sum); | 183 | __u32 len, unsigned short proto, __wsum sum); |
182 | 184 | ||
183 | static inline unsigned add32_with_carry(unsigned a, unsigned b) | 185 | static inline unsigned add32_with_carry(unsigned a, unsigned b) |
184 | { | 186 | { |
diff --git a/include/asm-x86_64/cpufeature.h b/include/asm-x86_64/cpufeature.h index ee792faaca01..0b3c686139f1 100644 --- a/include/asm-x86_64/cpufeature.h +++ b/include/asm-x86_64/cpufeature.h | |||
@@ -29,7 +29,7 @@ | |||
29 | #define X86_FEATURE_PSE36 (0*32+17) /* 36-bit PSEs */ | 29 | #define X86_FEATURE_PSE36 (0*32+17) /* 36-bit PSEs */ |
30 | #define X86_FEATURE_PN (0*32+18) /* Processor serial number */ | 30 | #define X86_FEATURE_PN (0*32+18) /* Processor serial number */ |
31 | #define X86_FEATURE_CLFLSH (0*32+19) /* Supports the CLFLUSH instruction */ | 31 | #define X86_FEATURE_CLFLSH (0*32+19) /* Supports the CLFLUSH instruction */ |
32 | #define X86_FEATURE_DTES (0*32+21) /* Debug Trace Store */ | 32 | #define X86_FEATURE_DS (0*32+21) /* Debug Store */ |
33 | #define X86_FEATURE_ACPI (0*32+22) /* ACPI via MSR */ | 33 | #define X86_FEATURE_ACPI (0*32+22) /* ACPI via MSR */ |
34 | #define X86_FEATURE_MMX (0*32+23) /* Multimedia Extensions */ | 34 | #define X86_FEATURE_MMX (0*32+23) /* Multimedia Extensions */ |
35 | #define X86_FEATURE_FXSR (0*32+24) /* FXSAVE and FXRSTOR instructions (fast save and restore */ | 35 | #define X86_FEATURE_FXSR (0*32+24) /* FXSAVE and FXRSTOR instructions (fast save and restore */ |
@@ -68,6 +68,8 @@ | |||
68 | #define X86_FEATURE_FXSAVE_LEAK (3*32+7) /* FIP/FOP/FDP leaks through FXSAVE */ | 68 | #define X86_FEATURE_FXSAVE_LEAK (3*32+7) /* FIP/FOP/FDP leaks through FXSAVE */ |
69 | #define X86_FEATURE_UP (3*32+8) /* SMP kernel running on UP */ | 69 | #define X86_FEATURE_UP (3*32+8) /* SMP kernel running on UP */ |
70 | #define X86_FEATURE_ARCH_PERFMON (3*32+9) /* Intel Architectural PerfMon */ | 70 | #define X86_FEATURE_ARCH_PERFMON (3*32+9) /* Intel Architectural PerfMon */ |
71 | #define X86_FEATURE_PEBS (3*32+10) /* Precise-Event Based Sampling */ | ||
72 | #define X86_FEATURE_BTS (3*32+11) /* Branch Trace Store */ | ||
71 | 73 | ||
72 | /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ | 74 | /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ |
73 | #define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ | 75 | #define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ |
@@ -112,5 +114,8 @@ | |||
112 | #define cpu_has_cyrix_arr 0 | 114 | #define cpu_has_cyrix_arr 0 |
113 | #define cpu_has_centaur_mcr 0 | 115 | #define cpu_has_centaur_mcr 0 |
114 | #define cpu_has_clflush boot_cpu_has(X86_FEATURE_CLFLSH) | 116 | #define cpu_has_clflush boot_cpu_has(X86_FEATURE_CLFLSH) |
117 | #define cpu_has_ds boot_cpu_has(X86_FEATURE_DS) | ||
118 | #define cpu_has_pebs boot_cpu_has(X86_FEATURE_PEBS) | ||
119 | #define cpu_has_bts boot_cpu_has(X86_FEATURE_BTS) | ||
115 | 120 | ||
116 | #endif /* __ASM_X8664_CPUFEATURE_H */ | 121 | #endif /* __ASM_X8664_CPUFEATURE_H */ |
diff --git a/include/asm-x86_64/delay.h b/include/asm-x86_64/delay.h index 65f64acc5319..c2669f1f5529 100644 --- a/include/asm-x86_64/delay.h +++ b/include/asm-x86_64/delay.h | |||
@@ -7,18 +7,21 @@ | |||
7 | * Delay routines calling functions in arch/x86_64/lib/delay.c | 7 | * Delay routines calling functions in arch/x86_64/lib/delay.c |
8 | */ | 8 | */ |
9 | 9 | ||
10 | /* Undefined functions to get compile-time errors */ | ||
10 | extern void __bad_udelay(void); | 11 | extern void __bad_udelay(void); |
11 | extern void __bad_ndelay(void); | 12 | extern void __bad_ndelay(void); |
12 | 13 | ||
13 | extern void __udelay(unsigned long usecs); | 14 | extern void __udelay(unsigned long usecs); |
14 | extern void __ndelay(unsigned long usecs); | 15 | extern void __ndelay(unsigned long nsecs); |
15 | extern void __const_udelay(unsigned long usecs); | 16 | extern void __const_udelay(unsigned long usecs); |
16 | extern void __delay(unsigned long loops); | 17 | extern void __delay(unsigned long loops); |
17 | 18 | ||
19 | /* 0x10c7 is 2**32 / 1000000 (rounded up) */ | ||
18 | #define udelay(n) (__builtin_constant_p(n) ? \ | 20 | #define udelay(n) (__builtin_constant_p(n) ? \ |
19 | ((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c6ul)) : \ | 21 | ((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c7ul)) : \ |
20 | __udelay(n)) | 22 | __udelay(n)) |
21 | 23 | ||
24 | /* 0x5 is 2**32 / 1000000000 (rounded up) */ | ||
22 | #define ndelay(n) (__builtin_constant_p(n) ? \ | 25 | #define ndelay(n) (__builtin_constant_p(n) ? \ |
23 | ((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \ | 26 | ((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \ |
24 | __ndelay(n)) | 27 | __ndelay(n)) |
diff --git a/include/asm-x86_64/desc.h b/include/asm-x86_64/desc.h index eb7723a46790..913d6ac00033 100644 --- a/include/asm-x86_64/desc.h +++ b/include/asm-x86_64/desc.h | |||
@@ -9,64 +9,13 @@ | |||
9 | 9 | ||
10 | #include <linux/string.h> | 10 | #include <linux/string.h> |
11 | #include <linux/smp.h> | 11 | #include <linux/smp.h> |
12 | #include <asm/desc_defs.h> | ||
12 | 13 | ||
13 | #include <asm/segment.h> | 14 | #include <asm/segment.h> |
14 | #include <asm/mmu.h> | 15 | #include <asm/mmu.h> |
15 | 16 | ||
16 | // 8 byte segment descriptor | ||
17 | struct desc_struct { | ||
18 | u16 limit0; | ||
19 | u16 base0; | ||
20 | unsigned base1 : 8, type : 4, s : 1, dpl : 2, p : 1; | ||
21 | unsigned limit : 4, avl : 1, l : 1, d : 1, g : 1, base2 : 8; | ||
22 | } __attribute__((packed)); | ||
23 | |||
24 | struct n_desc_struct { | ||
25 | unsigned int a,b; | ||
26 | }; | ||
27 | |||
28 | extern struct desc_struct cpu_gdt_table[GDT_ENTRIES]; | 17 | extern struct desc_struct cpu_gdt_table[GDT_ENTRIES]; |
29 | 18 | ||
30 | enum { | ||
31 | GATE_INTERRUPT = 0xE, | ||
32 | GATE_TRAP = 0xF, | ||
33 | GATE_CALL = 0xC, | ||
34 | }; | ||
35 | |||
36 | // 16byte gate | ||
37 | struct gate_struct { | ||
38 | u16 offset_low; | ||
39 | u16 segment; | ||
40 | unsigned ist : 3, zero0 : 5, type : 5, dpl : 2, p : 1; | ||
41 | u16 offset_middle; | ||
42 | u32 offset_high; | ||
43 | u32 zero1; | ||
44 | } __attribute__((packed)); | ||
45 | |||
46 | #define PTR_LOW(x) ((unsigned long)(x) & 0xFFFF) | ||
47 | #define PTR_MIDDLE(x) (((unsigned long)(x) >> 16) & 0xFFFF) | ||
48 | #define PTR_HIGH(x) ((unsigned long)(x) >> 32) | ||
49 | |||
50 | enum { | ||
51 | DESC_TSS = 0x9, | ||
52 | DESC_LDT = 0x2, | ||
53 | }; | ||
54 | |||
55 | // LDT or TSS descriptor in the GDT. 16 bytes. | ||
56 | struct ldttss_desc { | ||
57 | u16 limit0; | ||
58 | u16 base0; | ||
59 | unsigned base1 : 8, type : 5, dpl : 2, p : 1; | ||
60 | unsigned limit1 : 4, zero0 : 3, g : 1, base2 : 8; | ||
61 | u32 base3; | ||
62 | u32 zero1; | ||
63 | } __attribute__((packed)); | ||
64 | |||
65 | struct desc_ptr { | ||
66 | unsigned short size; | ||
67 | unsigned long address; | ||
68 | } __attribute__((packed)) ; | ||
69 | |||
70 | #define load_TR_desc() asm volatile("ltr %w0"::"r" (GDT_ENTRY_TSS*8)) | 19 | #define load_TR_desc() asm volatile("ltr %w0"::"r" (GDT_ENTRY_TSS*8)) |
71 | #define load_LDT_desc() asm volatile("lldt %w0"::"r" (GDT_ENTRY_LDT*8)) | 20 | #define load_LDT_desc() asm volatile("lldt %w0"::"r" (GDT_ENTRY_LDT*8)) |
72 | #define clear_LDT() asm volatile("lldt %w0"::"r" (0)) | 21 | #define clear_LDT() asm volatile("lldt %w0"::"r" (0)) |
diff --git a/include/asm-x86_64/desc_defs.h b/include/asm-x86_64/desc_defs.h new file mode 100644 index 000000000000..089004070099 --- /dev/null +++ b/include/asm-x86_64/desc_defs.h | |||
@@ -0,0 +1,69 @@ | |||
1 | /* Written 2000 by Andi Kleen */ | ||
2 | #ifndef __ARCH_DESC_DEFS_H | ||
3 | #define __ARCH_DESC_DEFS_H | ||
4 | |||
5 | /* | ||
6 | * Segment descriptor structure definitions, usable from both x86_64 and i386 | ||
7 | * archs. | ||
8 | */ | ||
9 | |||
10 | #ifndef __ASSEMBLY__ | ||
11 | |||
12 | #include <linux/types.h> | ||
13 | |||
14 | // 8 byte segment descriptor | ||
15 | struct desc_struct { | ||
16 | u16 limit0; | ||
17 | u16 base0; | ||
18 | unsigned base1 : 8, type : 4, s : 1, dpl : 2, p : 1; | ||
19 | unsigned limit : 4, avl : 1, l : 1, d : 1, g : 1, base2 : 8; | ||
20 | } __attribute__((packed)); | ||
21 | |||
22 | struct n_desc_struct { | ||
23 | unsigned int a,b; | ||
24 | }; | ||
25 | |||
26 | enum { | ||
27 | GATE_INTERRUPT = 0xE, | ||
28 | GATE_TRAP = 0xF, | ||
29 | GATE_CALL = 0xC, | ||
30 | }; | ||
31 | |||
32 | // 16byte gate | ||
33 | struct gate_struct { | ||
34 | u16 offset_low; | ||
35 | u16 segment; | ||
36 | unsigned ist : 3, zero0 : 5, type : 5, dpl : 2, p : 1; | ||
37 | u16 offset_middle; | ||
38 | u32 offset_high; | ||
39 | u32 zero1; | ||
40 | } __attribute__((packed)); | ||
41 | |||
42 | #define PTR_LOW(x) ((unsigned long)(x) & 0xFFFF) | ||
43 | #define PTR_MIDDLE(x) (((unsigned long)(x) >> 16) & 0xFFFF) | ||
44 | #define PTR_HIGH(x) ((unsigned long)(x) >> 32) | ||
45 | |||
46 | enum { | ||
47 | DESC_TSS = 0x9, | ||
48 | DESC_LDT = 0x2, | ||
49 | }; | ||
50 | |||
51 | // LDT or TSS descriptor in the GDT. 16 bytes. | ||
52 | struct ldttss_desc { | ||
53 | u16 limit0; | ||
54 | u16 base0; | ||
55 | unsigned base1 : 8, type : 5, dpl : 2, p : 1; | ||
56 | unsigned limit1 : 4, zero0 : 3, g : 1, base2 : 8; | ||
57 | u32 base3; | ||
58 | u32 zero1; | ||
59 | } __attribute__((packed)); | ||
60 | |||
61 | struct desc_ptr { | ||
62 | unsigned short size; | ||
63 | unsigned long address; | ||
64 | } __attribute__((packed)) ; | ||
65 | |||
66 | |||
67 | #endif /* !__ASSEMBLY__ */ | ||
68 | |||
69 | #endif | ||
diff --git a/include/asm-x86_64/device.h b/include/asm-x86_64/device.h new file mode 100644 index 000000000000..3afa03f33a36 --- /dev/null +++ b/include/asm-x86_64/device.h | |||
@@ -0,0 +1,15 @@ | |||
1 | /* | ||
2 | * Arch specific extensions to struct device | ||
3 | * | ||
4 | * This file is released under the GPLv2 | ||
5 | */ | ||
6 | #ifndef _ASM_X86_64_DEVICE_H | ||
7 | #define _ASM_X86_64_DEVICE_H | ||
8 | |||
9 | struct dev_archdata { | ||
10 | #ifdef CONFIG_ACPI | ||
11 | void *acpi_handle; | ||
12 | #endif | ||
13 | }; | ||
14 | |||
15 | #endif /* _ASM_X86_64_DEVICE_H */ | ||
diff --git a/include/asm-x86_64/dma-mapping.h b/include/asm-x86_64/dma-mapping.h index 10174b110a5c..be9ec6890723 100644 --- a/include/asm-x86_64/dma-mapping.h +++ b/include/asm-x86_64/dma-mapping.h | |||
@@ -180,12 +180,13 @@ static inline int dma_get_cache_alignment(void) | |||
180 | return boot_cpu_data.x86_clflush_size; | 180 | return boot_cpu_data.x86_clflush_size; |
181 | } | 181 | } |
182 | 182 | ||
183 | #define dma_is_consistent(h) 1 | 183 | #define dma_is_consistent(d, h) 1 |
184 | 184 | ||
185 | extern int dma_set_mask(struct device *dev, u64 mask); | 185 | extern int dma_set_mask(struct device *dev, u64 mask); |
186 | 186 | ||
187 | static inline void | 187 | static inline void |
188 | dma_cache_sync(void *vaddr, size_t size, enum dma_data_direction dir) | 188 | dma_cache_sync(struct device *dev, void *vaddr, size_t size, |
189 | enum dma_data_direction dir) | ||
189 | { | 190 | { |
190 | flush_write_buffers(); | 191 | flush_write_buffers(); |
191 | } | 192 | } |
diff --git a/include/asm-x86_64/elf.h b/include/asm-x86_64/elf.h index a406fcb1e924..6d24ea7c4d9d 100644 --- a/include/asm-x86_64/elf.h +++ b/include/asm-x86_64/elf.h | |||
@@ -45,7 +45,6 @@ typedef struct user_i387_struct elf_fpregset_t; | |||
45 | 45 | ||
46 | #ifdef __KERNEL__ | 46 | #ifdef __KERNEL__ |
47 | #include <asm/processor.h> | 47 | #include <asm/processor.h> |
48 | #include <asm/compat.h> | ||
49 | 48 | ||
50 | /* | 49 | /* |
51 | * This is used to ensure we don't load something for the wrong architecture. | 50 | * This is used to ensure we don't load something for the wrong architecture. |
diff --git a/include/asm-x86_64/futex.h b/include/asm-x86_64/futex.h index 9804bf07b092..5cdfb08013c3 100644 --- a/include/asm-x86_64/futex.h +++ b/include/asm-x86_64/futex.h | |||
@@ -55,7 +55,7 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | |||
55 | if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) | 55 | if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) |
56 | return -EFAULT; | 56 | return -EFAULT; |
57 | 57 | ||
58 | inc_preempt_count(); | 58 | pagefault_disable(); |
59 | 59 | ||
60 | switch (op) { | 60 | switch (op) { |
61 | case FUTEX_OP_SET: | 61 | case FUTEX_OP_SET: |
@@ -78,7 +78,7 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | |||
78 | ret = -ENOSYS; | 78 | ret = -ENOSYS; |
79 | } | 79 | } |
80 | 80 | ||
81 | dec_preempt_count(); | 81 | pagefault_enable(); |
82 | 82 | ||
83 | if (!ret) { | 83 | if (!ret) { |
84 | switch (cmp) { | 84 | switch (cmp) { |
diff --git a/include/asm-x86_64/genapic.h b/include/asm-x86_64/genapic.h index a0e9a4b93484..b80f4bb5f273 100644 --- a/include/asm-x86_64/genapic.h +++ b/include/asm-x86_64/genapic.h | |||
@@ -30,6 +30,6 @@ struct genapic { | |||
30 | }; | 30 | }; |
31 | 31 | ||
32 | 32 | ||
33 | extern struct genapic *genapic; | 33 | extern struct genapic *genapic, *genapic_force, apic_flat; |
34 | 34 | ||
35 | #endif | 35 | #endif |
diff --git a/include/asm-x86_64/io_apic.h b/include/asm-x86_64/io_apic.h index 171ec2dc8c04..561ecbfd4cb5 100644 --- a/include/asm-x86_64/io_apic.h +++ b/include/asm-x86_64/io_apic.h | |||
@@ -12,10 +12,6 @@ | |||
12 | 12 | ||
13 | #define APIC_MISMATCH_DEBUG | 13 | #define APIC_MISMATCH_DEBUG |
14 | 14 | ||
15 | #define IO_APIC_BASE(idx) \ | ||
16 | ((volatile int *)(__fix_to_virt(FIX_IO_APIC_BASE_0 + idx) \ | ||
17 | + (mp_ioapics[idx].mpc_apicaddr & ~PAGE_MASK))) | ||
18 | |||
19 | /* | 15 | /* |
20 | * The structure of the IO-APIC: | 16 | * The structure of the IO-APIC: |
21 | */ | 17 | */ |
@@ -119,36 +115,6 @@ extern struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES]; | |||
119 | /* non-0 if default (table-less) MP configuration */ | 115 | /* non-0 if default (table-less) MP configuration */ |
120 | extern int mpc_default_type; | 116 | extern int mpc_default_type; |
121 | 117 | ||
122 | static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) | ||
123 | { | ||
124 | *IO_APIC_BASE(apic) = reg; | ||
125 | return *(IO_APIC_BASE(apic)+4); | ||
126 | } | ||
127 | |||
128 | static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned int value) | ||
129 | { | ||
130 | *IO_APIC_BASE(apic) = reg; | ||
131 | *(IO_APIC_BASE(apic)+4) = value; | ||
132 | } | ||
133 | |||
134 | /* | ||
135 | * Re-write a value: to be used for read-modify-write | ||
136 | * cycles where the read already set up the index register. | ||
137 | */ | ||
138 | static inline void io_apic_modify(unsigned int apic, unsigned int value) | ||
139 | { | ||
140 | *(IO_APIC_BASE(apic)+4) = value; | ||
141 | } | ||
142 | |||
143 | /* | ||
144 | * Synchronize the IO-APIC and the CPU by doing | ||
145 | * a dummy read from the IO-APIC | ||
146 | */ | ||
147 | static inline void io_apic_sync(unsigned int apic) | ||
148 | { | ||
149 | (void) *(IO_APIC_BASE(apic)+4); | ||
150 | } | ||
151 | |||
152 | /* 1 if "noapic" boot option passed */ | 118 | /* 1 if "noapic" boot option passed */ |
153 | extern int skip_ioapic_setup; | 119 | extern int skip_ioapic_setup; |
154 | 120 | ||
diff --git a/include/asm-x86_64/msr.h b/include/asm-x86_64/msr.h index 37e194169fac..952783d35c7b 100644 --- a/include/asm-x86_64/msr.h +++ b/include/asm-x86_64/msr.h | |||
@@ -169,8 +169,8 @@ static inline unsigned int cpuid_edx(unsigned int op) | |||
169 | #define MSR_LSTAR 0xc0000082 /* long mode SYSCALL target */ | 169 | #define MSR_LSTAR 0xc0000082 /* long mode SYSCALL target */ |
170 | #define MSR_CSTAR 0xc0000083 /* compatibility mode SYSCALL target */ | 170 | #define MSR_CSTAR 0xc0000083 /* compatibility mode SYSCALL target */ |
171 | #define MSR_SYSCALL_MASK 0xc0000084 /* EFLAGS mask for syscall */ | 171 | #define MSR_SYSCALL_MASK 0xc0000084 /* EFLAGS mask for syscall */ |
172 | #define MSR_FS_BASE 0xc0000100 /* 64bit GS base */ | 172 | #define MSR_FS_BASE 0xc0000100 /* 64bit FS base */ |
173 | #define MSR_GS_BASE 0xc0000101 /* 64bit FS base */ | 173 | #define MSR_GS_BASE 0xc0000101 /* 64bit GS base */ |
174 | #define MSR_KERNEL_GS_BASE 0xc0000102 /* SwapGS GS shadow (or USER_GS from kernel) */ | 174 | #define MSR_KERNEL_GS_BASE 0xc0000102 /* SwapGS GS shadow (or USER_GS from kernel) */ |
175 | /* EFER bits: */ | 175 | /* EFER bits: */ |
176 | #define _EFER_SCE 0 /* SYSCALL/SYSRET */ | 176 | #define _EFER_SCE 0 /* SYSCALL/SYSRET */ |
@@ -210,6 +210,10 @@ static inline unsigned int cpuid_edx(unsigned int op) | |||
210 | #define MSR_IA32_LASTINTFROMIP 0x1dd | 210 | #define MSR_IA32_LASTINTFROMIP 0x1dd |
211 | #define MSR_IA32_LASTINTTOIP 0x1de | 211 | #define MSR_IA32_LASTINTTOIP 0x1de |
212 | 212 | ||
213 | #define MSR_IA32_PEBS_ENABLE 0x3f1 | ||
214 | #define MSR_IA32_DS_AREA 0x600 | ||
215 | #define MSR_IA32_PERF_CAPABILITIES 0x345 | ||
216 | |||
213 | #define MSR_MTRRfix64K_00000 0x250 | 217 | #define MSR_MTRRfix64K_00000 0x250 |
214 | #define MSR_MTRRfix16K_80000 0x258 | 218 | #define MSR_MTRRfix16K_80000 0x258 |
215 | #define MSR_MTRRfix16K_A0000 0x259 | 219 | #define MSR_MTRRfix16K_A0000 0x259 |
@@ -407,4 +411,13 @@ static inline unsigned int cpuid_edx(unsigned int op) | |||
407 | #define MSR_P4_U2L_ESCR0 0x3b0 | 411 | #define MSR_P4_U2L_ESCR0 0x3b0 |
408 | #define MSR_P4_U2L_ESCR1 0x3b1 | 412 | #define MSR_P4_U2L_ESCR1 0x3b1 |
409 | 413 | ||
414 | /* Intel Core-based CPU performance counters */ | ||
415 | #define MSR_CORE_PERF_FIXED_CTR0 0x309 | ||
416 | #define MSR_CORE_PERF_FIXED_CTR1 0x30a | ||
417 | #define MSR_CORE_PERF_FIXED_CTR2 0x30b | ||
418 | #define MSR_CORE_PERF_FIXED_CTR_CTRL 0x38d | ||
419 | #define MSR_CORE_PERF_GLOBAL_STATUS 0x38e | ||
420 | #define MSR_CORE_PERF_GLOBAL_CTRL 0x38f | ||
421 | #define MSR_CORE_PERF_GLOBAL_OVF_CTRL 0x390 | ||
422 | |||
410 | #endif | 423 | #endif |
diff --git a/include/asm-x86_64/nmi.h b/include/asm-x86_64/nmi.h index f367d4014b42..72375e7d32a8 100644 --- a/include/asm-x86_64/nmi.h +++ b/include/asm-x86_64/nmi.h | |||
@@ -77,4 +77,7 @@ extern int proc_nmi_enabled(struct ctl_table *, int , struct file *, | |||
77 | 77 | ||
78 | extern int unknown_nmi_panic; | 78 | extern int unknown_nmi_panic; |
79 | 79 | ||
80 | void __trigger_all_cpu_backtrace(void); | ||
81 | #define trigger_all_cpu_backtrace() __trigger_all_cpu_backtrace() | ||
82 | |||
80 | #endif /* ASM_NMI_H */ | 83 | #endif /* ASM_NMI_H */ |
diff --git a/include/asm-x86_64/pci-direct.h b/include/asm-x86_64/pci-direct.h index eba9cb471df3..6823fa4f1afa 100644 --- a/include/asm-x86_64/pci-direct.h +++ b/include/asm-x86_64/pci-direct.h | |||
@@ -10,6 +10,7 @@ extern u32 read_pci_config(u8 bus, u8 slot, u8 func, u8 offset); | |||
10 | extern u8 read_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset); | 10 | extern u8 read_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset); |
11 | extern u16 read_pci_config_16(u8 bus, u8 slot, u8 func, u8 offset); | 11 | extern u16 read_pci_config_16(u8 bus, u8 slot, u8 func, u8 offset); |
12 | extern void write_pci_config(u8 bus, u8 slot, u8 func, u8 offset, u32 val); | 12 | extern void write_pci_config(u8 bus, u8 slot, u8 func, u8 offset, u32 val); |
13 | extern void write_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset, u8 val); | ||
13 | 14 | ||
14 | extern int early_pci_allowed(void); | 15 | extern int early_pci_allowed(void); |
15 | 16 | ||
diff --git a/include/asm-x86_64/pda.h b/include/asm-x86_64/pda.h index 14996d962bac..5642634843c4 100644 --- a/include/asm-x86_64/pda.h +++ b/include/asm-x86_64/pda.h | |||
@@ -109,6 +109,15 @@ extern struct x8664_pda _proxy_pda; | |||
109 | #define sub_pda(field,val) pda_to_op("sub",field,val) | 109 | #define sub_pda(field,val) pda_to_op("sub",field,val) |
110 | #define or_pda(field,val) pda_to_op("or",field,val) | 110 | #define or_pda(field,val) pda_to_op("or",field,val) |
111 | 111 | ||
112 | /* This is not atomic against other CPUs -- CPU preemption needs to be off */ | ||
113 | #define test_and_clear_bit_pda(bit,field) ({ \ | ||
114 | int old__; \ | ||
115 | asm volatile("btr %2,%%gs:%c3\n\tsbbl %0,%0" \ | ||
116 | : "=r" (old__), "+m" (_proxy_pda.field) \ | ||
117 | : "dIr" (bit), "i" (pda_offset(field)) : "memory"); \ | ||
118 | old__; \ | ||
119 | }) | ||
120 | |||
112 | #endif | 121 | #endif |
113 | 122 | ||
114 | #define PDA_STACKOFFSET (5*8) | 123 | #define PDA_STACKOFFSET (5*8) |
diff --git a/include/asm-x86_64/pgtable.h b/include/asm-x86_64/pgtable.h index 0555c1c4d8fa..59901c690a0d 100644 --- a/include/asm-x86_64/pgtable.h +++ b/include/asm-x86_64/pgtable.h | |||
@@ -221,20 +221,19 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long | |||
221 | #define __S110 PAGE_SHARED_EXEC | 221 | #define __S110 PAGE_SHARED_EXEC |
222 | #define __S111 PAGE_SHARED_EXEC | 222 | #define __S111 PAGE_SHARED_EXEC |
223 | 223 | ||
224 | static inline unsigned long pgd_bad(pgd_t pgd) | 224 | static inline unsigned long pgd_bad(pgd_t pgd) |
225 | { | 225 | { |
226 | unsigned long val = pgd_val(pgd); | 226 | return pgd_val(pgd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER); |
227 | val &= ~PTE_MASK; | 227 | } |
228 | val &= ~(_PAGE_USER | _PAGE_DIRTY); | ||
229 | return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED); | ||
230 | } | ||
231 | 228 | ||
232 | static inline unsigned long pud_bad(pud_t pud) | 229 | static inline unsigned long pud_bad(pud_t pud) |
233 | { | 230 | { |
234 | unsigned long val = pud_val(pud); | 231 | return pud_val(pud) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER); |
235 | val &= ~PTE_MASK; | 232 | } |
236 | val &= ~(_PAGE_USER | _PAGE_DIRTY); | 233 | |
237 | return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED); | 234 | static inline unsigned long pmd_bad(pmd_t pmd) |
235 | { | ||
236 | return pmd_val(pmd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER); | ||
238 | } | 237 | } |
239 | 238 | ||
240 | #define pte_none(x) (!pte_val(x)) | 239 | #define pte_none(x) (!pte_val(x)) |
@@ -347,7 +346,6 @@ static inline int pmd_large(pmd_t pte) { | |||
347 | #define pmd_none(x) (!pmd_val(x)) | 346 | #define pmd_none(x) (!pmd_val(x)) |
348 | #define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) | 347 | #define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) |
349 | #define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0) | 348 | #define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0) |
350 | #define pmd_bad(x) ((pmd_val(x) & (~PTE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE ) | ||
351 | #define pfn_pmd(nr,prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val(prot))) | 349 | #define pfn_pmd(nr,prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val(prot))) |
352 | #define pmd_pfn(x) ((pmd_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT) | 350 | #define pmd_pfn(x) ((pmd_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT) |
353 | 351 | ||
diff --git a/include/asm-x86_64/processor.h b/include/asm-x86_64/processor.h index cef17e0f828c..76552d72804c 100644 --- a/include/asm-x86_64/processor.h +++ b/include/asm-x86_64/processor.h | |||
@@ -475,6 +475,14 @@ static inline void __mwait(unsigned long eax, unsigned long ecx) | |||
475 | : :"a" (eax), "c" (ecx)); | 475 | : :"a" (eax), "c" (ecx)); |
476 | } | 476 | } |
477 | 477 | ||
478 | static inline void __sti_mwait(unsigned long eax, unsigned long ecx) | ||
479 | { | ||
480 | /* "mwait %eax,%ecx;" */ | ||
481 | asm volatile( | ||
482 | "sti; .byte 0x0f,0x01,0xc9;" | ||
483 | : :"a" (eax), "c" (ecx)); | ||
484 | } | ||
485 | |||
478 | extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); | 486 | extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx); |
479 | 487 | ||
480 | #define stack_current() \ | 488 | #define stack_current() \ |
diff --git a/include/asm-x86_64/proto.h b/include/asm-x86_64/proto.h index e72cfcdf5344..6d324b838972 100644 --- a/include/asm-x86_64/proto.h +++ b/include/asm-x86_64/proto.h | |||
@@ -61,7 +61,6 @@ extern void numa_initmem_init(unsigned long start_pfn, unsigned long end_pfn); | |||
61 | extern unsigned long numa_free_all_bootmem(void); | 61 | extern unsigned long numa_free_all_bootmem(void); |
62 | 62 | ||
63 | extern void reserve_bootmem_generic(unsigned long phys, unsigned len); | 63 | extern void reserve_bootmem_generic(unsigned long phys, unsigned len); |
64 | extern void free_bootmem_generic(unsigned long phys, unsigned len); | ||
65 | 64 | ||
66 | extern void load_gs_index(unsigned gs); | 65 | extern void load_gs_index(unsigned gs); |
67 | 66 | ||
@@ -88,6 +87,7 @@ extern void syscall32_cpu_init(void); | |||
88 | extern void setup_node_bootmem(int nodeid, unsigned long start, unsigned long end); | 87 | extern void setup_node_bootmem(int nodeid, unsigned long start, unsigned long end); |
89 | 88 | ||
90 | extern void early_quirks(void); | 89 | extern void early_quirks(void); |
90 | extern void quirk_intel_irqbalance(void); | ||
91 | extern void check_efer(void); | 91 | extern void check_efer(void); |
92 | 92 | ||
93 | extern int unhandled_signal(struct task_struct *tsk, int sig); | 93 | extern int unhandled_signal(struct task_struct *tsk, int sig); |
diff --git a/include/asm-x86_64/rio.h b/include/asm-x86_64/rio.h new file mode 100644 index 000000000000..c7350f6d2015 --- /dev/null +++ b/include/asm-x86_64/rio.h | |||
@@ -0,0 +1,74 @@ | |||
1 | /* | ||
2 | * Derived from include/asm-i386/mach-summit/mach_mpparse.h | ||
3 | * and include/asm-i386/mach-default/bios_ebda.h | ||
4 | * | ||
5 | * Author: Laurent Vivier <Laurent.Vivier@bull.net> | ||
6 | */ | ||
7 | |||
8 | #ifndef __ASM_RIO_H | ||
9 | #define __ASM_RIO_H | ||
10 | |||
11 | #define RIO_TABLE_VERSION 3 | ||
12 | |||
13 | struct rio_table_hdr { | ||
14 | u8 version; /* Version number of this data structure */ | ||
15 | u8 num_scal_dev; /* # of Scalability devices */ | ||
16 | u8 num_rio_dev; /* # of RIO I/O devices */ | ||
17 | } __attribute__((packed)); | ||
18 | |||
19 | struct scal_detail { | ||
20 | u8 node_id; /* Scalability Node ID */ | ||
21 | u32 CBAR; /* Address of 1MB register space */ | ||
22 | u8 port0node; /* Node ID port connected to: 0xFF=None */ | ||
23 | u8 port0port; /* Port num port connected to: 0,1,2, or */ | ||
24 | /* 0xFF=None */ | ||
25 | u8 port1node; /* Node ID port connected to: 0xFF = None */ | ||
26 | u8 port1port; /* Port num port connected to: 0,1,2, or */ | ||
27 | /* 0xFF=None */ | ||
28 | u8 port2node; /* Node ID port connected to: 0xFF = None */ | ||
29 | u8 port2port; /* Port num port connected to: 0,1,2, or */ | ||
30 | /* 0xFF=None */ | ||
31 | u8 chassis_num; /* 1 based Chassis number (1 = boot node) */ | ||
32 | } __attribute__((packed)); | ||
33 | |||
34 | struct rio_detail { | ||
35 | u8 node_id; /* RIO Node ID */ | ||
36 | u32 BBAR; /* Address of 1MB register space */ | ||
37 | u8 type; /* Type of device */ | ||
38 | u8 owner_id; /* Node ID of Hurricane that owns this */ | ||
39 | /* node */ | ||
40 | u8 port0node; /* Node ID port connected to: 0xFF=None */ | ||
41 | u8 port0port; /* Port num port connected to: 0,1,2, or */ | ||
42 | /* 0xFF=None */ | ||
43 | u8 port1node; /* Node ID port connected to: 0xFF=None */ | ||
44 | u8 port1port; /* Port num port connected to: 0,1,2, or */ | ||
45 | /* 0xFF=None */ | ||
46 | u8 first_slot; /* Lowest slot number below this Calgary */ | ||
47 | u8 status; /* Bit 0 = 1 : the XAPIC is used */ | ||
48 | /* = 0 : the XAPIC is not used, ie: */ | ||
49 | /* ints fwded to another XAPIC */ | ||
50 | /* Bits1:7 Reserved */ | ||
51 | u8 WP_index; /* instance index - lower ones have */ | ||
52 | /* lower slot numbers/PCI bus numbers */ | ||
53 | u8 chassis_num; /* 1 based Chassis number */ | ||
54 | } __attribute__((packed)); | ||
55 | |||
56 | enum { | ||
57 | HURR_SCALABILTY = 0, /* Hurricane Scalability info */ | ||
58 | HURR_RIOIB = 2, /* Hurricane RIOIB info */ | ||
59 | COMPAT_CALGARY = 4, /* Compatibility Calgary */ | ||
60 | ALT_CALGARY = 5, /* Second Planar Calgary */ | ||
61 | }; | ||
62 | |||
63 | /* | ||
64 | * there is a real-mode segmented pointer pointing to the | ||
65 | * 4K EBDA area at 0x40E. | ||
66 | */ | ||
67 | static inline unsigned long get_bios_ebda(void) | ||
68 | { | ||
69 | unsigned long address = *(unsigned short *)phys_to_virt(0x40EUL); | ||
70 | address <<= 4; | ||
71 | return address; | ||
72 | } | ||
73 | |||
74 | #endif /* __ASM_RIO_H */ | ||
diff --git a/include/asm-x86_64/smp.h b/include/asm-x86_64/smp.h index d6b7c057edba..e17b9ec42e98 100644 --- a/include/asm-x86_64/smp.h +++ b/include/asm-x86_64/smp.h | |||
@@ -82,11 +82,6 @@ extern u8 x86_cpu_to_apicid[NR_CPUS]; /* physical ID */ | |||
82 | extern u8 x86_cpu_to_log_apicid[NR_CPUS]; | 82 | extern u8 x86_cpu_to_log_apicid[NR_CPUS]; |
83 | extern u8 bios_cpu_apicid[]; | 83 | extern u8 bios_cpu_apicid[]; |
84 | 84 | ||
85 | static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask) | ||
86 | { | ||
87 | return cpus_addr(cpumask)[0]; | ||
88 | } | ||
89 | |||
90 | static inline int cpu_present_to_apicid(int mps_cpu) | 85 | static inline int cpu_present_to_apicid(int mps_cpu) |
91 | { | 86 | { |
92 | if (mps_cpu < NR_CPUS) | 87 | if (mps_cpu < NR_CPUS) |
@@ -118,13 +113,6 @@ static __inline int logical_smp_processor_id(void) | |||
118 | #define cpu_physical_id(cpu) x86_cpu_to_apicid[cpu] | 113 | #define cpu_physical_id(cpu) x86_cpu_to_apicid[cpu] |
119 | #else | 114 | #else |
120 | #define cpu_physical_id(cpu) boot_cpu_id | 115 | #define cpu_physical_id(cpu) boot_cpu_id |
121 | static inline int smp_call_function_single(int cpuid, void (*func) (void *info), | ||
122 | void *info, int retry, int wait) | ||
123 | { | ||
124 | /* Disable interrupts here? */ | ||
125 | func(info); | ||
126 | return 0; | ||
127 | } | ||
128 | #endif /* !CONFIG_SMP */ | 116 | #endif /* !CONFIG_SMP */ |
129 | #endif | 117 | #endif |
130 | 118 | ||
diff --git a/include/asm-x86_64/spinlock.h b/include/asm-x86_64/spinlock.h index 05ef097ba55b..88bf981e73cf 100644 --- a/include/asm-x86_64/spinlock.h +++ b/include/asm-x86_64/spinlock.h | |||
@@ -36,7 +36,34 @@ static inline void __raw_spin_lock(raw_spinlock_t *lock) | |||
36 | "2:\t" : "=m" (lock->slock) : : "memory"); | 36 | "2:\t" : "=m" (lock->slock) : : "memory"); |
37 | } | 37 | } |
38 | 38 | ||
39 | #define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock) | 39 | /* |
40 | * Same as __raw_spin_lock, but reenable interrupts during spinning. | ||
41 | */ | ||
42 | #ifndef CONFIG_PROVE_LOCKING | ||
43 | static inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags) | ||
44 | { | ||
45 | asm volatile( | ||
46 | "\n1:\t" | ||
47 | LOCK_PREFIX " ; decl %0\n\t" | ||
48 | "jns 5f\n" | ||
49 | "testl $0x200, %1\n\t" /* interrupts were disabled? */ | ||
50 | "jz 4f\n\t" | ||
51 | "sti\n" | ||
52 | "3:\t" | ||
53 | "rep;nop\n\t" | ||
54 | "cmpl $0, %0\n\t" | ||
55 | "jle 3b\n\t" | ||
56 | "cli\n\t" | ||
57 | "jmp 1b\n" | ||
58 | "4:\t" | ||
59 | "rep;nop\n\t" | ||
60 | "cmpl $0, %0\n\t" | ||
61 | "jg 1b\n\t" | ||
62 | "jmp 4b\n" | ||
63 | "5:\n\t" | ||
64 | : "+m" (lock->slock) : "r" ((unsigned)flags) : "memory"); | ||
65 | } | ||
66 | #endif | ||
40 | 67 | ||
41 | static inline int __raw_spin_trylock(raw_spinlock_t *lock) | 68 | static inline int __raw_spin_trylock(raw_spinlock_t *lock) |
42 | { | 69 | { |
diff --git a/include/asm-x86_64/spinlock_types.h b/include/asm-x86_64/spinlock_types.h index 59efe849f351..4da9345c1500 100644 --- a/include/asm-x86_64/spinlock_types.h +++ b/include/asm-x86_64/spinlock_types.h | |||
@@ -6,13 +6,13 @@ | |||
6 | #endif | 6 | #endif |
7 | 7 | ||
8 | typedef struct { | 8 | typedef struct { |
9 | volatile unsigned int slock; | 9 | unsigned int slock; |
10 | } raw_spinlock_t; | 10 | } raw_spinlock_t; |
11 | 11 | ||
12 | #define __RAW_SPIN_LOCK_UNLOCKED { 1 } | 12 | #define __RAW_SPIN_LOCK_UNLOCKED { 1 } |
13 | 13 | ||
14 | typedef struct { | 14 | typedef struct { |
15 | volatile unsigned int lock; | 15 | unsigned int lock; |
16 | } raw_rwlock_t; | 16 | } raw_rwlock_t; |
17 | 17 | ||
18 | #define __RAW_RW_LOCK_UNLOCKED { RW_LOCK_BIAS } | 18 | #define __RAW_RW_LOCK_UNLOCKED { RW_LOCK_BIAS } |
diff --git a/include/asm-x86_64/stacktrace.h b/include/asm-x86_64/stacktrace.h index 5eb9799bef76..6f0b54594307 100644 --- a/include/asm-x86_64/stacktrace.h +++ b/include/asm-x86_64/stacktrace.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef _ASM_STACKTRACE_H | 1 | #ifndef _ASM_STACKTRACE_H |
2 | #define _ASM_STACKTRACE_H 1 | 2 | #define _ASM_STACKTRACE_H 1 |
3 | 3 | ||
4 | extern int kstack_depth_to_print; | ||
5 | |||
4 | /* Generic stack tracer with callbacks */ | 6 | /* Generic stack tracer with callbacks */ |
5 | 7 | ||
6 | struct stacktrace_ops { | 8 | struct stacktrace_ops { |
diff --git a/include/asm-x86_64/types.h b/include/asm-x86_64/types.h index c86c2e6793e2..2d4491aae281 100644 --- a/include/asm-x86_64/types.h +++ b/include/asm-x86_64/types.h | |||
@@ -48,9 +48,6 @@ typedef unsigned long long u64; | |||
48 | typedef u64 dma64_addr_t; | 48 | typedef u64 dma64_addr_t; |
49 | typedef u64 dma_addr_t; | 49 | typedef u64 dma_addr_t; |
50 | 50 | ||
51 | typedef u64 sector_t; | ||
52 | #define HAVE_SECTOR_T | ||
53 | |||
54 | #endif /* __ASSEMBLY__ */ | 51 | #endif /* __ASSEMBLY__ */ |
55 | 52 | ||
56 | #endif /* __KERNEL__ */ | 53 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-x86_64/uaccess.h b/include/asm-x86_64/uaccess.h index 19f99178fe83..d5dbc87274f8 100644 --- a/include/asm-x86_64/uaccess.h +++ b/include/asm-x86_64/uaccess.h | |||
@@ -6,7 +6,6 @@ | |||
6 | */ | 6 | */ |
7 | #include <linux/compiler.h> | 7 | #include <linux/compiler.h> |
8 | #include <linux/errno.h> | 8 | #include <linux/errno.h> |
9 | #include <linux/sched.h> | ||
10 | #include <linux/prefetch.h> | 9 | #include <linux/prefetch.h> |
11 | #include <asm/page.h> | 10 | #include <asm/page.h> |
12 | 11 | ||
diff --git a/include/asm-x86_64/unistd.h b/include/asm-x86_64/unistd.h index 777288eb7e75..c5f596e71faa 100644 --- a/include/asm-x86_64/unistd.h +++ b/include/asm-x86_64/unistd.h | |||
@@ -622,25 +622,7 @@ __SYSCALL(__NR_move_pages, sys_move_pages) | |||
622 | 622 | ||
623 | #define __NR_syscall_max __NR_move_pages | 623 | #define __NR_syscall_max __NR_move_pages |
624 | 624 | ||
625 | #ifdef __KERNEL__ | ||
626 | #include <linux/err.h> | ||
627 | #endif | ||
628 | |||
629 | #ifndef __NO_STUBS | 625 | #ifndef __NO_STUBS |
630 | |||
631 | /* user-visible error numbers are in the range -1 - -MAX_ERRNO */ | ||
632 | |||
633 | #define __syscall_clobber "r11","rcx","memory" | ||
634 | |||
635 | #define __syscall_return(type, res) \ | ||
636 | do { \ | ||
637 | if ((unsigned long)(res) >= (unsigned long)(-MAX_ERRNO)) { \ | ||
638 | errno = -(res); \ | ||
639 | res = -1; \ | ||
640 | } \ | ||
641 | return (type) (res); \ | ||
642 | } while (0) | ||
643 | |||
644 | #define __ARCH_WANT_OLD_READDIR | 626 | #define __ARCH_WANT_OLD_READDIR |
645 | #define __ARCH_WANT_OLD_STAT | 627 | #define __ARCH_WANT_OLD_STAT |
646 | #define __ARCH_WANT_SYS_ALARM | 628 | #define __ARCH_WANT_SYS_ALARM |
@@ -664,87 +646,6 @@ do { \ | |||
664 | #define __ARCH_WANT_SYS_TIME | 646 | #define __ARCH_WANT_SYS_TIME |
665 | #define __ARCH_WANT_COMPAT_SYS_TIME | 647 | #define __ARCH_WANT_COMPAT_SYS_TIME |
666 | 648 | ||
667 | #define __syscall "syscall" | ||
668 | |||
669 | #define _syscall0(type,name) \ | ||
670 | type name(void) \ | ||
671 | { \ | ||
672 | long __res; \ | ||
673 | __asm__ volatile (__syscall \ | ||
674 | : "=a" (__res) \ | ||
675 | : "0" (__NR_##name) : __syscall_clobber ); \ | ||
676 | __syscall_return(type,__res); \ | ||
677 | } | ||
678 | |||
679 | #define _syscall1(type,name,type1,arg1) \ | ||
680 | type name(type1 arg1) \ | ||
681 | { \ | ||
682 | long __res; \ | ||
683 | __asm__ volatile (__syscall \ | ||
684 | : "=a" (__res) \ | ||
685 | : "0" (__NR_##name),"D" ((long)(arg1)) : __syscall_clobber ); \ | ||
686 | __syscall_return(type,__res); \ | ||
687 | } | ||
688 | |||
689 | #define _syscall2(type,name,type1,arg1,type2,arg2) \ | ||
690 | type name(type1 arg1,type2 arg2) \ | ||
691 | { \ | ||
692 | long __res; \ | ||
693 | __asm__ volatile (__syscall \ | ||
694 | : "=a" (__res) \ | ||
695 | : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)) : __syscall_clobber ); \ | ||
696 | __syscall_return(type,__res); \ | ||
697 | } | ||
698 | |||
699 | #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ | ||
700 | type name(type1 arg1,type2 arg2,type3 arg3) \ | ||
701 | { \ | ||
702 | long __res; \ | ||
703 | __asm__ volatile (__syscall \ | ||
704 | : "=a" (__res) \ | ||
705 | : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \ | ||
706 | "d" ((long)(arg3)) : __syscall_clobber); \ | ||
707 | __syscall_return(type,__res); \ | ||
708 | } | ||
709 | |||
710 | #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ | ||
711 | type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ | ||
712 | { \ | ||
713 | long __res; \ | ||
714 | __asm__ volatile ("movq %5,%%r10 ;" __syscall \ | ||
715 | : "=a" (__res) \ | ||
716 | : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \ | ||
717 | "d" ((long)(arg3)),"g" ((long)(arg4)) : __syscall_clobber,"r10" ); \ | ||
718 | __syscall_return(type,__res); \ | ||
719 | } | ||
720 | |||
721 | #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ | ||
722 | type5,arg5) \ | ||
723 | type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \ | ||
724 | { \ | ||
725 | long __res; \ | ||
726 | __asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; " __syscall \ | ||
727 | : "=a" (__res) \ | ||
728 | : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \ | ||
729 | "d" ((long)(arg3)),"g" ((long)(arg4)),"g" ((long)(arg5)) : \ | ||
730 | __syscall_clobber,"r8","r10" ); \ | ||
731 | __syscall_return(type,__res); \ | ||
732 | } | ||
733 | |||
734 | #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ | ||
735 | type5,arg5,type6,arg6) \ | ||
736 | type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \ | ||
737 | { \ | ||
738 | long __res; \ | ||
739 | __asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; movq %7,%%r9 ; " __syscall \ | ||
740 | : "=a" (__res) \ | ||
741 | : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \ | ||
742 | "d" ((long)(arg3)), "g" ((long)(arg4)), "g" ((long)(arg5)), \ | ||
743 | "g" ((long)(arg6)) : \ | ||
744 | __syscall_clobber,"r8","r10","r9" ); \ | ||
745 | __syscall_return(type,__res); \ | ||
746 | } | ||
747 | |||
748 | #ifdef __KERNEL__ | 649 | #ifdef __KERNEL__ |
749 | #ifndef __ASSEMBLY__ | 650 | #ifndef __ASSEMBLY__ |
750 | 651 | ||
diff --git a/include/asm-x86_64/unwind.h b/include/asm-x86_64/unwind.h index 2e7ff10fd775..2f6349e48717 100644 --- a/include/asm-x86_64/unwind.h +++ b/include/asm-x86_64/unwind.h | |||
@@ -87,14 +87,10 @@ extern int arch_unwind_init_running(struct unwind_frame_info *, | |||
87 | 87 | ||
88 | static inline int arch_unw_user_mode(const struct unwind_frame_info *info) | 88 | static inline int arch_unw_user_mode(const struct unwind_frame_info *info) |
89 | { | 89 | { |
90 | #if 0 /* This can only work when selector register saves/restores | 90 | return user_mode(&info->regs) |
91 | are properly annotated (and tracked in UNW_REGISTER_INFO). */ | 91 | || (long)info->regs.rip >= 0 |
92 | return user_mode(&info->regs); | ||
93 | #else | ||
94 | return (long)info->regs.rip >= 0 | ||
95 | || (info->regs.rip >= VSYSCALL_START && info->regs.rip < VSYSCALL_END) | 92 | || (info->regs.rip >= VSYSCALL_START && info->regs.rip < VSYSCALL_END) |
96 | || (long)info->regs.rsp >= 0; | 93 | || (long)info->regs.rsp >= 0; |
97 | #endif | ||
98 | } | 94 | } |
99 | 95 | ||
100 | #else | 96 | #else |
diff --git a/include/asm-x86_64/vsyscall.h b/include/asm-x86_64/vsyscall.h index fd452fc2c037..05cb8dd200de 100644 --- a/include/asm-x86_64/vsyscall.h +++ b/include/asm-x86_64/vsyscall.h | |||
@@ -10,6 +10,7 @@ enum vsyscall_num { | |||
10 | #define VSYSCALL_START (-10UL << 20) | 10 | #define VSYSCALL_START (-10UL << 20) |
11 | #define VSYSCALL_SIZE 1024 | 11 | #define VSYSCALL_SIZE 1024 |
12 | #define VSYSCALL_END (-2UL << 20) | 12 | #define VSYSCALL_END (-2UL << 20) |
13 | #define VSYSCALL_MAPPED_PAGES 1 | ||
13 | #define VSYSCALL_ADDR(vsyscall_nr) (VSYSCALL_START+VSYSCALL_SIZE*(vsyscall_nr)) | 14 | #define VSYSCALL_ADDR(vsyscall_nr) (VSYSCALL_START+VSYSCALL_SIZE*(vsyscall_nr)) |
14 | 15 | ||
15 | #ifdef __KERNEL__ | 16 | #ifdef __KERNEL__ |
@@ -59,8 +60,6 @@ extern seqlock_t xtime_lock; | |||
59 | 60 | ||
60 | extern int sysctl_vsyscall; | 61 | extern int sysctl_vsyscall; |
61 | 62 | ||
62 | extern void vsyscall_set_cpu(int cpu); | ||
63 | |||
64 | #define ARCH_HAVE_XTIME_LOCK 1 | 63 | #define ARCH_HAVE_XTIME_LOCK 1 |
65 | 64 | ||
66 | #endif /* __KERNEL__ */ | 65 | #endif /* __KERNEL__ */ |