Skip to content

Commit f05e798

Browse files
committed
Disintegrate asm/system.h for X86
Disintegrate asm/system.h for X86. Signed-off-by: David Howells <[email protected]> Acked-by: H. Peter Anvin <[email protected]> cc: [email protected]
1 parent 778aae8 commit f05e798

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+554
-562
lines changed

arch/x86/ia32/ia32_aout.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
#include <linux/init.h>
2727
#include <linux/jiffies.h>
2828

29-
#include <asm/system.h>
3029
#include <asm/uaccess.h>
3130
#include <asm/pgalloc.h>
3231
#include <asm/cacheflush.h>

arch/x86/include/asm/apic.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
#include <linux/atomic.h>
1212
#include <asm/fixmap.h>
1313
#include <asm/mpspec.h>
14-
#include <asm/system.h>
1514
#include <asm/msr.h>
1615

1716
#define ARCH_APICTIMER_STOPS_ON_C3 1

arch/x86/include/asm/auxvec.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,11 @@
99
#endif
1010
#define AT_SYSINFO_EHDR 33
1111

12+
/* entries in ARCH_DLINFO: */
13+
#if defined(CONFIG_IA32_EMULATION) || !defined(CONFIG_X86_64)
14+
# define AT_VECTOR_SIZE_ARCH 2
15+
#else /* else it's non-compat x86-64 */
16+
# define AT_VECTOR_SIZE_ARCH 1
17+
#endif
18+
1219
#endif /* _ASM_X86_AUXVEC_H */

arch/x86/include/asm/barrier.h

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
#ifndef _ASM_X86_BARRIER_H
2+
#define _ASM_X86_BARRIER_H
3+
4+
#include <asm/alternative.h>
5+
#include <asm/nops.h>
6+
7+
/*
8+
* Force strict CPU ordering.
9+
* And yes, this is required on UP too when we're talking
10+
* to devices.
11+
*/
12+
13+
#ifdef CONFIG_X86_32
14+
/*
15+
* Some non-Intel clones support out of order store. wmb() ceases to be a
16+
* nop for these.
17+
*/
18+
#define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2)
19+
#define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2)
20+
#define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM)
21+
#else
22+
#define mb() asm volatile("mfence":::"memory")
23+
#define rmb() asm volatile("lfence":::"memory")
24+
#define wmb() asm volatile("sfence" ::: "memory")
25+
#endif
26+
27+
/**
28+
* read_barrier_depends - Flush all pending reads that subsequents reads
29+
* depend on.
30+
*
31+
* No data-dependent reads from memory-like regions are ever reordered
32+
* over this barrier. All reads preceding this primitive are guaranteed
33+
* to access memory (but not necessarily other CPUs' caches) before any
34+
* reads following this primitive that depend on the data return by
35+
* any of the preceding reads. This primitive is much lighter weight than
36+
* rmb() on most CPUs, and is never heavier weight than is
37+
* rmb().
38+
*
39+
* These ordering constraints are respected by both the local CPU
40+
* and the compiler.
41+
*
42+
* Ordering is not guaranteed by anything other than these primitives,
43+
* not even by data dependencies. See the documentation for
44+
* memory_barrier() for examples and URLs to more information.
45+
*
46+
* For example, the following code would force ordering (the initial
47+
* value of "a" is zero, "b" is one, and "p" is "&a"):
48+
*
49+
* <programlisting>
50+
* CPU 0 CPU 1
51+
*
52+
* b = 2;
53+
* memory_barrier();
54+
* p = &b; q = p;
55+
* read_barrier_depends();
56+
* d = *q;
57+
* </programlisting>
58+
*
59+
* because the read of "*q" depends on the read of "p" and these
60+
* two reads are separated by a read_barrier_depends(). However,
61+
* the following code, with the same initial values for "a" and "b":
62+
*
63+
* <programlisting>
64+
* CPU 0 CPU 1
65+
*
66+
* a = 2;
67+
* memory_barrier();
68+
* b = 3; y = b;
69+
* read_barrier_depends();
70+
* x = a;
71+
* </programlisting>
72+
*
73+
* does not enforce ordering, since there is no data dependency between
74+
* the read of "a" and the read of "b". Therefore, on some CPUs, such
75+
* as Alpha, "y" could be set to 3 and "x" to 0. Use rmb()
76+
* in cases like this where there are no data dependencies.
77+
**/
78+
79+
#define read_barrier_depends() do { } while (0)
80+
81+
#ifdef CONFIG_SMP
82+
#define smp_mb() mb()
83+
#ifdef CONFIG_X86_PPRO_FENCE
84+
# define smp_rmb() rmb()
85+
#else
86+
# define smp_rmb() barrier()
87+
#endif
88+
#ifdef CONFIG_X86_OOSTORE
89+
# define smp_wmb() wmb()
90+
#else
91+
# define smp_wmb() barrier()
92+
#endif
93+
#define smp_read_barrier_depends() read_barrier_depends()
94+
#define set_mb(var, value) do { (void)xchg(&var, value); } while (0)
95+
#else
96+
#define smp_mb() barrier()
97+
#define smp_rmb() barrier()
98+
#define smp_wmb() barrier()
99+
#define smp_read_barrier_depends() do { } while (0)
100+
#define set_mb(var, value) do { var = value; barrier(); } while (0)
101+
#endif
102+
103+
/*
104+
* Stop RDTSC speculation. This is needed when you need to use RDTSC
105+
* (or get_cycles or vread that possibly accesses the TSC) in a defined
106+
* code region.
107+
*
108+
* (Could use an alternative three way for this if there was one.)
109+
*/
110+
static __always_inline void rdtsc_barrier(void)
111+
{
112+
alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC);
113+
alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC);
114+
}
115+
116+
#endif /* _ASM_X86_BARRIER_H */

