Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / arch / i386 / kernel / traps.c
1 /*
2  *  linux/arch/i386/traps.c
3  *
4  *  Copyright (C) 1991, 1992  Linus Torvalds
5  *
6  *  Pentium III FXSR, SSE support
7  *      Gareth Hughes <gareth@valinux.com>, May 2000
8  */
9
10 /*
11  * 'Traps.c' handles hardware traps and faults after we have saved some
12  * state in 'asm.s'.
13  */
14 #include <linux/sched.h>
15 #include <linux/kernel.h>
16 #include <linux/string.h>
17 #include <linux/errno.h>
18 #include <linux/timer.h>
19 #include <linux/mm.h>
20 #include <linux/init.h>
21 #include <linux/delay.h>
22 #include <linux/spinlock.h>
23 #include <linux/interrupt.h>
24 #include <linux/highmem.h>
25 #include <linux/kallsyms.h>
26 #include <linux/ptrace.h>
27 #include <linux/utsname.h>
28 #include <linux/kprobes.h>
29 #include <linux/kexec.h>
30 #include <linux/unwind.h>
31
32 #ifdef CONFIG_EISA
33 #include <linux/ioport.h>
34 #include <linux/eisa.h>
35 #endif
36
37 #ifdef CONFIG_MCA
38 #include <linux/mca.h>
39 #endif
40
41 #include <asm/processor.h>
42 #include <asm/system.h>
43 #include <asm/uaccess.h>
44 #include <asm/io.h>
45 #include <asm/atomic.h>
46 #include <asm/debugreg.h>
47 #include <asm/desc.h>
48 #include <asm/i387.h>
49 #include <asm/nmi.h>
50 #include <asm/unwind.h>
51 #include <asm/smp.h>
52 #include <asm/arch_hooks.h>
53 #include <asm/kdebug.h>
54 #include <asm/stacktrace.h>
55
56 #include <linux/module.h>
57 #include <linux/vserver/debug.h>
58
59 #include "mach_traps.h"
60
61 asmlinkage int system_call(void);
62
63 struct desc_struct default_ldt[] = { { 0, 0 }, { 0, 0 }, { 0, 0 },
64                 { 0, 0 }, { 0, 0 } };
65
66 /* Do we ignore FPU interrupts ? */
67 char ignore_fpu_irq = 0;
68
69 /*
70  * The IDT has to be page-aligned to simplify the Pentium
71  * F0 0F bug workaround.. We have a special link segment
72  * for this.
73  */
74 struct desc_struct idt_table[256] __attribute__((__section__(".data.idt"))) = { {0, 0}, };
75
76 asmlinkage void divide_error(void);
77 asmlinkage void debug(void);
78 asmlinkage void nmi(void);
79 asmlinkage void int3(void);
80 asmlinkage void overflow(void);
81 asmlinkage void bounds(void);
82 asmlinkage void invalid_op(void);
83 asmlinkage void device_not_available(void);
84 asmlinkage void coprocessor_segment_overrun(void);
85 asmlinkage void invalid_TSS(void);
86 asmlinkage void segment_not_present(void);
87 asmlinkage void stack_segment(void);
88 asmlinkage void general_protection(void);
89 asmlinkage void page_fault(void);
90 asmlinkage void coprocessor_error(void);
91 asmlinkage void simd_coprocessor_error(void);
92 asmlinkage void alignment_check(void);
93 asmlinkage void spurious_interrupt_bug(void);
94 asmlinkage void machine_check(void);
95
96 static int kstack_depth_to_print = 24;
97 #ifdef CONFIG_STACK_UNWIND
98 static int call_trace = 1;
99 #else
100 #define call_trace (-1)
101 #endif
102 ATOMIC_NOTIFIER_HEAD(i386die_chain);
103
104 extern char last_sysfs_file[];
105
106 int register_die_notifier(struct notifier_block *nb)
107 {
108         vmalloc_sync_all();
109         return atomic_notifier_chain_register(&i386die_chain, nb);
110 }
111 EXPORT_SYMBOL(register_die_notifier); /* used modular by kdb */
112
113 int unregister_die_notifier(struct notifier_block *nb)
114 {
115         return atomic_notifier_chain_unregister(&i386die_chain, nb);
116 }
117 EXPORT_SYMBOL(unregister_die_notifier); /* used modular by kdb */
118
119 static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)
120 {
121         return  p > (void *)tinfo &&
122                 p < (void *)tinfo + THREAD_SIZE - 3;
123 }
124
125 static inline unsigned long print_context_stack(struct thread_info *tinfo,
126                                 unsigned long *stack, unsigned long ebp,
127                                 struct stacktrace_ops *ops, void *data)
128 {
129         unsigned long addr;
130
131 #ifdef  CONFIG_FRAME_POINTER
132         while (valid_stack_ptr(tinfo, (void *)ebp)) {
133                 addr = *(unsigned long *)(ebp + 4);
134                 ops->address(data, addr);
135                 /*
136                  * break out of recursive entries (such as
137                  * end_of_stack_stop_unwind_function):
138                  */
139                 if (ebp == *(unsigned long *)ebp)
140                         break;
141                 ebp = *(unsigned long *)ebp;
142         }
143 #else
144         while (valid_stack_ptr(tinfo, stack)) {
145                 addr = *stack++;
146                 if (__kernel_text_address(addr))
147                         ops->address(data, addr);
148         }
149 #endif
150         return ebp;
151 }
152
153 struct ops_and_data {
154         struct stacktrace_ops *ops;
155         void *data;
156 };
157
158 static asmlinkage int
159 dump_trace_unwind(struct unwind_frame_info *info, void *data)
160 {
161         struct ops_and_data *oad = (struct ops_and_data *)data;
162         int n = 0;
163
164         while (unwind(info) == 0 && UNW_PC(info)) {
165                 n++;
166                 oad->ops->address(oad->data, UNW_PC(info));
167                 if (arch_unw_user_mode(info))
168                         break;
169         }
170         return n;
171 }
172
173 void dump_trace(struct task_struct *task, struct pt_regs *regs,
174                 unsigned long *stack,
175                 struct stacktrace_ops *ops, void *data)
176 {
177         unsigned long ebp = 0;
178
179         if (!task)
180                 task = current;
181
182         if (call_trace >= 0) {
183                 int unw_ret = 0;
184                 struct unwind_frame_info info;
185                 struct ops_and_data oad = { .ops = ops, .data = data };
186
187                 if (regs) {
188                         if (unwind_init_frame_info(&info, task, regs) == 0)
189                                 unw_ret = dump_trace_unwind(&info, &oad);
190                 } else if (task == current)
191                         unw_ret = unwind_init_running(&info, dump_trace_unwind, &oad);
192                 else {
193                         if (unwind_init_blocked(&info, task) == 0)
194                                 unw_ret = dump_trace_unwind(&info, &oad);
195                 }
196                 if (unw_ret > 0) {
197                         if (call_trace == 1 && !arch_unw_user_mode(&info)) {
198                                 ops->warning_symbol(data, "DWARF2 unwinder stuck at %s",
199                                              UNW_PC(&info));
200                                 if (UNW_SP(&info) >= PAGE_OFFSET) {
201                                         ops->warning(data, "Leftover inexact backtrace:");
202                                         stack = (void *)UNW_SP(&info);
203                                         if (!stack)
204                                                 return;
205                                         ebp = UNW_FP(&info);
206                                 } else
207                                         ops->warning(data, "Full inexact backtrace again:");
208                         } else if (call_trace >= 1)
209                                 return;
210                         else
211                                 ops->warning(data, "Full inexact backtrace again:");
212                 } else
213                         ops->warning(data, "Inexact backtrace:");
214         }
215         if (!stack) {
216                 unsigned long dummy;
217                 stack = &dummy;
218                 if (task && task != current)
219                         stack = (unsigned long *)task->thread.esp;
220         }
221
222 #ifdef CONFIG_FRAME_POINTER
223         if (!ebp) {
224                 if (task == current) {
225                         /* Grab ebp right from our regs */
226                         asm ("movl %%ebp, %0" : "=r" (ebp) : );
227                 } else {
228                         /* ebp is the last reg pushed by switch_to */
229                         ebp = *(unsigned long *) task->thread.esp;
230                 }
231         }
232 #endif
233
234         while (1) {
235                 struct thread_info *context;
236                 context = (struct thread_info *)
237                         ((unsigned long)stack & (~(THREAD_SIZE - 1)));
238                 ebp = print_context_stack(context, stack, ebp, ops, data);
239                 /* Should be after the line below, but somewhere
240                    in early boot context comes out corrupted and we
241                    can't reference it -AK */
242                 if (ops->stack(data, "IRQ") < 0)
243                         break;
244                 stack = (unsigned long*)context->previous_esp;
245                 if (!stack)
246                         break;
247         }
248 }
249 EXPORT_SYMBOL(dump_trace);
250
251 static void
252 print_trace_warning_symbol(void *data, char *msg, unsigned long symbol)
253 {
254         printk(data);
255         print_symbol(msg, symbol);
256         printk("\n");
257 }
258
259 static void print_trace_warning(void *data, char *msg)
260 {
261         printk("%s%s\n", (char *)data, msg);
262 }
263
264 static int print_trace_stack(void *data, char *name)
265 {
266         return 0;
267 }
268
269 /*
270  * Print one address/symbol entries per line.
271  */
272 static void print_trace_address(void *data, unsigned long addr)
273 {
274         printk("%s [<%08lx>] ", (char *)data, addr);
275         print_symbol("%s\n", addr);
276 }
277
278 static struct stacktrace_ops print_trace_ops = {
279         .warning = print_trace_warning,
280         .warning_symbol = print_trace_warning_symbol,
281         .stack = print_trace_stack,
282         .address = print_trace_address,
283 };
284
285 static void
286 show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
287                    unsigned long * stack, char *log_lvl)
288 {
289         dump_trace(task, regs, stack, &print_trace_ops, log_lvl);
290         printk("%s =======================\n", log_lvl);
291 }
292
293 void show_trace(struct task_struct *task, struct pt_regs *regs,
294                 unsigned long * stack)
295 {
296         show_trace_log_lvl(task, regs, stack, "");
297 }
298
299 static void show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
300                                unsigned long *esp, char *log_lvl)
301 {
302         unsigned long *stack;
303         int i;
304
305         if (esp == NULL) {
306                 if (task)
307                         esp = (unsigned long*)task->thread.esp;
308                 else
309                         esp = (unsigned long *)&esp;
310         }
311
312         stack = esp;
313         for(i = 0; i < kstack_depth_to_print; i++) {
314                 if (kstack_end(stack))
315                         break;
316                 if (i && ((i % 8) == 0))
317                         printk("\n%s       ", log_lvl);
318                 printk("%08lx ", *stack++);
319         }
320         printk("\n%sCall Trace:\n", log_lvl);
321         show_trace_log_lvl(task, regs, esp, log_lvl);
322 }
323
324 void show_stack(struct task_struct *task, unsigned long *esp)
325 {
326         printk("       ");
327         show_stack_log_lvl(task, NULL, esp, "");
328 }
329
330 /*
331  * The architecture-independent dump_stack generator
332  */
333 void dump_stack(void)
334 {
335         unsigned long stack;
336
337         show_trace(current, NULL, &stack);
338 }
339
340 EXPORT_SYMBOL(dump_stack);
341
342 void show_registers(struct pt_regs *regs)
343 {
344         int i;
345         int in_kernel = 1;
346         unsigned long esp;
347         unsigned short ss;
348
349         esp = (unsigned long) (&regs->esp);
350         savesegment(ss, ss);
351         if (user_mode_vm(regs)) {
352                 in_kernel = 0;
353                 esp = regs->esp;
354                 ss = regs->xss & 0xffff;
355         }
356         print_modules();
357         printk(KERN_EMERG "CPU:    %d\nEIP:    %04x:[<%08lx>]    %s VLI\n"
358                         "EFLAGS: %08lx   (%s %.*s) \n",
359                 smp_processor_id(), 0xffff & regs->xcs, regs->eip,
360                 print_tainted(), regs->eflags, system_utsname.release,
361                 (int)strcspn(system_utsname.version, " "),
362                 system_utsname.version);
363         print_symbol(KERN_EMERG "EIP is at %s\n", regs->eip);
364         printk(KERN_EMERG "eax: %08lx   ebx: %08lx   ecx: %08lx   edx: %08lx\n",
365                 regs->eax, regs->ebx, regs->ecx, regs->edx);
366         printk(KERN_EMERG "esi: %08lx   edi: %08lx   ebp: %08lx   esp: %08lx\n",
367                 regs->esi, regs->edi, regs->ebp, esp);
368         printk(KERN_EMERG "ds: %04x   es: %04x   ss: %04x\n",
369                 regs->xds & 0xffff, regs->xes & 0xffff, ss);
370         printk(KERN_EMERG "Process %.*s (pid: %d[#%u], ti=%p task=%p task.ti=%p)",
371                 TASK_COMM_LEN, current->comm, current->pid, current->xid,
372                 current_thread_info(), current, current->thread_info);
373         /*
374          * When in-kernel, we also print out the stack and code at the
375          * time of the fault..
376          */
377         if (in_kernel) {
378                 u8 __user *eip;
379
380                 printk("\n" KERN_EMERG "Stack: ");
381                 show_stack_log_lvl(NULL, regs, (unsigned long *)esp, KERN_EMERG);
382
383                 printk(KERN_EMERG "Code: ");
384
385                 eip = (u8 __user *)regs->eip - 43;
386                 for (i = 0; i < 64; i++, eip++) {
387                         unsigned char c;
388
389                         if (eip < (u8 __user *)PAGE_OFFSET || __get_user(c, eip)) {
390                                 printk(" Bad EIP value.");
391                                 break;
392                         }
393                         if (eip == (u8 __user *)regs->eip)
394                                 printk("<%02x> ", c);
395                         else
396                                 printk("%02x ", c);
397                 }
398         }
399         printk("\n");
400 }       
401
402 static void handle_BUG(struct pt_regs *regs)
403 {
404         unsigned long eip = regs->eip;
405         unsigned short ud2;
406
407         if (eip < PAGE_OFFSET)
408                 return;
409         if (__get_user(ud2, (unsigned short __user *)eip))
410                 return;
411         if (ud2 != 0x0b0f)
412                 return;
413
414         printk(KERN_EMERG "------------[ cut here ]------------\n");
415
416 #ifdef CONFIG_DEBUG_BUGVERBOSE
417         do {
418                 unsigned short line;
419                 char *file;
420                 char c;
421
422                 if (__get_user(line, (unsigned short __user *)(eip + 2)))
423                         break;
424                 if (__get_user(file, (char * __user *)(eip + 4)) ||
425                     (unsigned long)file < PAGE_OFFSET || __get_user(c, file))
426                         file = "<bad filename>";
427
428                 printk(KERN_EMERG "kernel BUG at %s:%d!\n", file, line);
429                 return;
430         } while (0);
431 #endif
432         printk(KERN_EMERG "Kernel BUG at [verbose debug info unavailable]\n");
433 }
434
435 /* This is gone through when something in the kernel
436  * has done something bad and is about to be terminated.
437 */
438 void die(const char * str, struct pt_regs * regs, long err)
439 {
440         static struct {
441                 spinlock_t lock;
442                 u32 lock_owner;
443                 int lock_owner_depth;
444         } die = {
445                 .lock =                 SPIN_LOCK_UNLOCKED,
446                 .lock_owner =           -1,
447                 .lock_owner_depth =     0
448         };
449         static int die_counter;
450         unsigned long flags;
451
452         oops_enter();
453
454         vxh_throw_oops();
455
456         if (die.lock_owner != raw_smp_processor_id()) {
457                 console_verbose();
458                 spin_lock_irqsave(&die.lock, flags);
459                 die.lock_owner = smp_processor_id();
460                 die.lock_owner_depth = 0;
461                 bust_spinlocks(1);
462         }
463         else
464                 local_save_flags(flags);
465
466         if (++die.lock_owner_depth < 3) {
467                 int nl = 0;
468                 unsigned long esp;
469                 unsigned short ss;
470
471                 handle_BUG(regs);
472                 printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
473 #ifdef CONFIG_PREEMPT
474                 printk(KERN_EMERG "PREEMPT ");
475                 nl = 1;
476 #endif
477 #ifdef CONFIG_SMP
478                 if (!nl)
479                         printk(KERN_EMERG);
480                 printk("SMP ");
481                 nl = 1;
482 #endif
483 #ifdef CONFIG_DEBUG_PAGEALLOC
484                 if (!nl)
485                         printk(KERN_EMERG);
486                 printk("DEBUG_PAGEALLOC");
487                 nl = 1;
488 #endif
489                 if (nl)
490                         printk("\n");
491 #ifdef CONFIG_SYSFS
492                 printk(KERN_ALERT "last sysfs file: %s\n", last_sysfs_file);
493 #endif
494                 if (notify_die(DIE_OOPS, str, regs, err,
495                         current->thread.trap_no, SIGSEGV) != NOTIFY_STOP) {
496                         show_registers(regs);
497                         vxh_dump_history();
498                         /* Executive summary in case the oops scrolled away */
499                         esp = (unsigned long) (&regs->esp);
500                         savesegment(ss, ss);
501                         if (user_mode(regs)) {
502                                 esp = regs->esp;
503                                 ss = regs->xss & 0xffff;
504                         }
505                         printk(KERN_EMERG "EIP: [<%08lx>] ", regs->eip);
506                         print_symbol("%s", regs->eip);
507                         printk(" SS:ESP %04x:%08lx\n", ss, esp);
508                 }
509                 else
510                         regs = NULL;
511         } else
512                 printk(KERN_EMERG "Recursive die() failure, output suppressed\n");
513
514         bust_spinlocks(0);
515         die.lock_owner = -1;
516         spin_unlock_irqrestore(&die.lock, flags);
517
518         if (!regs)
519                 return;
520
521         if (kexec_should_crash(current))
522                 crash_kexec(regs);
523
524         if (in_interrupt())
525                 panic("Fatal exception in interrupt");
526
527         if (panic_on_oops)
528                 panic("Fatal exception");
529
530         oops_exit();
531         do_exit(SIGSEGV);
532 }
533
534 static inline void die_if_kernel(const char * str, struct pt_regs * regs, long err)
535 {
536         if (!user_mode_vm(regs))
537                 die(str, regs, err);
538 }
539
540 static void __kprobes do_trap(int trapnr, int signr, char *str, int vm86,
541                               struct pt_regs * regs, long error_code,
542                               siginfo_t *info)
543 {
544         struct task_struct *tsk = current;
545         tsk->thread.error_code = error_code;
546         tsk->thread.trap_no = trapnr;
547
548         if (regs->eflags & VM_MASK) {
549                 if (vm86)
550                         goto vm86_trap;
551                 goto trap_signal;
552         }
553
554         if (!user_mode(regs))
555                 goto kernel_trap;
556
557         trap_signal: {
558                 if (info)
559                         force_sig_info(signr, info, tsk);
560                 else
561                         force_sig(signr, tsk);
562                 return;
563         }
564
565         kernel_trap: {
566                 if (!fixup_exception(regs))
567                         die(str, regs, error_code);
568                 return;
569         }
570
571         vm86_trap: {
572                 int ret = handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, trapnr);
573                 if (ret) goto trap_signal;
574                 return;
575         }
576 }
577
578 #define DO_ERROR(trapnr, signr, str, name) \
579 fastcall void do_##name(struct pt_regs * regs, long error_code) \
580 { \
581         if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
582                                                 == NOTIFY_STOP) \
583                 return; \
584         do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \
585 }
586
587 #define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
588 fastcall void do_##name(struct pt_regs * regs, long error_code) \
589 { \
590         siginfo_t info; \
591         info.si_signo = signr; \
592         info.si_errno = 0; \
593         info.si_code = sicode; \
594         info.si_addr = (void __user *)siaddr; \
595         if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
596                                                 == NOTIFY_STOP) \
597                 return; \
598         do_trap(trapnr, signr, str, 0, regs, error_code, &info); \
599 }
600
601 #define DO_VM86_ERROR(trapnr, signr, str, name) \
602 fastcall void do_##name(struct pt_regs * regs, long error_code) \
603 { \
604         if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
605                                                 == NOTIFY_STOP) \
606                 return; \
607         do_trap(trapnr, signr, str, 1, regs, error_code, NULL); \
608 }
609
610 #define DO_VM86_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
611 fastcall void do_##name(struct pt_regs * regs, long error_code) \
612 { \
613         siginfo_t info; \
614         info.si_signo = signr; \
615         info.si_errno = 0; \
616         info.si_code = sicode; \
617         info.si_addr = (void __user *)siaddr; \
618         if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
619                                                 == NOTIFY_STOP) \
620                 return; \
621         do_trap(trapnr, signr, str, 1, regs, error_code, &info); \
622 }
623
624 DO_VM86_ERROR_INFO( 0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->eip)
625 #ifndef CONFIG_KPROBES
626 DO_VM86_ERROR( 3, SIGTRAP, "int3", int3)
627 #endif
628 DO_VM86_ERROR( 4, SIGSEGV, "overflow", overflow)
629 DO_VM86_ERROR( 5, SIGSEGV, "bounds", bounds)
630 DO_ERROR_INFO( 6, SIGILL,  "invalid opcode", invalid_op, ILL_ILLOPN, regs->eip)
631 DO_ERROR( 9, SIGFPE,  "coprocessor segment overrun", coprocessor_segment_overrun)
632 DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
633 DO_ERROR(11, SIGBUS,  "segment not present", segment_not_present)
634 DO_ERROR(12, SIGBUS,  "stack segment", stack_segment)
635 DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
636
637
638 /*
639  * lazy-check for CS validity on exec-shield binaries:
640  *
641  * the original non-exec stack patch was written by
642  * Solar Designer <solar at openwall.com>. Thanks!
643  */
644 static int
645 check_lazy_exec_limit(int cpu, struct pt_regs *regs, long error_code)
646 {
647         struct desc_struct *desc1, *desc2;
648         struct vm_area_struct *vma;
649         unsigned long limit;
650
651         if (current->mm == NULL)
652                 return 0;
653
654         limit = -1UL;
655         if (current->mm->context.exec_limit != -1UL) {
656                 limit = PAGE_SIZE;
657                 spin_lock(&current->mm->page_table_lock);
658                 for (vma = current->mm->mmap; vma; vma = vma->vm_next)
659                         if ((vma->vm_flags & VM_EXEC) && (vma->vm_end > limit))
660                                 limit = vma->vm_end;
661                 spin_unlock(&current->mm->page_table_lock);
662                 if (limit >= TASK_SIZE)
663                         limit = -1UL;
664                 current->mm->context.exec_limit = limit;
665         }
666         set_user_cs(&current->mm->context.user_cs, limit);
667
668         desc1 = &current->mm->context.user_cs;
669         desc2 = get_cpu_gdt_table(cpu) + GDT_ENTRY_DEFAULT_USER_CS;
670
671         if (desc1->a != desc2->a || desc1->b != desc2->b) {
672                 /*
673                  * The CS was not in sync - reload it and retry the
674                  * instruction. If the instruction still faults then
675                  * we won't hit this branch next time around.
676                  */
677                 if (print_fatal_signals >= 2) {
678                         printk("#GPF fixup (%ld[seg:%lx]) at %08lx, CPU#%d.\n", error_code, error_code/8, regs->eip, smp_processor_id());
679                         printk(" exec_limit: %08lx, user_cs: %08lx/%08lx, CPU_cs: %08lx/%08lx.\n", current->mm->context.exec_limit, desc1->a, desc1->b, desc2->a, desc2->b);
680                 }
681                 load_user_cs_desc(cpu, current->mm);
682                 return 1;
683         }
684
685         return 0;
686 }
687
688 /*
689  * The fixup code for errors in iret jumps to here (iret_exc).  It loses
690  * the original trap number and error code.  The bogus trap 32 and error
691  * code 0 are what the vanilla kernel delivers via:
692  * DO_ERROR_INFO(32, SIGSEGV, "iret exception", iret_error, ILL_BADSTK, 0)
693  *
694  * In case of a general protection fault in the iret instruction, we
695  * need to check for a lazy CS update for exec-shield.
696  */
697 fastcall void do_iret_error(struct pt_regs *regs, long error_code)
698 {
699         int ok = check_lazy_exec_limit(get_cpu(), regs, error_code);
700         put_cpu();
701         if (!ok && notify_die(DIE_TRAP, "iret exception", regs,
702                               error_code, 32, SIGSEGV) != NOTIFY_STOP) {
703                 siginfo_t info;
704                 info.si_signo = SIGSEGV;
705                 info.si_errno = 0;
706                 info.si_code = ILL_BADSTK;
707                 info.si_addr = 0;
708                 do_trap(32, SIGSEGV, "iret exception", 0, regs, error_code,
709                         &info);
710         }
711 }
712
713 fastcall void __kprobes do_general_protection(struct pt_regs * regs,
714                                               long error_code)
715 {
716         int cpu = get_cpu();
717         struct tss_struct *tss = &per_cpu(init_tss, cpu);
718         struct thread_struct *thread = &current->thread;
719         int ok;
720
721         /*
722          * Perform the lazy TSS's I/O bitmap copy. If the TSS has an
723          * invalid offset set (the LAZY one) and the faulting thread has
724          * a valid I/O bitmap pointer, we copy the I/O bitmap in the TSS
725          * and we set the offset field correctly. Then we let the CPU to
726          * restart the faulting instruction.
727          */
728         if (tss->io_bitmap_base == INVALID_IO_BITMAP_OFFSET_LAZY &&
729             thread->io_bitmap_ptr) {
730                 memcpy(tss->io_bitmap, thread->io_bitmap_ptr,
731                        thread->io_bitmap_max);
732                 /*
733                  * If the previously set map was extending to higher ports
734                  * than the current one, pad extra space with 0xff (no access).
735                  */
736                 if (thread->io_bitmap_max < tss->io_bitmap_max)
737                         memset((char *) tss->io_bitmap +
738                                 thread->io_bitmap_max, 0xff,
739                                 tss->io_bitmap_max - thread->io_bitmap_max);
740                 tss->io_bitmap_max = thread->io_bitmap_max;
741                 tss->io_bitmap_base = IO_BITMAP_OFFSET;
742                 tss->io_bitmap_owner = thread;
743                 put_cpu();
744                 return;
745         }
746
747         current->thread.error_code = error_code;
748         current->thread.trap_no = 13;
749
750         if (regs->eflags & VM_MASK)
751                 goto gp_in_vm86;
752
753         if (!user_mode(regs))
754                 goto gp_in_kernel;
755
756         ok = check_lazy_exec_limit(cpu, regs, error_code);
757
758         put_cpu();
759
760         if (ok)
761                 return;
762
763         if (print_fatal_signals) {
764                 printk("#GPF(%ld[seg:%lx]) at %08lx, CPU#%d.\n", error_code, error_code/8, regs->eip, smp_processor_id());
765                 printk(" exec_limit: %08lx, user_cs: %08lx/%08lx.\n", current->mm->context.exec_limit, current->mm->context.user_cs.a, current->mm->context.user_cs.b);
766         }
767
768         current->thread.error_code = error_code;
769         current->thread.trap_no = 13;
770         force_sig(SIGSEGV, current);
771         return;
772
773 gp_in_vm86:
774         put_cpu();
775         local_irq_enable();
776         handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code);
777         return;
778
779 gp_in_kernel:
780         put_cpu();
781         if (!fixup_exception(regs)) {
782                 if (notify_die(DIE_GPF, "general protection fault", regs,
783                                 error_code, 13, SIGSEGV) == NOTIFY_STOP)
784                         return;
785                 die("general protection fault", regs, error_code);
786         }
787 }
788
789 static void mem_parity_error(unsigned char reason, struct pt_regs * regs)
790 {
791         printk(KERN_EMERG "Uhhuh. NMI received. Dazed and confused, but trying "
792                         "to continue\n");
793         printk(KERN_EMERG "You probably have a hardware problem with your RAM "
794                         "chips\n");
795
796         /* Clear and disable the memory parity error line. */
797         clear_mem_error(reason);
798 }
799
800 static void io_check_error(unsigned char reason, struct pt_regs * regs)
801 {
802         printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
803         show_registers(regs);
804
805         /* Re-enable the IOCK line, wait for a few seconds */
806         clear_io_check_error(reason);
807 }
808
809 static void unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
810 {
811 #ifdef CONFIG_MCA
812         /* Might actually be able to figure out what the guilty party
813         * is. */
814         if( MCA_bus ) {
815                 mca_handle_nmi();
816                 return;
817         }
818 #endif
819         printk("Uhhuh. NMI received for unknown reason %02x on CPU %d.\n",
820                 reason, smp_processor_id());
821         printk("Dazed and confused, but trying to continue\n");
822         printk("Do you have a strange power saving mode enabled?\n");
823 }
824
825 static DEFINE_SPINLOCK(nmi_print_lock);
826
827 void die_nmi (struct pt_regs *regs, const char *msg)
828 {
829         if (notify_die(DIE_NMIWATCHDOG, msg, regs, 0, 2, SIGINT) ==
830             NOTIFY_STOP)
831                 return;
832
833         spin_lock(&nmi_print_lock);
834         /*
835         * We are in trouble anyway, lets at least try
836         * to get a message out.
837         */
838         bust_spinlocks(1);
839         printk(KERN_EMERG "%s", msg);
840         printk(" on CPU%d, eip %08lx, registers:\n",
841                 smp_processor_id(), regs->eip);
842         show_registers(regs);
843         console_silent();
844         spin_unlock(&nmi_print_lock);
845         bust_spinlocks(0);
846
847         /* If we are in kernel we are probably nested up pretty bad
848          * and might aswell get out now while we still can.
849         */
850         if (!user_mode_vm(regs)) {
851                 current->thread.trap_no = 2;
852                 crash_kexec(regs);
853         }
854
855         do_exit(SIGSEGV);
856 }
857
858 static void default_do_nmi(struct pt_regs * regs)
859 {
860         unsigned char reason = 0;
861
862         /* Only the BSP gets external NMIs from the system.  */
863         if (!smp_processor_id())
864                 reason = get_nmi_reason();
865  
866         if (!(reason & 0xc0)) {
867                 if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT)
868                                                         == NOTIFY_STOP)
869                         return;
870 #ifdef CONFIG_X86_LOCAL_APIC
871                 /*
872                  * Ok, so this is none of the documented NMI sources,
873                  * so it must be the NMI watchdog.
874                  */
875                 if (nmi_watchdog) {
876                         nmi_watchdog_tick(regs);
877                         return;
878                 }
879 #endif
880                 unknown_nmi_error(reason, regs);
881                 return;
882         }
883         if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP)
884                 return;
885         if (reason & 0x80)
886                 mem_parity_error(reason, regs);
887         if (reason & 0x40)
888                 io_check_error(reason, regs);
889         /*
890          * Reassert NMI in case it became active meanwhile
891          * as it's edge-triggered.
892          */
893         reassert_nmi();
894 }
895
896 static int dummy_nmi_callback(struct pt_regs * regs, int cpu)
897 {
898         return 0;
899 }
900  
901 static nmi_callback_t nmi_callback = dummy_nmi_callback;
902  
903 fastcall void do_nmi(struct pt_regs * regs, long error_code)
904 {
905         int cpu;
906
907         nmi_enter();
908
909         cpu = smp_processor_id();
910
911         ++nmi_count(cpu);
912
913         if (!rcu_dereference(nmi_callback)(regs, cpu))
914                 default_do_nmi(regs);
915
916         nmi_exit();
917 }
918
919 void set_nmi_callback(nmi_callback_t callback)
920 {
921         vmalloc_sync_all();
922         rcu_assign_pointer(nmi_callback, callback);
923 }
924 EXPORT_SYMBOL_GPL(set_nmi_callback);
925
926 void unset_nmi_callback(void)
927 {
928         nmi_callback = dummy_nmi_callback;
929 }
930 EXPORT_SYMBOL_GPL(unset_nmi_callback);
931
932 #ifdef CONFIG_KPROBES
933 fastcall void __kprobes do_int3(struct pt_regs *regs, long error_code)
934 {
935         if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP)
936                         == NOTIFY_STOP)
937                 return;
938         /* This is an interrupt gate, because kprobes wants interrupts
939         disabled.  Normal trap handlers don't. */
940         restore_interrupts(regs);
941         do_trap(3, SIGTRAP, "int3", 1, regs, error_code, NULL);
942 }
943 #endif
944
945 /*
946  * Our handling of the processor debug registers is non-trivial.
947  * We do not clear them on entry and exit from the kernel. Therefore
948  * it is possible to get a watchpoint trap here from inside the kernel.
949  * However, the code in ./ptrace.c has ensured that the user can
950  * only set watchpoints on userspace addresses. Therefore the in-kernel
951  * watchpoint trap can only occur in code which is reading/writing
952  * from user space. Such code must not hold kernel locks (since it
953  * can equally take a page fault), therefore it is safe to call
954  * force_sig_info even though that claims and releases locks.
955  * 
956  * Code in ./signal.c ensures that the debug control register
957  * is restored before we deliver any signal, and therefore that
958  * user code runs with the correct debug control register even though
959  * we clear it here.
960  *
961  * Being careful here means that we don't have to be as careful in a
962  * lot of more complicated places (task switching can be a bit lazy
963  * about restoring all the debug state, and ptrace doesn't have to
964  * find every occurrence of the TF bit that could be saved away even
965  * by user code)
966  */
967 fastcall void __kprobes do_debug(struct pt_regs * regs, long error_code)
968 {
969         unsigned int condition;
970         struct task_struct *tsk = current;
971
972         get_debugreg(condition, 6);
973
974         if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code,
975                                         SIGTRAP) == NOTIFY_STOP)
976                 return;
977         /* It's safe to allow irq's after DR6 has been saved */
978         if (regs->eflags & X86_EFLAGS_IF)
979                 local_irq_enable();
980
981         /* Mask out spurious debug traps due to lazy DR7 setting */
982         if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) {
983                 if (!tsk->thread.debugreg[7])
984                         goto clear_dr7;
985         }
986
987         if (regs->eflags & VM_MASK)
988                 goto debug_vm86;
989
990         /* Save debug status register where ptrace can see it */
991         tsk->thread.debugreg[6] = condition;
992
993         /*
994          * Single-stepping through TF: make sure we ignore any events in
995          * kernel space (but re-enable TF when returning to user mode).
996          */
997         if (condition & DR_STEP) {
998                 /*
999                  * We already checked v86 mode above, so we can
1000                  * check for kernel mode by just checking the CPL
1001                  * of CS.
1002                  */
1003                 if (!user_mode(regs))
1004                         goto clear_TF_reenable;
1005         }
1006
1007         /* Ok, finally something we can handle */
1008         send_sigtrap(tsk, regs, error_code);
1009
1010         /* Disable additional traps. They'll be re-enabled when
1011          * the signal is delivered.
1012          */
1013 clear_dr7:
1014         set_debugreg(0, 7);
1015         return;
1016
1017 debug_vm86:
1018         handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1);
1019         return;
1020
1021 clear_TF_reenable:
1022         set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
1023         regs->eflags &= ~TF_MASK;
1024         return;
1025 }
1026
1027 /*
1028  * Note that we play around with the 'TS' bit in an attempt to get
1029  * the correct behaviour even in the presence of the asynchronous
1030  * IRQ13 behaviour
1031  */
1032 void math_error(void __user *eip)
1033 {
1034         struct task_struct * task;
1035         siginfo_t info;
1036         unsigned short cwd, swd;
1037
1038         /*
1039          * Save the info for the exception handler and clear the error.
1040          */
1041         task = current;
1042         save_init_fpu(task);
1043         task->thread.trap_no = 16;
1044         task->thread.error_code = 0;
1045         info.si_signo = SIGFPE;
1046         info.si_errno = 0;
1047         info.si_code = __SI_FAULT;
1048         info.si_addr = eip;
1049         /*
1050          * (~cwd & swd) will mask out exceptions that are not set to unmasked
1051          * status.  0x3f is the exception bits in these regs, 0x200 is the
1052          * C1 reg you need in case of a stack fault, 0x040 is the stack
1053          * fault bit.  We should only be taking one exception at a time,
1054          * so if this combination doesn't produce any single exception,
1055          * then we have a bad program that isn't syncronizing its FPU usage
1056          * and it will suffer the consequences since we won't be able to
1057          * fully reproduce the context of the exception
1058          */
1059         cwd = get_fpu_cwd(task);
1060         swd = get_fpu_swd(task);
1061         switch (swd & ~cwd & 0x3f) {
1062                 case 0x000: /* No unmasked exception */
1063                         return;
1064                 default:    /* Multiple exceptions */
1065                         break;
1066                 case 0x001: /* Invalid Op */
1067                         /*
1068                          * swd & 0x240 == 0x040: Stack Underflow
1069                          * swd & 0x240 == 0x240: Stack Overflow
1070                          * User must clear the SF bit (0x40) if set
1071                          */
1072                         info.si_code = FPE_FLTINV;
1073                         break;
1074                 case 0x002: /* Denormalize */
1075                 case 0x010: /* Underflow */
1076                         info.si_code = FPE_FLTUND;
1077                         break;
1078                 case 0x004: /* Zero Divide */
1079                         info.si_code = FPE_FLTDIV;
1080                         break;
1081                 case 0x008: /* Overflow */
1082                         info.si_code = FPE_FLTOVF;
1083                         break;
1084                 case 0x020: /* Precision */
1085                         info.si_code = FPE_FLTRES;
1086                         break;
1087         }
1088         force_sig_info(SIGFPE, &info, task);
1089 }
1090
1091 fastcall void do_coprocessor_error(struct pt_regs * regs, long error_code)
1092 {
1093         ignore_fpu_irq = 1;
1094         math_error((void __user *)regs->eip);
1095 }
1096
1097 static void simd_math_error(void __user *eip)
1098 {
1099         struct task_struct * task;
1100         siginfo_t info;
1101         unsigned short mxcsr;
1102
1103         /*
1104          * Save the info for the exception handler and clear the error.
1105          */
1106         task = current;
1107         save_init_fpu(task);
1108         task->thread.trap_no = 19;
1109         task->thread.error_code = 0;
1110         info.si_signo = SIGFPE;
1111         info.si_errno = 0;
1112         info.si_code = __SI_FAULT;
1113         info.si_addr = eip;
1114         /*
1115          * The SIMD FPU exceptions are handled a little differently, as there
1116          * is only a single status/control register.  Thus, to determine which
1117          * unmasked exception was caught we must mask the exception mask bits
1118          * at 0x1f80, and then use these to mask the exception bits at 0x3f.
1119          */
1120         mxcsr = get_fpu_mxcsr(task);
1121         switch (~((mxcsr & 0x1f80) >> 7) & (mxcsr & 0x3f)) {
1122                 case 0x000:
1123                 default:
1124                         break;
1125                 case 0x001: /* Invalid Op */
1126                         info.si_code = FPE_FLTINV;
1127                         break;
1128                 case 0x002: /* Denormalize */
1129                 case 0x010: /* Underflow */
1130                         info.si_code = FPE_FLTUND;
1131                         break;
1132                 case 0x004: /* Zero Divide */
1133                         info.si_code = FPE_FLTDIV;
1134                         break;
1135                 case 0x008: /* Overflow */
1136                         info.si_code = FPE_FLTOVF;
1137                         break;
1138                 case 0x020: /* Precision */
1139                         info.si_code = FPE_FLTRES;
1140                         break;
1141         }
1142         force_sig_info(SIGFPE, &info, task);
1143 }
1144
1145 fastcall void do_simd_coprocessor_error(struct pt_regs * regs,
1146                                           long error_code)
1147 {
1148         if (cpu_has_xmm) {
1149                 /* Handle SIMD FPU exceptions on PIII+ processors. */
1150                 ignore_fpu_irq = 1;
1151                 simd_math_error((void __user *)regs->eip);
1152         } else {
1153                 /*
1154                  * Handle strange cache flush from user space exception
1155                  * in all other cases.  This is undocumented behaviour.
1156                  */
1157                 if (regs->eflags & VM_MASK) {
1158                         handle_vm86_fault((struct kernel_vm86_regs *)regs,
1159                                           error_code);
1160                         return;
1161                 }
1162                 current->thread.trap_no = 19;
1163                 current->thread.error_code = error_code;
1164                 die_if_kernel("cache flush denied", regs, error_code);
1165                 force_sig(SIGSEGV, current);
1166         }
1167 }
1168
1169 fastcall void do_spurious_interrupt_bug(struct pt_regs * regs,
1170                                           long error_code)
1171 {
1172 #if 0
1173         /* No need to warn about this any longer. */
1174         printk("Ignoring P6 Local APIC Spurious Interrupt Bug...\n");
1175 #endif
1176 }
1177
1178 fastcall void setup_x86_bogus_stack(unsigned char * stk)
1179 {
1180         unsigned long *switch16_ptr, *switch32_ptr;
1181         struct pt_regs *regs;
1182         unsigned long stack_top, stack_bot;
1183         unsigned short iret_frame16_off;
1184         int cpu = smp_processor_id();
1185         /* reserve the space on 32bit stack for the magic switch16 pointer */
1186         memmove(stk, stk + 8, sizeof(struct pt_regs));
1187         switch16_ptr = (unsigned long *)(stk + sizeof(struct pt_regs));
1188         regs = (struct pt_regs *)stk;
1189         /* now the switch32 on 16bit stack */
1190         stack_bot = (unsigned long)&per_cpu(cpu_16bit_stack, cpu);
1191         stack_top = stack_bot + CPU_16BIT_STACK_SIZE;
1192         switch32_ptr = (unsigned long *)(stack_top - 8);
1193         iret_frame16_off = CPU_16BIT_STACK_SIZE - 8 - 20;
1194         /* copy iret frame on 16bit stack */
1195         memcpy((void *)(stack_bot + iret_frame16_off), &regs->eip, 20);
1196         /* fill in the switch pointers */
1197         switch16_ptr[0] = (regs->esp & 0xffff0000) | iret_frame16_off;
1198         switch16_ptr[1] = __ESPFIX_SS;
1199         switch32_ptr[0] = (unsigned long)stk + sizeof(struct pt_regs) +
1200                 8 - CPU_16BIT_STACK_SIZE;
1201         switch32_ptr[1] = __KERNEL_DS;
1202 }
1203
1204 fastcall unsigned char * fixup_x86_bogus_stack(unsigned short sp)
1205 {
1206         unsigned long *switch32_ptr;
1207         unsigned char *stack16, *stack32;
1208         unsigned long stack_top, stack_bot;
1209         int len;
1210         int cpu = smp_processor_id();
1211         stack_bot = (unsigned long)&per_cpu(cpu_16bit_stack, cpu);
1212         stack_top = stack_bot + CPU_16BIT_STACK_SIZE;
1213         switch32_ptr = (unsigned long *)(stack_top - 8);
1214         /* copy the data from 16bit stack to 32bit stack */
1215         len = CPU_16BIT_STACK_SIZE - 8 - sp;
1216         stack16 = (unsigned char *)(stack_bot + sp);
1217         stack32 = (unsigned char *)
1218                 (switch32_ptr[0] + CPU_16BIT_STACK_SIZE - 8 - len);
1219         memcpy(stack32, stack16, len);
1220         return stack32;
1221 }
1222
1223 /*
1224  *  'math_state_restore()' saves the current math information in the
1225  * old math state array, and gets the new ones from the current task
1226  *
1227  * Careful.. There are problems with IBM-designed IRQ13 behaviour.
1228  * Don't touch unless you *really* know how it works.
1229  *
1230  * Must be called with kernel preemption disabled (in this case,
1231  * local interrupts are disabled at the call-site in entry.S).
1232  */
1233 asmlinkage void math_state_restore(struct pt_regs regs)
1234 {
1235         struct thread_info *thread = current_thread_info();
1236         struct task_struct *tsk = thread->task;
1237
1238         clts();         /* Allow maths ops (or we recurse) */
1239         if (!tsk_used_math(tsk))
1240                 init_fpu(tsk);
1241         restore_fpu(tsk);
1242         thread->status |= TS_USEDFPU;   /* So we fnsave on switch_to() */
1243 }
1244
1245 #ifndef CONFIG_MATH_EMULATION
1246
1247 asmlinkage void math_emulate(long arg)
1248 {
1249         printk(KERN_EMERG "math-emulation not enabled and no coprocessor found.\n");
1250         printk(KERN_EMERG "killing %s.\n",current->comm);
1251         force_sig(SIGFPE,current);
1252         schedule();
1253 }
1254
1255 #endif /* CONFIG_MATH_EMULATION */
1256
1257 #ifdef CONFIG_X86_F00F_BUG
1258 void __init trap_init_f00f_bug(void)
1259 {
1260         __set_fixmap(FIX_F00F_IDT, __pa(&idt_table), PAGE_KERNEL_RO);
1261
1262         /*
1263          * Update the IDT descriptor and reload the IDT so that
1264          * it uses the read-only mapped virtual address.
1265          */
1266         idt_descr.address = fix_to_virt(FIX_F00F_IDT);
1267         load_idt(&idt_descr);
1268 }
1269 #endif
1270
1271 #define _set_gate(gate_addr,type,dpl,addr,seg) \
1272 do { \
1273   int __d0, __d1; \
1274   __asm__ __volatile__ ("movw %%dx,%%ax\n\t" \
1275         "movw %4,%%dx\n\t" \
1276         "movl %%eax,%0\n\t" \
1277         "movl %%edx,%1" \
1278         :"=m" (*((long *) (gate_addr))), \
1279          "=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \
1280         :"i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
1281          "3" ((char *) (addr)),"2" ((seg) << 16)); \
1282 } while (0)
1283
1284
1285 /*
1286  * This needs to use 'idt_table' rather than 'idt', and
1287  * thus use the _nonmapped_ version of the IDT, as the
1288  * Pentium F0 0F bugfix can have resulted in the mapped
1289  * IDT being write-protected.
1290  */
1291 void set_intr_gate(unsigned int n, void *addr)
1292 {
1293         _set_gate(idt_table+n,14,0,addr,__KERNEL_CS);
1294 }
1295
1296 /*
1297  * This routine sets up an interrupt gate at directory privilege level 3.
1298  */
1299 static inline void set_system_intr_gate(unsigned int n, void *addr)
1300 {
1301         _set_gate(idt_table+n, 14, 3, addr, __KERNEL_CS);
1302 }
1303
1304 static void __init set_trap_gate(unsigned int n, void *addr)
1305 {
1306         _set_gate(idt_table+n,15,0,addr,__KERNEL_CS);
1307 }
1308
1309 static void __init set_system_gate(unsigned int n, void *addr)
1310 {
1311         _set_gate(idt_table+n,15,3,addr,__KERNEL_CS);
1312 }
1313
1314 static void __init set_task_gate(unsigned int n, unsigned int gdt_entry)
1315 {
1316         _set_gate(idt_table+n,5,0,0,(gdt_entry<<3));
1317 }
1318
1319
1320 void __init trap_init(void)
1321 {
1322 #ifdef CONFIG_EISA
1323         void __iomem *p = ioremap(0x0FFFD9, 4);
1324         if (readl(p) == 'E'+('I'<<8)+('S'<<16)+('A'<<24)) {
1325                 EISA_bus = 1;
1326         }
1327         iounmap(p);
1328 #endif
1329
1330 #ifdef CONFIG_X86_LOCAL_APIC
1331         init_apic_mappings();
1332 #endif
1333
1334         set_trap_gate(0,&divide_error);
1335         set_intr_gate(1,&debug);
1336         set_intr_gate(2,&nmi);
1337         set_system_intr_gate(3, &int3); /* int3/4 can be called from all */
1338         set_system_gate(4,&overflow);
1339         set_trap_gate(5,&bounds);
1340         set_trap_gate(6,&invalid_op);
1341         set_trap_gate(7,&device_not_available);
1342         set_task_gate(8,GDT_ENTRY_DOUBLEFAULT_TSS);
1343         set_trap_gate(9,&coprocessor_segment_overrun);
1344         set_trap_gate(10,&invalid_TSS);
1345         set_trap_gate(11,&segment_not_present);
1346         set_trap_gate(12,&stack_segment);
1347         set_trap_gate(13,&general_protection);
1348         set_intr_gate(14,&page_fault);
1349         set_trap_gate(15,&spurious_interrupt_bug);
1350         set_trap_gate(16,&coprocessor_error);
1351         set_trap_gate(17,&alignment_check);
1352 #ifdef CONFIG_X86_MCE
1353         set_trap_gate(18,&machine_check);
1354 #endif
1355         set_trap_gate(19,&simd_coprocessor_error);
1356
1357         if (cpu_has_fxsr) {
1358                 /*
1359                  * Verify that the FXSAVE/FXRSTOR data will be 16-byte aligned.
1360                  * Generates a compile-time "error: zero width for bit-field" if
1361                  * the alignment is wrong.
1362                  */
1363                 struct fxsrAlignAssert {
1364                         int _:!(offsetof(struct task_struct,
1365                                         thread.i387.fxsave) & 15);
1366                 };
1367
1368                 printk(KERN_INFO "Enabling fast FPU save and restore... ");
1369                 set_in_cr4(X86_CR4_OSFXSR);
1370                 printk("done.\n");
1371         }
1372         if (cpu_has_xmm) {
1373                 printk(KERN_INFO "Enabling unmasked SIMD FPU exception "
1374                                 "support... ");
1375                 set_in_cr4(X86_CR4_OSXMMEXCPT);
1376                 printk("done.\n");
1377         }
1378
1379         set_system_gate(SYSCALL_VECTOR,&system_call);
1380
1381         /*
1382          * Should be a barrier for any external CPU state.
1383          */
1384         cpu_init();
1385
1386         trap_init_hook();
1387 }
1388
1389 static int __init kstack_setup(char *s)
1390 {
1391         kstack_depth_to_print = simple_strtoul(s, NULL, 0);
1392         return 1;
1393 }
1394 __setup("kstack=", kstack_setup);
1395
1396 #ifdef CONFIG_STACK_UNWIND
1397 static int __init call_trace_setup(char *s)
1398 {
1399         if (strcmp(s, "old") == 0)
1400                 call_trace = -1;
1401         else if (strcmp(s, "both") == 0)
1402                 call_trace = 0;
1403         else if (strcmp(s, "newfallback") == 0)
1404                 call_trace = 1;
1405         else if (strcmp(s, "new") == 2)
1406                 call_trace = 2;
1407         return 1;
1408 }
1409 __setup("call_trace=", call_trace_setup);
1410 #endif