upgrade to fedora-2.6.12-1.1398.FC4 + vserver 2.0.rc7
[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  int cpu_core_id[NR_CPUS];
102 extern char ignore_fpu_irq;
103
104 extern void identify_cpu(struct cpuinfo_x86 *);
105 extern void print_cpu_info(struct cpuinfo_x86 *);
106 extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
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(unsigned int op, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned 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 /* Some CPUID calls want 'count' to be placed in ecx */
151 static inline void cpuid_count(int op, int count, int *eax, int *ebx, int *ecx,
152                 int *edx)
153 {
154         __asm__("cpuid"
155                 : "=a" (*eax),
156                   "=b" (*ebx),
157                   "=c" (*ecx),
158                   "=d" (*edx)
159                 : "0" (op), "c" (count));
160 }
161
162 /*
163  * CPUID functions returning a single datum
164  */
165 static inline unsigned int cpuid_eax(unsigned int op)
166 {
167         unsigned int eax;
168
169         __asm__("cpuid"
170                 : "=a" (eax)
171                 : "0" (op)
172                 : "bx", "cx", "dx");
173         return eax;
174 }
175 static inline unsigned int cpuid_ebx(unsigned int op)
176 {
177         unsigned int eax, ebx;
178
179         __asm__("cpuid"
180                 : "=a" (eax), "=b" (ebx)
181                 : "0" (op)
182                 : "cx", "dx" );
183         return ebx;
184 }
185 static inline unsigned int cpuid_ecx(unsigned int op)
186 {
187         unsigned int eax, ecx;
188
189         __asm__("cpuid"
190                 : "=a" (eax), "=c" (ecx)
191                 : "0" (op)
192                 : "bx", "dx" );
193         return ecx;
194 }
195 static inline unsigned int cpuid_edx(unsigned int op)
196 {
197         unsigned int eax, edx;
198
199         __asm__("cpuid"
200                 : "=a" (eax), "=d" (edx)
201                 : "0" (op)
202                 : "bx", "cx");
203         return edx;
204 }
205
206 #define load_cr3(pgdir) \
207         asm volatile("movl %0,%%cr3": :"r" (__pa(pgdir)))
208
209
210 /*
211  * Intel CPU features in CR4
212  */
213 #define X86_CR4_VME             0x0001  /* enable vm86 extensions */
214 #define X86_CR4_PVI             0x0002  /* virtual interrupts flag enable */
215 #define X86_CR4_TSD             0x0004  /* disable time stamp at ipl 3 */
216 #define X86_CR4_DE              0x0008  /* enable debugging extensions */
217 #define X86_CR4_PSE             0x0010  /* enable page size extensions */
218 #define X86_CR4_PAE             0x0020  /* enable physical address extensions */
219 #define X86_CR4_MCE             0x0040  /* Machine check enable */
220 #define X86_CR4_PGE             0x0080  /* enable global pages */
221 #define X86_CR4_PCE             0x0100  /* enable performance counters at ipl 3 */
222 #define X86_CR4_OSFXSR          0x0200  /* enable fast FPU save and restore */
223 #define X86_CR4_OSXMMEXCPT      0x0400  /* enable unmasked SSE exceptions */
224
225 /*
226  * Save the cr4 feature set we're using (ie
227  * Pentium 4MB enable and PPro Global page
228  * enable), so that any CPU's that boot up
229  * after us can get the correct flags.
230  */
231 extern unsigned long mmu_cr4_features;
232
233 static inline void set_in_cr4 (unsigned long mask)
234 {
235         mmu_cr4_features |= mask;
236         __asm__("movl %%cr4,%%eax\n\t"
237                 "orl %0,%%eax\n\t"
238                 "movl %%eax,%%cr4\n"
239                 : : "irg" (mask)
240                 :"ax");
241 }
242
243 static inline void clear_in_cr4 (unsigned long mask)
244 {
245         mmu_cr4_features &= ~mask;
246         __asm__("movl %%cr4,%%eax\n\t"
247                 "andl %0,%%eax\n\t"
248                 "movl %%eax,%%cr4\n"
249                 : : "irg" (~mask)
250                 :"ax");
251 }
252
253 /*
254  *      NSC/Cyrix CPU configuration register indexes
255  */
256
257 #define CX86_PCR0 0x20
258 #define CX86_GCR  0xb8
259 #define CX86_CCR0 0xc0
260 #define CX86_CCR1 0xc1
261 #define CX86_CCR2 0xc2
262 #define CX86_CCR3 0xc3
263 #define CX86_CCR4 0xe8
264 #define CX86_CCR5 0xe9
265 #define CX86_CCR6 0xea
266 #define CX86_CCR7 0xeb
267 #define CX86_PCR1 0xf0
268 #define CX86_DIR0 0xfe
269 #define CX86_DIR1 0xff
270 #define CX86_ARR_BASE 0xc4
271 #define CX86_RCR_BASE 0xdc
272
273 /*
274  *      NSC/Cyrix CPU indexed register access macros
275  */
276
277 #define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
278
279 #define setCx86(reg, data) do { \
280         outb((reg), 0x22); \
281         outb((data), 0x23); \
282 } while (0)
283
284 static inline void __monitor(const void *eax, unsigned long ecx,
285                 unsigned long edx)
286 {
287         /* "monitor %eax,%ecx,%edx;" */
288         asm volatile(
289                 ".byte 0x0f,0x01,0xc8;"
290                 : :"a" (eax), "c" (ecx), "d"(edx));
291 }
292
293 static inline void __mwait(unsigned long eax, unsigned long ecx)
294 {
295         /* "mwait %eax,%ecx;" */
296         asm volatile(
297                 ".byte 0x0f,0x01,0xc9;"
298                 : :"a" (eax), "c" (ecx));
299 }
300
301 /* from system description table in BIOS.  Mostly for MCA use, but
302 others may find it useful. */
303 extern unsigned int machine_id;
304 extern unsigned int machine_submodel_id;
305 extern unsigned int BIOS_revision;
306 extern unsigned int mca_pentium_flag;
307
308 /* Boot loader type from the setup header */
309 extern int bootloader_type;
310
311 /*
312  * User space process size: (3GB default).
313  */
314 #define __TASK_SIZE             (__PAGE_OFFSET)
315 #define TASK_SIZE               ((unsigned long)__TASK_SIZE)
316
317 /* This decides where the kernel will search for a free chunk of vm
318  * space during mmap's.
319  */
320 #define TASK_UNMAPPED_BASE      PAGE_ALIGN(TASK_SIZE/3)
321
322 #define __HAVE_ARCH_ALIGN_STACK
323 extern unsigned long arch_align_stack(unsigned long sp);
324
325 #define HAVE_ARCH_PICK_MMAP_LAYOUT
326
327 /*
328  * Size of io_bitmap.
329  */
330 #define IO_BITMAP_BITS  65536
331 #define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
332 #define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
333 #define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
334 #define INVALID_IO_BITMAP_OFFSET 0x8000
335 #define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000
336
337 struct i387_fsave_struct {
338         long    cwd;
339         long    swd;
340         long    twd;
341         long    fip;
342         long    fcs;
343         long    foo;
344         long    fos;
345         long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
346         long    status;         /* software status information */
347 };
348
349 struct i387_fxsave_struct {
350         unsigned short  cwd;
351         unsigned short  swd;
352         unsigned short  twd;
353         unsigned short  fop;
354         long    fip;
355         long    fcs;
356         long    foo;
357         long    fos;
358         long    mxcsr;
359         long    mxcsr_mask;
360         long    st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
361         long    xmm_space[32];  /* 8*16 bytes for each XMM-reg = 128 bytes */
362         long    padding[56];
363 } __attribute__ ((aligned (16)));
364
365 struct i387_soft_struct {
366         long    cwd;
367         long    swd;
368         long    twd;
369         long    fip;
370         long    fcs;
371         long    foo;
372         long    fos;
373         long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
374         unsigned char   ftop, changed, lookahead, no_update, rm, alimit;
375         struct info     *info;
376         unsigned long   entry_eip;
377 };
378
379 union i387_union {
380         struct i387_fsave_struct        fsave;
381         struct i387_fxsave_struct       fxsave;
382         struct i387_soft_struct soft;
383 };
384
385 typedef struct {
386         unsigned long seg;
387 } mm_segment_t;
388
389 struct thread_struct;
390
391 struct tss_struct {
392         unsigned short  back_link,__blh;
393         unsigned long   esp0;
394         unsigned short  ss0,__ss0h;
395         unsigned long   esp1;
396         unsigned short  ss1,__ss1h;     /* ss1 is used to cache MSR_IA32_SYSENTER_CS */
397         unsigned long   esp2;
398         unsigned short  ss2,__ss2h;
399         unsigned long   __cr3;
400         unsigned long   eip;
401         unsigned long   eflags;
402         unsigned long   eax,ecx,edx,ebx;
403         unsigned long   esp;
404         unsigned long   ebp;
405         unsigned long   esi;
406         unsigned long   edi;
407         unsigned short  es, __esh;
408         unsigned short  cs, __csh;
409         unsigned short  ss, __ssh;
410         unsigned short  ds, __dsh;
411         unsigned short  fs, __fsh;
412         unsigned short  gs, __gsh;
413         unsigned short  ldt, __ldth;
414         unsigned short  trace, io_bitmap_base;
415         /*
416          * The extra 1 is there because the CPU will access an
417          * additional byte beyond the end of the IO permission
418          * bitmap. The extra byte must be all 1 bits, and must
419          * be within the limit.
420          */
421         unsigned long   io_bitmap[IO_BITMAP_LONGS + 1];
422         /*
423          * Cache the current maximum and the last task that used the bitmap:
424          */
425         unsigned long io_bitmap_max;
426         struct thread_struct *io_bitmap_owner;
427         /*
428          * pads the TSS to be cacheline-aligned (size is 0x100)
429          */
430         unsigned long __cacheline_filler[35];
431         /*
432          * .. and then another 0x100 bytes for emergency kernel stack
433          */
434         unsigned long stack[64];
435 } __attribute__((packed));
436
437 #define ARCH_MIN_TASKALIGN      16
438
439 #if ((1<<CONFIG_STACK_SIZE_SHIFT) < PAGE_SIZE)
440 #error (1<<CONFIG_STACK_SIZE_SHIFT) must be at least PAGE_SIZE
441 #endif
442 #define STACK_PAGE_COUNT        ((1<<CONFIG_STACK_SIZE_SHIFT)/PAGE_SIZE)
443
444 struct thread_struct {
445 /* cached TLS descriptors. */
446         struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
447         unsigned long   esp0;
448         unsigned long   sysenter_cs;
449         unsigned long   eip;
450         unsigned long   esp;
451         unsigned long   fs;
452         unsigned long   gs;
453 /* Hardware debugging registers */
454         unsigned long   debugreg[8];  /* %%db0-7 debug registers */
455 /* fault info */
456         unsigned long   cr2, trap_no, error_code;
457 /* floating point info */
458         union i387_union        i387;
459 /* virtual 86 mode info */
460         struct vm86_struct __user * vm86_info;
461         unsigned long           screen_bitmap;
462         unsigned long           v86flags, v86mask, saved_esp0;
463         unsigned int            saved_fs, saved_gs;
464 /* IO permissions */
465         unsigned long   *io_bitmap_ptr;
466 /* max allowed port in the bitmap, in bytes: */
467         unsigned long   io_bitmap_max;
468 };
469
470 #define INIT_THREAD  {                                                  \
471         .vm86_info = NULL,                                              \
472         .sysenter_cs = __KERNEL_CS,                                     \
473         .io_bitmap_ptr = NULL,                                          \
474 }
475
476 /*
477  * Note that the .io_bitmap member must be extra-big. This is because
478  * the CPU will access an additional byte beyond the end of the IO
479  * permission bitmap. The extra byte must be all 1 bits, and must
480  * be within the limit.
481  */
482 #define INIT_TSS  {                                                     \
483         .esp0           = sizeof(init_stack) + (long)&init_stack,       \
484         .ss0            = __KERNEL_DS,                                  \
485         .ss1            = __KERNEL_CS,                                  \
486         .ldt            = GDT_ENTRY_LDT,                                \
487         .io_bitmap_base = INVALID_IO_BITMAP_OFFSET,                     \
488         .io_bitmap      = { [ 0 ... IO_BITMAP_LONGS] = ~0 },            \
489 }
490
491 static inline void load_esp0(struct tss_struct *tss, struct thread_struct *thread)
492 {
493         tss->esp0 = thread->esp0;
494         /* This can only happen when SEP is enabled, no need to test "SEP"arately */
495         if (unlikely(tss->ss1 != thread->sysenter_cs)) {
496                 tss->ss1 = thread->sysenter_cs;
497                 wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
498         }
499 }
500
501 #define start_thread(regs, new_eip, new_esp) do {               \
502         __asm__("movl %0,%%fs ; movl %0,%%gs": :"r" (0));       \
503         set_fs(USER_DS);                                        \
504         regs->xds = __USER_DS;                                  \
505         regs->xes = __USER_DS;                                  \
506         regs->xss = __USER_DS;                                  \
507         regs->xcs = __USER_CS;                                  \
508         regs->eip = new_eip;                                    \
509         regs->esp = new_esp;                                    \
510         preempt_disable();                                      \
511         load_user_cs_desc(smp_processor_id(), current->mm);     \
512         preempt_enable();                                       \
513 } while (0)
514
515 /*
516  * This special macro can be used to load a debugging register
517  */
518 #define loaddebug(thread,register) \
519                __asm__("movl %0,%%db" #register  \
520                        : /* no output */ \
521                        :"r" ((thread)->debugreg[register]))
522
523 /* Forward declaration, a strange C thing */
524 struct task_struct;
525 struct mm_struct;
526
527 /* Free all resources held by a thread. */
528 extern void release_thread(struct task_struct *);
529
530 /* Prepare to copy thread state - unlazy all lazy status */
531 extern void prepare_to_copy(struct task_struct *tsk);
532
533 /*
534  * create a kernel thread without removing it from tasklists
535  */
536 extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
537
538 extern unsigned long thread_saved_pc(struct task_struct *tsk);
539 void show_trace(struct task_struct *task, unsigned long *stack);
540
541 unsigned long get_wchan(struct task_struct *p);
542
543 #define THREAD_SIZE_LONGS      (THREAD_SIZE/sizeof(unsigned long))
544 #define KSTK_TOP(info)                                                 \
545 ({                                                                     \
546        unsigned long *__ptr = (unsigned long *)(info);                 \
547        (unsigned long)(&__ptr[THREAD_SIZE_LONGS]);                     \
548 })
549
550 #define task_pt_regs(task)                                             \
551 ({                                                                     \
552        struct pt_regs *__regs__;                                       \
553        __regs__ = (struct pt_regs *)KSTK_TOP((task)->thread_info);     \
554        __regs__ - 1;                                                   \
555 })
556
557 #define KSTK_EIP(task) (task_pt_regs(task)->eip)
558 #define KSTK_ESP(task) (task_pt_regs(task)->esp)
559
560
561 struct microcode_header {
562         unsigned int hdrver;
563         unsigned int rev;
564         unsigned int date;
565         unsigned int sig;
566         unsigned int cksum;
567         unsigned int ldrver;
568         unsigned int pf;
569         unsigned int datasize;
570         unsigned int totalsize;
571         unsigned int reserved[3];
572 };
573
574 struct microcode {
575         struct microcode_header hdr;
576         unsigned int bits[0];
577 };
578
579 typedef struct microcode microcode_t;
580 typedef struct microcode_header microcode_header_t;
581
582 /* microcode format is extended from prescott processors */
583 struct extended_signature {
584         unsigned int sig;
585         unsigned int pf;
586         unsigned int cksum;
587 };
588
589 struct extended_sigtable {
590         unsigned int count;
591         unsigned int cksum;
592         unsigned int reserved[3];
593         struct extended_signature sigs[0];
594 };
595 /* '6' because it used to be for P6 only (but now covers Pentium 4 as well) */
596 #define MICROCODE_IOCFREE       _IO('6',0)
597
598 /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
599 static inline void rep_nop(void)
600 {
601         __asm__ __volatile__("rep;nop": : :"memory");
602 }
603
604 #define cpu_relax()     rep_nop()
605
606 /* generic versions from gas */
607 #define GENERIC_NOP1    ".byte 0x90\n"
608 #define GENERIC_NOP2            ".byte 0x89,0xf6\n"
609 #define GENERIC_NOP3        ".byte 0x8d,0x76,0x00\n"
610 #define GENERIC_NOP4        ".byte 0x8d,0x74,0x26,0x00\n"
611 #define GENERIC_NOP5        GENERIC_NOP1 GENERIC_NOP4
612 #define GENERIC_NOP6    ".byte 0x8d,0xb6,0x00,0x00,0x00,0x00\n"
613 #define GENERIC_NOP7    ".byte 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00\n"
614 #define GENERIC_NOP8    GENERIC_NOP1 GENERIC_NOP7
615
616 /* Opteron nops */
617 #define K8_NOP1 GENERIC_NOP1
618 #define K8_NOP2 ".byte 0x66,0x90\n" 
619 #define K8_NOP3 ".byte 0x66,0x66,0x90\n" 
620 #define K8_NOP4 ".byte 0x66,0x66,0x66,0x90\n" 
621 #define K8_NOP5 K8_NOP3 K8_NOP2 
622 #define K8_NOP6 K8_NOP3 K8_NOP3
623 #define K8_NOP7 K8_NOP4 K8_NOP3
624 #define K8_NOP8 K8_NOP4 K8_NOP4
625
626 /* K7 nops */
627 /* uses eax dependencies (arbitary choice) */
628 #define K7_NOP1  GENERIC_NOP1
629 #define K7_NOP2 ".byte 0x8b,0xc0\n" 
630 #define K7_NOP3 ".byte 0x8d,0x04,0x20\n"
631 #define K7_NOP4 ".byte 0x8d,0x44,0x20,0x00\n"
632 #define K7_NOP5 K7_NOP4 ASM_NOP1
633 #define K7_NOP6 ".byte 0x8d,0x80,0,0,0,0\n"
634 #define K7_NOP7        ".byte 0x8D,0x04,0x05,0,0,0,0\n"
635 #define K7_NOP8        K7_NOP7 ASM_NOP1
636
637 #ifdef CONFIG_MK8
638 #define ASM_NOP1 K8_NOP1
639 #define ASM_NOP2 K8_NOP2
640 #define ASM_NOP3 K8_NOP3
641 #define ASM_NOP4 K8_NOP4
642 #define ASM_NOP5 K8_NOP5
643 #define ASM_NOP6 K8_NOP6
644 #define ASM_NOP7 K8_NOP7
645 #define ASM_NOP8 K8_NOP8
646 #elif defined(CONFIG_MK7)
647 #define ASM_NOP1 K7_NOP1
648 #define ASM_NOP2 K7_NOP2
649 #define ASM_NOP3 K7_NOP3
650 #define ASM_NOP4 K7_NOP4
651 #define ASM_NOP5 K7_NOP5
652 #define ASM_NOP6 K7_NOP6
653 #define ASM_NOP7 K7_NOP7
654 #define ASM_NOP8 K7_NOP8
655 #else
656 #define ASM_NOP1 GENERIC_NOP1
657 #define ASM_NOP2 GENERIC_NOP2
658 #define ASM_NOP3 GENERIC_NOP3
659 #define ASM_NOP4 GENERIC_NOP4
660 #define ASM_NOP5 GENERIC_NOP5
661 #define ASM_NOP6 GENERIC_NOP6
662 #define ASM_NOP7 GENERIC_NOP7
663 #define ASM_NOP8 GENERIC_NOP8
664 #endif
665
666 #define ASM_NOP_MAX 8
667
668 /* Prefetch instructions for Pentium III and AMD Athlon */
669 /* It's not worth to care about 3dnow! prefetches for the K6
670    because they are microcoded there and very slow.
671    However we don't do prefetches for pre XP Athlons currently
672    That should be fixed. */
673 #define ARCH_HAS_PREFETCH
674 extern inline void prefetch(const void *x)
675 {
676         alternative_input(ASM_NOP4,
677                           "prefetchnta (%1)",
678                           X86_FEATURE_XMM,
679                           "r" (x));
680 }
681
682 #define ARCH_HAS_PREFETCH
683 #define ARCH_HAS_PREFETCHW
684 #define ARCH_HAS_SPINLOCK_PREFETCH
685
686 /* 3dnow! prefetch to get an exclusive cache line. Useful for 
687    spinlocks to avoid one state transition in the cache coherency protocol. */
688 extern inline void prefetchw(const void *x)
689 {
690         alternative_input(ASM_NOP4,
691                           "prefetchw (%1)",
692                           X86_FEATURE_3DNOW,
693                           "r" (x));
694 }
695 #define spin_lock_prefetch(x)   prefetchw(x)
696
697 extern void select_idle_routine(const struct cpuinfo_x86 *c);
698
699 #define cache_line_size() (boot_cpu_data.x86_cache_alignment)
700
701 extern unsigned long boot_option_idle_override;
702
703 #endif /* __ASM_I386_PROCESSOR_H */