vserver 1.9.5.x5
[linux-2.6.git] / include / asm-i386 / processor.h
1 /*
2  * include/asm-i386/processor.h
3  *
4  * Copyright (C) 1994 Linus Torvalds
5  */
6
7 #ifndef __ASM_I386_PROCESSOR_H
8 #define __ASM_I386_PROCESSOR_H
9
10 #include <asm/vm86.h>
11 #include <asm/math_emu.h>
12 #include <asm/segment.h>
13 #include <asm/page.h>
14 #include <asm/types.h>
15 #include <asm/sigcontext.h>
16 #include <asm/cpufeature.h>
17 #include <asm/msr.h>
18 #include <asm/system.h>
19 #include <linux/cache.h>
20 #include <linux/config.h>
21 #include <linux/threads.h>
22 #include <asm/percpu.h>
23
24 /* flag for disabling the tsc */
25 extern int tsc_disable;
26
27 struct desc_struct {
28         unsigned long a,b;
29 };
30
31 #define desc_empty(desc) \
32                 (!((desc)->a + (desc)->b))
33
34 #define desc_equal(desc1, desc2) \
35                 (((desc1)->a == (desc2)->a) && ((desc1)->b == (desc2)->b))
36 /*
37  * Default implementation of macro that returns current
38  * instruction pointer ("program counter").
39  */
40 #define current_text_addr() ({ void *pc; __asm__("movl $1f,%0\n1:":"=g" (pc)); pc; })
41
42 /*
43  *  CPU type and hardware bug flags. Kept separately for each CPU.
44  *  Members of this structure are referenced in head.S, so think twice
45  *  before touching them. [mj]
46  */
47
48 struct cpuinfo_x86 {
49         __u8    x86;            /* CPU family */
50         __u8    x86_vendor;     /* CPU vendor */
51         __u8    x86_model;
52         __u8    x86_mask;
53         char    wp_works_ok;    /* It doesn't on 386's */
54         char    hlt_works_ok;   /* Problems on some 486Dx4's and old 386's */
55         char    hard_math;
56         char    rfu;
57         int     cpuid_level;    /* Maximum supported CPUID level, -1=no CPUID */
58         unsigned long   x86_capability[NCAPINTS];
59         char    x86_vendor_id[16];
60         char    x86_model_id[64];
61         int     x86_cache_size;  /* in KB - valid for CPUS which support this
62                                     call  */
63         int     x86_cache_alignment;    /* In bytes */
64         int     fdiv_bug;
65         int     f00f_bug;
66         int     coma_bug;
67         unsigned long loops_per_jiffy;
68         unsigned char x86_num_cores;
69 } __attribute__((__aligned__(SMP_CACHE_BYTES)));
70
71 #define X86_VENDOR_INTEL 0
72 #define X86_VENDOR_CYRIX 1
73 #define X86_VENDOR_AMD 2
74 #define X86_VENDOR_UMC 3
75 #define X86_VENDOR_NEXGEN 4
76 #define X86_VENDOR_CENTAUR 5
77 #define X86_VENDOR_RISE 6
78 #define X86_VENDOR_TRANSMETA 7
79 #define X86_VENDOR_NSC 8
80 #define X86_VENDOR_NUM 9
81 #define X86_VENDOR_UNKNOWN 0xff
82
83 /*
84  * capabilities of CPUs
85  */
86
87 extern struct cpuinfo_x86 boot_cpu_data;
88 extern struct cpuinfo_x86 new_cpu_data;
89 extern struct tss_struct doublefault_tss;
90 DECLARE_PER_CPU(struct tss_struct, init_tss);
91
92 #ifdef CONFIG_SMP
93 extern struct cpuinfo_x86 cpu_data[];
94 #define current_cpu_data cpu_data[smp_processor_id()]
95 #else
96 #define cpu_data (&boot_cpu_data)
97 #define current_cpu_data boot_cpu_data
98 #endif
99
100 extern  int phys_proc_id[NR_CPUS];
101 extern char ignore_fpu_irq;
102
103 extern void identify_cpu(struct cpuinfo_x86 *);
104 extern void print_cpu_info(struct cpuinfo_x86 *);
105 extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
106 extern void dodgy_tsc(void);
107
108 #ifdef CONFIG_X86_HT
109 extern void detect_ht(struct cpuinfo_x86 *c);
110 #else
111 static inline void detect_ht(struct cpuinfo_x86 *c) {}
112 #endif
113
114 /*
115  * EFLAGS bits
116  */
117 #define X86_EFLAGS_CF   0x00000001 /* Carry Flag */
118 #define X86_EFLAGS_PF   0x00000004 /* Parity Flag */
119 #define X86_EFLAGS_AF   0x00000010 /* Auxillary carry Flag */
120 #define X86_EFLAGS_ZF   0x00000040 /* Zero Flag */
121 #define X86_EFLAGS_SF   0x00000080 /* Sign Flag */
122 #define X86_EFLAGS_TF   0x00000100 /* Trap Flag */
123 #define X86_EFLAGS_IF   0x00000200 /* Interrupt Flag */
124 #define X86_EFLAGS_DF   0x00000400 /* Direction Flag */
125 #define X86_EFLAGS_OF   0x00000800 /* Overflow Flag */
126 #define X86_EFLAGS_IOPL 0x00003000 /* IOPL mask */
127 #define X86_EFLAGS_NT   0x00004000 /* Nested Task */
128 #define X86_EFLAGS_RF   0x00010000 /* Resume Flag */
129 #define X86_EFLAGS_VM   0x00020000 /* Virtual Mode */
130 #define X86_EFLAGS_AC   0x00040000 /* Alignment Check */
131 #define X86_EFLAGS_VIF  0x00080000 /* Virtual Interrupt Flag */
132 #define X86_EFLAGS_VIP  0x00100000 /* Virtual Interrupt Pending */
133 #define X86_EFLAGS_ID   0x00200000 /* CPUID detection flag */
134
135 /*
136  * Generic CPUID function
137  * clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx
138  * resulting in stale register contents being returned.
139  */
140 static inline void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx)
141 {
142         __asm__("cpuid"
143                 : "=a" (*eax),
144                   "=b" (*ebx),
145                   "=c" (*ecx),
146                   "=d" (*edx)
147                 : "0" (op), "c"(0));
148 }
149
150 /*
151  * CPUID functions returning a single datum
152  */
153 static inline unsigned int cpuid_eax(unsigned int op)
154 {
155         unsigned int eax;
156
157         __asm__("cpuid"
158                 : "=a" (eax)
159                 : "0" (op)
160                 : "bx", "cx", "dx");
161         return eax;
162 }
163 static inline unsigned int cpuid_ebx(unsigned int op)
164 {
165         unsigned int eax, ebx;
166
167         __asm__("cpuid"
168                 : "=a" (eax), "=b" (ebx)
169                 : "0" (op)
170                 : "cx", "dx" );
171         return ebx;
172 }
173 static inline unsigned int cpuid_ecx(unsigned int op)
174 {
175         unsigned int eax, ecx;
176
177         __asm__("cpuid"
178                 : "=a" (eax), "=c" (ecx)
179                 : "0" (op)
180                 : "bx", "dx" );
181         return ecx;
182 }
183 static inline unsigned int cpuid_edx(unsigned int op)
184 {
185         unsigned int eax, edx;
186
187         __asm__("cpuid"
188                 : "=a" (eax), "=d" (edx)
189                 : "0" (op)
190                 : "bx", "cx");
191         return edx;
192 }
193
194 #define load_cr3(pgdir) \
195         asm volatile("movl %0,%%cr3": :"r" (__pa(pgdir)))
196
197
198 /*
199  * Intel CPU features in CR4
200  */
201 #define X86_CR4_VME             0x0001  /* enable vm86 extensions */
202 #define X86_CR4_PVI             0x0002  /* virtual interrupts flag enable */
203 #define X86_CR4_TSD             0x0004  /* disable time stamp at ipl 3 */
204 #define X86_CR4_DE              0x0008  /* enable debugging extensions */
205 #define X86_CR4_PSE             0x0010  /* enable page size extensions */
206 #define X86_CR4_PAE             0x0020  /* enable physical address extensions */
207 #define X86_CR4_MCE             0x0040  /* Machine check enable */
208 #define X86_CR4_PGE             0x0080  /* enable global pages */
209 #define X86_CR4_PCE             0x0100  /* enable performance counters at ipl 3 */
210 #define X86_CR4_OSFXSR          0x0200  /* enable fast FPU save and restore */
211 #define X86_CR4_OSXMMEXCPT      0x0400  /* enable unmasked SSE exceptions */
212
213 /*
214  * Save the cr4 feature set we're using (ie
215  * Pentium 4MB enable and PPro Global page
216  * enable), so that any CPU's that boot up
217  * after us can get the correct flags.
218  */
219 extern unsigned long mmu_cr4_features;
220
221 static inline void set_in_cr4 (unsigned long mask)
222 {
223         mmu_cr4_features |= mask;
224         __asm__("movl %%cr4,%%eax\n\t"
225                 "orl %0,%%eax\n\t"
226                 "movl %%eax,%%cr4\n"
227                 : : "irg" (mask)
228                 :"ax");
229 }
230
231 static inline void clear_in_cr4 (unsigned long mask)
232 {
233         mmu_cr4_features &= ~mask;
234         __asm__("movl %%cr4,%%eax\n\t"
235                 "andl %0,%%eax\n\t"
236                 "movl %%eax,%%cr4\n"
237                 : : "irg" (~mask)
238                 :"ax");
239 }
240
241 /*
242  *      NSC/Cyrix CPU configuration register indexes
243  */
244
245 #define CX86_PCR0 0x20
246 #define CX86_GCR  0xb8
247 #define CX86_CCR0 0xc0
248 #define CX86_CCR1 0xc1
249 #define CX86_CCR2 0xc2
250 #define CX86_CCR3 0xc3
251 #define CX86_CCR4 0xe8
252 #define CX86_CCR5 0xe9
253 #define CX86_CCR6 0xea
254 #define CX86_CCR7 0xeb
255 #define CX86_PCR1 0xf0
256 #define CX86_DIR0 0xfe
257 #define CX86_DIR1 0xff
258 #define CX86_ARR_BASE 0xc4
259 #define CX86_RCR_BASE 0xdc
260
261 /*
262  *      NSC/Cyrix CPU indexed register access macros
263  */
264
265 #define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
266
267 #define setCx86(reg, data) do { \
268         outb((reg), 0x22); \
269         outb((data), 0x23); \
270 } while (0)
271
272 static inline void __monitor(const void *eax, unsigned long ecx,
273                 unsigned long edx)
274 {
275         /* "monitor %eax,%ecx,%edx;" */
276         asm volatile(
277                 ".byte 0x0f,0x01,0xc8;"
278                 : :"a" (eax), "c" (ecx), "d"(edx));
279 }
280
281 static inline void __mwait(unsigned long eax, unsigned long ecx)
282 {
283         /* "mwait %eax,%ecx;" */
284         asm volatile(
285                 ".byte 0x0f,0x01,0xc9;"
286                 : :"a" (eax), "c" (ecx));
287 }
288
289 /* from system description table in BIOS.  Mostly for MCA use, but
290 others may find it useful. */
291 extern unsigned int machine_id;
292 extern unsigned int machine_submodel_id;
293 extern unsigned int BIOS_revision;
294 extern unsigned int mca_pentium_flag;
295
296 /* Boot loader type from the setup header */
297 extern int bootloader_type;
298
299 /*
300  * User space process size: (3GB default).
301  */
302 #define __TASK_SIZE             (__PAGE_OFFSET)
303 #define TASK_SIZE               ((unsigned long)__TASK_SIZE)
304
305 /* This decides where the kernel will search for a free chunk of vm
306  * space during mmap's.
307  */
308 #define TASK_UNMAPPED_BASE      (PAGE_ALIGN(TASK_SIZE / 3))
309
310 #define HAVE_ARCH_PICK_MMAP_LAYOUT
311
312 /*
313  * Size of io_bitmap.
314  */
315 #define IO_BITMAP_BITS  65536
316 #define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
317 #define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
318 #define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
319 #define INVALID_IO_BITMAP_OFFSET 0x8000
320 #define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000
321
322 struct i387_fsave_struct {
323         long    cwd;
324         long    swd;
325         long    twd;
326         long    fip;
327         long    fcs;
328         long    foo;
329         long    fos;
330         long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
331         long    status;         /* software status information */
332 };
333
334 struct i387_fxsave_struct {
335         unsigned short  cwd;
336         unsigned short  swd;
337         unsigned short  twd;
338         unsigned short  fop;
339         long    fip;
340         long    fcs;
341         long    foo;
342         long    fos;
343         long    mxcsr;
344         long    mxcsr_mask;
345         long    st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
346         long    xmm_space[32];  /* 8*16 bytes for each XMM-reg = 128 bytes */
347         long    padding[56];
348 } __attribute__ ((aligned (16)));
349
350 struct i387_soft_struct {
351         long    cwd;
352         long    swd;
353         long    twd;
354         long    fip;
355         long    fcs;
356         long    foo;
357         long    fos;
358         long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
359         unsigned char   ftop, changed, lookahead, no_update, rm, alimit;
360         struct info     *info;
361         unsigned long   entry_eip;
362 };
363
364 union i387_union {
365         struct i387_fsave_struct        fsave;
366         struct i387_fxsave_struct       fxsave;
367         struct i387_soft_struct soft;
368 };
369
370 typedef struct {
371         unsigned long seg;
372 } mm_segment_t;
373
374 struct thread_struct;
375
376 struct tss_struct {
377         unsigned short  back_link,__blh;
378         unsigned long   esp0;
379         unsigned short  ss0,__ss0h;
380         unsigned long   esp1;
381         unsigned short  ss1,__ss1h;     /* ss1 is used to cache MSR_IA32_SYSENTER_CS */
382         unsigned long   esp2;
383         unsigned short  ss2,__ss2h;
384         unsigned long   __cr3;
385         unsigned long   eip;
386         unsigned long   eflags;
387         unsigned long   eax,ecx,edx,ebx;
388         unsigned long   esp;
389         unsigned long   ebp;
390         unsigned long   esi;
391         unsigned long   edi;
392         unsigned short  es, __esh;
393         unsigned short  cs, __csh;
394         unsigned short  ss, __ssh;
395         unsigned short  ds, __dsh;
396         unsigned short  fs, __fsh;
397         unsigned short  gs, __gsh;
398         unsigned short  ldt, __ldth;
399         unsigned short  trace, io_bitmap_base;
400         /*
401          * The extra 1 is there because the CPU will access an
402          * additional byte beyond the end of the IO permission
403          * bitmap. The extra byte must be all 1 bits, and must
404          * be within the limit.
405          */
406         unsigned long   io_bitmap[IO_BITMAP_LONGS + 1];
407         /*
408          * Cache the current maximum and the last task that used the bitmap:
409          */
410         unsigned long io_bitmap_max;
411         struct thread_struct *io_bitmap_owner;
412         /*
413          * pads the TSS to be cacheline-aligned (size is 0x100)
414          */
415         unsigned long __cacheline_filler[35];
416         /*
417          * .. and then another 0x100 bytes for emergency kernel stack
418          */
419         unsigned long stack[64];
420 } __attribute__((packed));
421
422 #define ARCH_MIN_TASKALIGN      16
423
424 struct thread_struct {
425 /* cached TLS descriptors. */
426         struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
427         unsigned long   esp0;
428         unsigned long   sysenter_cs;
429         unsigned long   eip;
430         unsigned long   esp;
431         unsigned long   fs;
432         unsigned long   gs;
433 /* Hardware debugging registers */
434         unsigned long   debugreg[8];  /* %%db0-7 debug registers */
435 /* fault info */
436         unsigned long   cr2, trap_no, error_code;
437 /* floating point info */
438         union i387_union        i387;
439 /* virtual 86 mode info */
440         struct vm86_struct __user * vm86_info;
441         unsigned long           screen_bitmap;
442         unsigned long           v86flags, v86mask, saved_esp0;
443         unsigned int            saved_fs, saved_gs;
444 /* IO permissions */
445         unsigned long   *io_bitmap_ptr;
446 /* max allowed port in the bitmap, in bytes: */
447         unsigned long   io_bitmap_max;
448 };
449
450 #define INIT_THREAD  {                                                  \
451         .vm86_info = NULL,                                              \
452         .sysenter_cs = __KERNEL_CS,                                     \
453         .io_bitmap_ptr = NULL,                                          \
454 }
455
456 /*
457  * Note that the .io_bitmap member must be extra-big. This is because
458  * the CPU will access an additional byte beyond the end of the IO
459  * permission bitmap. The extra byte must be all 1 bits, and must
460  * be within the limit.
461  */
462 #define INIT_TSS  {                                                     \
463         .esp0           = sizeof(init_stack) + (long)&init_stack,       \
464         .ss0            = __KERNEL_DS,                                  \
465         .ss1            = __KERNEL_CS,                                  \
466         .ldt            = GDT_ENTRY_LDT,                                \
467         .io_bitmap_base = INVALID_IO_BITMAP_OFFSET,                     \
468         .io_bitmap      = { [ 0 ... IO_BITMAP_LONGS] = ~0 },            \
469 }
470
471 static inline void load_esp0(struct tss_struct *tss, struct thread_struct *thread)
472 {
473         tss->esp0 = thread->esp0;
474         /* This can only happen when SEP is enabled, no need to test "SEP"arately */
475         if (unlikely(tss->ss1 != thread->sysenter_cs)) {
476                 tss->ss1 = thread->sysenter_cs;
477                 wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
478         }
479 }
480
481 #define start_thread(regs, new_eip, new_esp) do {               \
482         __asm__("movl %0,%%fs ; movl %0,%%gs": :"r" (0));       \
483         set_fs(USER_DS);                                        \
484         regs->xds = __USER_DS;                                  \
485         regs->xes = __USER_DS;                                  \
486         regs->xss = __USER_DS;                                  \
487         regs->xcs = __USER_CS;                                  \
488         regs->eip = new_eip;                                    \
489         regs->esp = new_esp;                                    \
490 } while (0)
491
492 /* Forward declaration, a strange C thing */
493 struct task_struct;
494 struct mm_struct;
495
496 /* Free all resources held by a thread. */
497 extern void release_thread(struct task_struct *);
498
499 /* Prepare to copy thread state - unlazy all lazy status */
500 extern void prepare_to_copy(struct task_struct *tsk);
501
502 /*
503  * create a kernel thread without removing it from tasklists
504  */
505 extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
506
507 extern unsigned long thread_saved_pc(struct task_struct *tsk);
508 void show_trace(struct task_struct *task, unsigned long *stack);
509
510 unsigned long get_wchan(struct task_struct *p);
511
512 #define THREAD_SIZE_LONGS      (THREAD_SIZE/sizeof(unsigned long))
513 #define KSTK_TOP(info)                                                 \
514 ({                                                                     \
515        unsigned long *__ptr = (unsigned long *)(info);                 \
516        (unsigned long)(&__ptr[THREAD_SIZE_LONGS]);                     \
517 })
518
519 #define task_pt_regs(task)                                             \
520 ({                                                                     \
521        struct pt_regs *__regs__;                                       \
522        __regs__ = (struct pt_regs *)KSTK_TOP((task)->thread_info);     \
523        __regs__ - 1;                                                   \
524 })
525
526 #define KSTK_EIP(task) (task_pt_regs(task)->eip)
527 #define KSTK_ESP(task) (task_pt_regs(task)->esp)
528
529
530 struct microcode_header {
531         unsigned int hdrver;
532         unsigned int rev;
533         unsigned int date;
534         unsigned int sig;
535         unsigned int cksum;
536         unsigned int ldrver;
537         unsigned int pf;
538         unsigned int datasize;
539         unsigned int totalsize;
540         unsigned int reserved[3];
541 };
542
543 struct microcode {
544         struct microcode_header hdr;
545         unsigned int bits[0];
546 };
547
548 typedef struct microcode microcode_t;
549 typedef struct microcode_header microcode_header_t;
550
551 /* microcode format is extended from prescott processors */
552 struct extended_signature {
553         unsigned int sig;
554         unsigned int pf;
555         unsigned int cksum;
556 };
557
558 struct extended_sigtable {
559         unsigned int count;
560         unsigned int cksum;
561         unsigned int reserved[3];
562         struct extended_signature sigs[0];
563 };
564 /* '6' because it used to be for P6 only (but now covers Pentium 4 as well) */
565 #define MICROCODE_IOCFREE       _IO('6',0)
566
567 /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
568 static inline void rep_nop(void)
569 {
570         __asm__ __volatile__("rep;nop": : :"memory");
571 }
572
573 #define cpu_relax()     rep_nop()
574
575 /* generic versions from gas */
576 #define GENERIC_NOP1    ".byte 0x90\n"
577 #define GENERIC_NOP2            ".byte 0x89,0xf6\n"
578 #define GENERIC_NOP3        ".byte 0x8d,0x76,0x00\n"
579 #define GENERIC_NOP4        ".byte 0x8d,0x74,0x26,0x00\n"
580 #define GENERIC_NOP5        GENERIC_NOP1 GENERIC_NOP4
581 #define GENERIC_NOP6    ".byte 0x8d,0xb6,0x00,0x00,0x00,0x00\n"
582 #define GENERIC_NOP7    ".byte 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00\n"
583 #define GENERIC_NOP8    GENERIC_NOP1 GENERIC_NOP7
584
585 /* Opteron nops */
586 #define K8_NOP1 GENERIC_NOP1
587 #define K8_NOP2 ".byte 0x66,0x90\n" 
588 #define K8_NOP3 ".byte 0x66,0x66,0x90\n" 
589 #define K8_NOP4 ".byte 0x66,0x66,0x66,0x90\n" 
590 #define K8_NOP5 K8_NOP3 K8_NOP2 
591 #define K8_NOP6 K8_NOP3 K8_NOP3
592 #define K8_NOP7 K8_NOP4 K8_NOP3
593 #define K8_NOP8 K8_NOP4 K8_NOP4
594
595 /* K7 nops */
596 /* uses eax dependencies (arbitary choice) */
597 #define K7_NOP1  GENERIC_NOP1
598 #define K7_NOP2 ".byte 0x8b,0xc0\n" 
599 #define K7_NOP3 ".byte 0x8d,0x04,0x20\n"
600 #define K7_NOP4 ".byte 0x8d,0x44,0x20,0x00\n"
601 #define K7_NOP5 K7_NOP4 ASM_NOP1
602 #define K7_NOP6 ".byte 0x8d,0x80,0,0,0,0\n"
603 #define K7_NOP7        ".byte 0x8D,0x04,0x05,0,0,0,0\n"
604 #define K7_NOP8        K7_NOP7 ASM_NOP1
605
606 #ifdef CONFIG_MK8
607 #define ASM_NOP1 K8_NOP1
608 #define ASM_NOP2 K8_NOP2
609 #define ASM_NOP3 K8_NOP3
610 #define ASM_NOP4 K8_NOP4
611 #define ASM_NOP5 K8_NOP5
612 #define ASM_NOP6 K8_NOP6
613 #define ASM_NOP7 K8_NOP7
614 #define ASM_NOP8 K8_NOP8
615 #elif defined(CONFIG_MK7)
616 #define ASM_NOP1 K7_NOP1
617 #define ASM_NOP2 K7_NOP2
618 #define ASM_NOP3 K7_NOP3
619 #define ASM_NOP4 K7_NOP4
620 #define ASM_NOP5 K7_NOP5
621 #define ASM_NOP6 K7_NOP6
622 #define ASM_NOP7 K7_NOP7
623 #define ASM_NOP8 K7_NOP8
624 #else
625 #define ASM_NOP1 GENERIC_NOP1
626 #define ASM_NOP2 GENERIC_NOP2
627 #define ASM_NOP3 GENERIC_NOP3
628 #define ASM_NOP4 GENERIC_NOP4
629 #define ASM_NOP5 GENERIC_NOP5
630 #define ASM_NOP6 GENERIC_NOP6
631 #define ASM_NOP7 GENERIC_NOP7
632 #define ASM_NOP8 GENERIC_NOP8
633 #endif
634
635 #define ASM_NOP_MAX 8
636
637 /* Prefetch instructions for Pentium III and AMD Athlon */
638 /* It's not worth to care about 3dnow! prefetches for the K6
639    because they are microcoded there and very slow.
640    However we don't do prefetches for pre XP Athlons currently
641    That should be fixed. */
642 #define ARCH_HAS_PREFETCH
643 extern inline void prefetch(const void *x)
644 {
645         alternative_input(ASM_NOP4,
646                           "prefetchnta (%1)",
647                           X86_FEATURE_XMM,
648                           "r" (x));
649 }
650
651 #define ARCH_HAS_PREFETCH
652 #define ARCH_HAS_PREFETCHW
653 #define ARCH_HAS_SPINLOCK_PREFETCH
654
655 /* 3dnow! prefetch to get an exclusive cache line. Useful for 
656    spinlocks to avoid one state transition in the cache coherency protocol. */
657 extern inline void prefetchw(const void *x)
658 {
659         alternative_input(ASM_NOP4,
660                           "prefetchw (%1)",
661                           X86_FEATURE_3DNOW,
662                           "r" (x));
663 }
664 #define spin_lock_prefetch(x)   prefetchw(x)
665
666 extern void select_idle_routine(const struct cpuinfo_x86 *c);
667
668 #define cache_line_size() (boot_cpu_data.x86_cache_alignment)
669
670 extern unsigned long boot_option_idle_override;
671
672 #endif /* __ASM_I386_PROCESSOR_H */