arch/x86/include/asm/bug.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,8 @@ do { \
3636
#endif /* !CONFIG_BUG */
3737

3838
#include <asm-generic/bug.h>
39+
40+
41+
extern void show_regs_common(void);
42+
3943
#endif /* _ASM_X86_BUG_H */

arch/x86/include/asm/cacheflush.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
/* Caches aren't brain-dead on the intel. */
55
#include <asm-generic/cacheflush.h>
6+
#include <asm/special_insns.h>
67

78
#ifdef CONFIG_X86_PAT
89
/*

arch/x86/include/asm/elf.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ extern unsigned int vdso_enabled;
8484
(((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))
8585

8686
#include <asm/processor.h>
87-
#include <asm/system.h>
8887

8988
#ifdef CONFIG_X86_32
9089
#include <asm/desc.h>

arch/x86/include/asm/exec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/* define arch_align_stack() here */

arch/x86/include/asm/futex.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#include <asm/asm.h>
1010
#include <asm/errno.h>
1111
#include <asm/processor.h>
12-
#include <asm/system.h>
1312

1413
#define __futex_atomic_op1(insn, ret, oldval, uaddr, oparg) \
1514
asm volatile("1:\t" insn "\n" \

arch/x86/include/asm/i387.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
#include <linux/sched.h>
1616
#include <linux/hardirq.h>
17-
#include <asm/system.h>
1817

1918
struct pt_regs;
2019
struct user_i387_struct;

arch/x86/include/asm/local.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
#include <linux/percpu.h>
55

6-
#include <asm/system.h>
76
#include <linux/atomic.h>
87
#include <asm/asm.h>
98

arch/x86/include/asm/mc146818rtc.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#define _ASM_X86_MC146818RTC_H
66

77
#include <asm/io.h>
8-
#include <asm/system.h>
98
#include <asm/processor.h>
109
#include <linux/mc146818rtc.h>
1110

arch/x86/include/asm/processor.h

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ struct mm_struct;
1414
#include <asm/sigcontext.h>
1515
#include <asm/current.h>
1616
#include <asm/cpufeature.h>
17-
#include <asm/system.h>
1817
#include <asm/page.h>
1918
#include <asm/pgtable_types.h>
2019
#include <asm/percpu.h>
2120
#include <asm/msr.h>
2221
#include <asm/desc_defs.h>
2322
#include <asm/nops.h>
23+
#include <asm/special_insns.h>
2424

2525
#include <linux/personality.h>
2626
#include <linux/cpumask.h>
@@ -29,6 +29,15 @@ struct mm_struct;
2929
#include <linux/math64.h>
3030
#include <linux/init.h>
3131
#include <linux/err.h>
32+
#include <linux/irqflags.h>
33+
34+
/*
35+
* We handle most unaligned accesses in hardware. On the other hand
36+
* unaligned DMA can be quite expensive on some Nehalem processors.
37+
*
38+
* Based on this we disable the IP header alignment in network drivers.
39+
*/
40+
#define NET_IP_ALIGN 0
3241

3342
#define HBP_NUM 4
3443
/*
@@ -1022,4 +1031,24 @@ extern bool cpu_has_amd_erratum(const int *);
10221031
#define cpu_has_amd_erratum(x) (false)
10231032
#endif /* CONFIG_CPU_SUP_AMD */
10241033

1034+
#ifdef CONFIG_X86_32
1035+
/*
1036+
* disable hlt during certain critical i/o operations
1037+
*/
1038+
#define HAVE_DISABLE_HLT
1039+
#endif
1040+
1041+
void disable_hlt(void);
1042+
void enable_hlt(void);
1043+
1044+
void cpu_idle_wait(void);
1045+
1046+
extern unsigned long arch_align_stack(unsigned long sp);
1047+
extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
1048+
1049+
void default_idle(void);
1050+
bool set_pm_idle_to_default(void);
1051+
1052+
void stop_this_cpu(void *dummy);
1053+
10251054
#endif /* _ASM_X86_PROCESSOR_H */

arch/x86/include/asm/segment.h

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,61 @@
212212
#ifdef __KERNEL__
213213
#ifndef __ASSEMBLY__
214214
extern const char early_idt_handlers[NUM_EXCEPTION_VECTORS][10];
215-
#endif
216-
#endif
215+
216+
/*
217+
* Load a segment. Fall back on loading the zero
218+
* segment if something goes wrong..
219+
*/
220+
#define loadsegment(seg, value) \
221+
do { \
222+
unsigned short __val = (value); \
223+
\
224+
asm volatile(" \n" \
225+
"1: movl %k0,%%" #seg " \n" \
226+
\
227+
".section .fixup,\"ax\" \n" \
228+
"2: xorl %k0,%k0 \n" \
229+
" jmp 1b \n" \
230+
".previous \n" \
231+
\
232+
_ASM_EXTABLE(1b, 2b) \
233+
\
234+
: "+r" (__val) : : "memory"); \
235+
} while (0)
236+
237+
/*
238+
* Save a segment register away
239+
*/
240+
#define savesegment(seg, value) \
241+
asm("mov %%" #seg ",%0":"=r" (value) : : "memory")
242+
243+
/*
244+
* x86_32 user gs accessors.
245+
*/
246+
#ifdef CONFIG_X86_32
247+
#ifdef CONFIG_X86_32_LAZY_GS
248+
#define get_user_gs(regs) (u16)({unsigned long v; savesegment(gs, v); v;})
249+
#define set_user_gs(regs, v) loadsegment(gs, (unsigned long)(v))
250+
#define task_user_gs(tsk) ((tsk)->thread.gs)
251+
#define lazy_save_gs(v) savesegment(gs, (v))
252+
#define lazy_load_gs(v) loadsegment(gs, (v))
253+
#else /* X86_32_LAZY_GS */
254+
#define get_user_gs(regs) (u16)((regs)->gs)
255+
#define set_user_gs(regs, v) do { (regs)->gs = (v); } while (0)
256+
#define task_user_gs(tsk) (task_pt_regs(tsk)->gs)
257+
#define lazy_save_gs(v) do { } while (0)
258+
#define lazy_load_gs(v) do { } while (0)
259+
#endif /* X86_32_LAZY_GS */
260+
#endif /* X86_32 */
261+
262+
static inline unsigned long get_limit(unsigned long segment)
263+
{
264+
unsigned long __limit;
265+
asm("lsll %1,%0" : "=r" (__limit) : "r" (segment));
266+
return __limit + 1;
267+
}
268+
269+
#endif /* !__ASSEMBLY__ */
270+
#endif /* __KERNEL__ */
217271

218272
#endif /* _ASM_X86_SEGMENT_H */

0 commit comments

Comments
 (0)