traps.c 25 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2
/*
 *  Copyright (C) 1991, 1992  Linus Torvalds
3
 *  Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs
Linus Torvalds's avatar
Linus Torvalds committed
4 5 6 7 8 9
 *
 *  Pentium III FXSR, SSE support
 *	Gareth Hughes <gareth@valinux.com>, May 2000
 */

/*
10
 * Handle hardware traps and faults.
Linus Torvalds's avatar
Linus Torvalds committed
11
 */
Ingo Molnar's avatar
Ingo Molnar committed
12 13 14 15 16 17 18
#include <linux/interrupt.h>
#include <linux/kallsyms.h>
#include <linux/spinlock.h>
#include <linux/kprobes.h>
#include <linux/uaccess.h>
#include <linux/utsname.h>
#include <linux/kdebug.h>
Linus Torvalds's avatar
Linus Torvalds committed
19
#include <linux/kernel.h>
Ingo Molnar's avatar
Ingo Molnar committed
20 21
#include <linux/module.h>
#include <linux/ptrace.h>
Linus Torvalds's avatar
Linus Torvalds committed
22
#include <linux/string.h>
Ingo Molnar's avatar
Ingo Molnar committed
23
#include <linux/delay.h>
Linus Torvalds's avatar
Linus Torvalds committed
24
#include <linux/errno.h>
Ingo Molnar's avatar
Ingo Molnar committed
25 26
#include <linux/kexec.h>
#include <linux/sched.h>
Linus Torvalds's avatar
Linus Torvalds committed
27 28
#include <linux/timer.h>
#include <linux/init.h>
29
#include <linux/bug.h>
Ingo Molnar's avatar
Ingo Molnar committed
30 31
#include <linux/nmi.h>
#include <linux/mm.h>
32 33
#include <linux/smp.h>
#include <linux/io.h>
Linus Torvalds's avatar
Linus Torvalds committed
34 35 36 37 38 39 40 41 42 43

#ifdef CONFIG_EISA
#include <linux/ioport.h>
#include <linux/eisa.h>
#endif

#ifdef CONFIG_MCA
#include <linux/mca.h>
#endif

44 45 46 47
#if defined(CONFIG_EDAC)
#include <linux/edac.h>
#endif

Ingo Molnar's avatar
Ingo Molnar committed
48
#include <asm/stacktrace.h>
Linus Torvalds's avatar
Linus Torvalds committed
49 50
#include <asm/processor.h>
#include <asm/debugreg.h>
Ingo Molnar's avatar
Ingo Molnar committed
51 52
#include <asm/atomic.h>
#include <asm/system.h>
53
#include <asm/traps.h>
Linus Torvalds's avatar
Linus Torvalds committed
54 55
#include <asm/desc.h>
#include <asm/i387.h>
56

57
#include <asm/mach_traps.h>
58

59 60 61 62
#ifdef CONFIG_X86_64
#include <asm/pgalloc.h>
#include <asm/proto.h>
#else
63 64
#include <asm/processor-flags.h>
#include <asm/arch_hooks.h>
65
#include <asm/traps.h>
Linus Torvalds's avatar
Linus Torvalds committed
66

67
#include "cpu/mcheck/mce.h"
Linus Torvalds's avatar
Linus Torvalds committed
68 69 70 71

asmlinkage int system_call(void);

/* Do we ignore FPU interrupts ? */
Ingo Molnar's avatar
Ingo Molnar committed
72
char ignore_fpu_irq;
Linus Torvalds's avatar
Linus Torvalds committed
73 74 75 76 77 78

/*
 * The IDT has to be page-aligned to simplify the Pentium
 * F0 0F bug workaround.. We have a special link segment
 * for this.
 */
79
gate_desc idt_table[256]
80
	__attribute__((__section__(".data.idt"))) = { { { { 0, 0 } } }, };
81
#endif
Linus Torvalds's avatar
Linus Torvalds committed
82

83 84 85
DECLARE_BITMAP(used_vectors, NR_VECTORS);
EXPORT_SYMBOL_GPL(used_vectors);

86
static int ignore_nmis;
87

88 89 90 91 92 93
static inline void conditional_sti(struct pt_regs *regs)
{
	if (regs->flags & X86_EFLAGS_IF)
		local_irq_enable();
}

94 95 96 97 98 99 100 101 102 103 104 105 106 107
static inline void preempt_conditional_sti(struct pt_regs *regs)
{
	inc_preempt_count();
	if (regs->flags & X86_EFLAGS_IF)
		local_irq_enable();
}

static inline void preempt_conditional_cli(struct pt_regs *regs)
{
	if (regs->flags & X86_EFLAGS_IF)
		local_irq_disable();
	dec_preempt_count();
}

108
#ifdef CONFIG_X86_32
Ingo Molnar's avatar
Ingo Molnar committed
109 110
static inline void
die_if_kernel(const char *str, struct pt_regs *regs, long err)
Linus Torvalds's avatar
Linus Torvalds committed
111
{
112
	if (!user_mode_vm(regs))
Linus Torvalds's avatar
Linus Torvalds committed
113 114 115
		die(str, regs, err);
}

116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
/*
 * Perform the lazy TSS's I/O bitmap copy. If the TSS has an
 * invalid offset set (the LAZY one) and the faulting thread has
 * a valid I/O bitmap pointer, we copy the I/O bitmap in the TSS,
 * we set the offset field correctly and return 1.
 */
static int lazy_iobitmap_copy(void)
{
	struct thread_struct *thread;
	struct tss_struct *tss;
	int cpu;

	cpu = get_cpu();
	tss = &per_cpu(init_tss, cpu);
	thread = &current->thread;

	if (tss->x86_tss.io_bitmap_base == INVALID_IO_BITMAP_OFFSET_LAZY &&
	    thread->io_bitmap_ptr) {
		memcpy(tss->io_bitmap, thread->io_bitmap_ptr,
		       thread->io_bitmap_max);
		/*
		 * If the previously set map was extending to higher ports
		 * than the current one, pad extra space with 0xff (no access).
		 */
		if (thread->io_bitmap_max < tss->io_bitmap_max) {
			memset((char *) tss->io_bitmap +
				thread->io_bitmap_max, 0xff,
				tss->io_bitmap_max - thread->io_bitmap_max);
		}
		tss->io_bitmap_max = thread->io_bitmap_max;
		tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET;
		tss->io_bitmap_owner = thread;
		put_cpu();

		return 1;
	}
	put_cpu();

	return 0;
}
156
#endif
157

Ingo Molnar's avatar
Ingo Molnar committed
158
static void __kprobes
159
do_trap(int trapnr, int signr, char *str, struct pt_regs *regs,
Ingo Molnar's avatar
Ingo Molnar committed
160
	long error_code, siginfo_t *info)
Linus Torvalds's avatar
Linus Torvalds committed
161
{
162 163
	struct task_struct *tsk = current;

164
#ifdef CONFIG_X86_32
165
	if (regs->flags & X86_VM_MASK) {
166 167 168 169 170
		/*
		 * traps 0, 1, 3, 4, and 5 should be forwarded to vm86.
		 * On nmi (interrupt 2), do_trap should not be called.
		 */
		if (trapnr < 6)
Linus Torvalds's avatar
Linus Torvalds committed
171 172 173
			goto vm86_trap;
		goto trap_signal;
	}
174
#endif
Linus Torvalds's avatar
Linus Torvalds committed
175

176
	if (!user_mode(regs))
Linus Torvalds's avatar
Linus Torvalds committed
177 178
		goto kernel_trap;

179
#ifdef CONFIG_X86_32
Ingo Molnar's avatar
Ingo Molnar committed
180
trap_signal:
181
#endif
Ingo Molnar's avatar
Ingo Molnar committed
182 183 184 185 186 187 188 189 190 191 192
	/*
	 * We want error_code and trap_no set for userspace faults and
	 * kernelspace faults which result in die(), but not
	 * kernelspace faults which are fixed up.  die() gives the
	 * process no chance to handle the signal and notice the
	 * kernel fault information, so that won't result in polluting
	 * the information about previously queued, but not yet
	 * delivered, faults.  See also do_general_protection below.
	 */
	tsk->thread.error_code = error_code;
	tsk->thread.trap_no = trapnr;
193

194 195 196 197 198 199 200 201 202 203 204 205
#ifdef CONFIG_X86_64
	if (show_unhandled_signals && unhandled_signal(tsk, signr) &&
	    printk_ratelimit()) {
		printk(KERN_INFO
		       "%s[%d] trap %s ip:%lx sp:%lx error:%lx",
		       tsk->comm, tsk->pid, str,
		       regs->ip, regs->sp, error_code);
		print_vma_addr(" in ", regs->ip);
		printk("\n");
	}
#endif

Ingo Molnar's avatar
Ingo Molnar committed
206 207 208 209 210
	if (info)
		force_sig_info(signr, info, tsk);
	else
		force_sig(signr, tsk);
	return;
Linus Torvalds's avatar
Linus Torvalds committed
211

Ingo Molnar's avatar
Ingo Molnar committed
212 213 214 215 216
kernel_trap:
	if (!fixup_exception(regs)) {
		tsk->thread.error_code = error_code;
		tsk->thread.trap_no = trapnr;
		die(str, regs, error_code);
Linus Torvalds's avatar
Linus Torvalds committed
217
	}
Ingo Molnar's avatar
Ingo Molnar committed
218
	return;
Linus Torvalds's avatar
Linus Torvalds committed
219

220
#ifdef CONFIG_X86_32
Ingo Molnar's avatar
Ingo Molnar committed
221 222 223 224 225
vm86_trap:
	if (handle_vm86_trap((struct kernel_vm86_regs *) regs,
						error_code, trapnr))
		goto trap_signal;
	return;
226
#endif
Linus Torvalds's avatar
Linus Torvalds committed
227 228
}

Ingo Molnar's avatar
Ingo Molnar committed
229
#define DO_ERROR(trapnr, signr, str, name)				\
230
dotraplinkage void do_##name(struct pt_regs *regs, long error_code)	\
Ingo Molnar's avatar
Ingo Molnar committed
231 232
{									\
	if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr)	\
233
							== NOTIFY_STOP)	\
Ingo Molnar's avatar
Ingo Molnar committed
234
		return;							\
235
	conditional_sti(regs);						\
236
	do_trap(trapnr, signr, str, regs, error_code, NULL);		\
Linus Torvalds's avatar
Linus Torvalds committed
237 238
}

239
#define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr)		\
240
dotraplinkage void do_##name(struct pt_regs *regs, long error_code)	\
Ingo Molnar's avatar
Ingo Molnar committed
241 242 243 244 245 246 247
{									\
	siginfo_t info;							\
	info.si_signo = signr;						\
	info.si_errno = 0;						\
	info.si_code = sicode;						\
	info.si_addr = (void __user *)siaddr;				\
	if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr)	\
248
							== NOTIFY_STOP)	\
Ingo Molnar's avatar
Ingo Molnar committed
249
		return;							\
250
	conditional_sti(regs);						\
251
	do_trap(trapnr, signr, str, regs, error_code, &info);		\
Linus Torvalds's avatar
Linus Torvalds committed
252 253
}

254 255 256 257
DO_ERROR_INFO(0, SIGFPE, "divide error", divide_error, FPE_INTDIV, regs->ip)
DO_ERROR(4, SIGSEGV, "overflow", overflow)
DO_ERROR(5, SIGSEGV, "bounds", bounds)
DO_ERROR_INFO(6, SIGILL, "invalid opcode", invalid_op, ILL_ILLOPN, regs->ip)
258
DO_ERROR(9, SIGFPE, "coprocessor segment overrun", coprocessor_segment_overrun)
259
DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
260
DO_ERROR(11, SIGBUS, "segment not present", segment_not_present)
261
#ifdef CONFIG_X86_32
262
DO_ERROR(12, SIGBUS, "stack segment", stack_segment)
263
#endif
264
DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
Linus Torvalds's avatar
Linus Torvalds committed
265

266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
#ifdef CONFIG_X86_64
/* Runs on IST stack */
dotraplinkage void do_stack_segment(struct pt_regs *regs, long error_code)
{
	if (notify_die(DIE_TRAP, "stack segment", regs, error_code,
			12, SIGBUS) == NOTIFY_STOP)
		return;
	preempt_conditional_sti(regs);
	do_trap(12, SIGBUS, "stack segment", regs, error_code, NULL);
	preempt_conditional_cli(regs);
}

dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
{
	static const char str[] = "double fault";
	struct task_struct *tsk = current;

	/* Return not checked because double check cannot be ignored */
	notify_die(DIE_TRAP, str, regs, error_code, 8, SIGSEGV);

	tsk->thread.error_code = error_code;
	tsk->thread.trap_no = 8;

289 290 291 292
	/*
	 * This is always a kernel trap and never fixable (and thus must
	 * never return).
	 */
293 294 295 296 297
	for (;;)
		die(str, regs, error_code);
}
#endif

298
dotraplinkage void __kprobes
299
do_general_protection(struct pt_regs *regs, long error_code)
Linus Torvalds's avatar
Linus Torvalds committed
300
{
301
	struct task_struct *tsk;
Ingo Molnar's avatar
Ingo Molnar committed
302

303 304
	conditional_sti(regs);

305
#ifdef CONFIG_X86_32
306 307
	if (lazy_iobitmap_copy()) {
		/* restart the faulting instruction */
Linus Torvalds's avatar
Linus Torvalds committed
308 309 310
		return;
	}

311
	if (regs->flags & X86_VM_MASK)
Linus Torvalds's avatar
Linus Torvalds committed
312
		goto gp_in_vm86;
313
#endif
Linus Torvalds's avatar
Linus Torvalds committed
314

315
	tsk = current;
316
	if (!user_mode(regs))
Linus Torvalds's avatar
Linus Torvalds committed
317 318
		goto gp_in_kernel;

319 320
	tsk->thread.error_code = error_code;
	tsk->thread.trap_no = 13;
Ingo Molnar's avatar
Ingo Molnar committed
321

322 323
	if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) &&
			printk_ratelimit()) {
324
		printk(KERN_INFO
325 326 327
			"%s[%d] general protection ip:%lx sp:%lx error:%lx",
			tsk->comm, task_pid_nr(tsk),
			regs->ip, regs->sp, error_code);
328 329 330
		print_vma_addr(" in ", regs->ip);
		printk("\n");
	}
331

332
	force_sig(SIGSEGV, tsk);
Linus Torvalds's avatar
Linus Torvalds committed
333 334
	return;

335
#ifdef CONFIG_X86_32
Linus Torvalds's avatar
Linus Torvalds committed
336 337 338 339
gp_in_vm86:
	local_irq_enable();
	handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code);
	return;
340
#endif
Linus Torvalds's avatar
Linus Torvalds committed
341 342

gp_in_kernel:
343 344 345 346 347 348
	if (fixup_exception(regs))
		return;

	tsk->thread.error_code = error_code;
	tsk->thread.trap_no = 13;
	if (notify_die(DIE_GPF, "general protection fault", regs,
Linus Torvalds's avatar
Linus Torvalds committed
349
				error_code, 13, SIGSEGV) == NOTIFY_STOP)
350 351
		return;
	die("general protection fault", regs, error_code);
Linus Torvalds's avatar
Linus Torvalds committed
352 353
}

354
static notrace __kprobes void
Ingo Molnar's avatar
Ingo Molnar committed
355
mem_parity_error(unsigned char reason, struct pt_regs *regs)
Linus Torvalds's avatar
Linus Torvalds committed
356
{
Ingo Molnar's avatar
Ingo Molnar committed
357 358 359 360 361 362
	printk(KERN_EMERG
		"Uhhuh. NMI received for unknown reason %02x on CPU %d.\n",
			reason, smp_processor_id());

	printk(KERN_EMERG
		"You have some hardware problem, likely on the PCI bus.\n");
363 364

#if defined(CONFIG_EDAC)
Ingo Molnar's avatar
Ingo Molnar committed
365
	if (edac_handler_set()) {
366 367 368 369 370
		edac_atomic_assert_error();
		return;
	}
#endif

371
	if (panic_on_unrecovered_nmi)
Ingo Molnar's avatar
Ingo Molnar committed
372
		panic("NMI: Not continuing");
Linus Torvalds's avatar
Linus Torvalds committed
373

374
	printk(KERN_EMERG "Dazed and confused, but trying to continue\n");
Linus Torvalds's avatar
Linus Torvalds committed
375 376

	/* Clear and disable the memory parity error line. */
377 378
	reason = (reason & 0xf) | 4;
	outb(reason, 0x61);
Linus Torvalds's avatar
Linus Torvalds committed
379 380
}

381
static notrace __kprobes void
Ingo Molnar's avatar
Ingo Molnar committed
382
io_check_error(unsigned char reason, struct pt_regs *regs)
Linus Torvalds's avatar
Linus Torvalds committed
383 384 385
{
	unsigned long i;

386
	printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
Linus Torvalds's avatar
Linus Torvalds committed
387 388 389 390 391
	show_registers(regs);

	/* Re-enable the IOCK line, wait for a few seconds */
	reason = (reason & 0xf) | 8;
	outb(reason, 0x61);
Ingo Molnar's avatar
Ingo Molnar committed
392

Linus Torvalds's avatar
Linus Torvalds committed
393
	i = 2000;
Ingo Molnar's avatar
Ingo Molnar committed
394 395 396
	while (--i)
		udelay(1000);

Linus Torvalds's avatar
Linus Torvalds committed
397 398 399 400
	reason &= ~8;
	outb(reason, 0x61);
}

401
static notrace __kprobes void
Ingo Molnar's avatar
Ingo Molnar committed
402
unknown_nmi_error(unsigned char reason, struct pt_regs *regs)
Linus Torvalds's avatar
Linus Torvalds committed
403
{
404 405
	if (notify_die(DIE_NMIUNKNOWN, "nmi", regs, reason, 2, SIGINT) ==
			NOTIFY_STOP)
Jason Wessel's avatar
Jason Wessel committed
406
		return;
Linus Torvalds's avatar
Linus Torvalds committed
407
#ifdef CONFIG_MCA
Ingo Molnar's avatar
Ingo Molnar committed
408 409 410 411 412
	/*
	 * Might actually be able to figure out what the guilty party
	 * is:
	 */
	if (MCA_bus) {
Linus Torvalds's avatar
Linus Torvalds committed
413 414 415 416
		mca_handle_nmi();
		return;
	}
#endif
Ingo Molnar's avatar
Ingo Molnar committed
417 418 419 420
	printk(KERN_EMERG
		"Uhhuh. NMI received for unknown reason %02x on CPU %d.\n",
			reason, smp_processor_id());

421
	printk(KERN_EMERG "Do you have a strange power saving mode enabled?\n");
422
	if (panic_on_unrecovered_nmi)
Ingo Molnar's avatar
Ingo Molnar committed
423
		panic("NMI: Not continuing");
424

425
	printk(KERN_EMERG "Dazed and confused, but trying to continue\n");
Linus Torvalds's avatar
Linus Torvalds committed
426 427
}

428
static notrace __kprobes void default_do_nmi(struct pt_regs *regs)
Linus Torvalds's avatar
Linus Torvalds committed
429 430
{
	unsigned char reason = 0;
431 432 433
	int cpu;

	cpu = smp_processor_id();
Linus Torvalds's avatar
Linus Torvalds committed
434

435 436
	/* Only the BSP gets external NMIs from the system. */
	if (!cpu)
Linus Torvalds's avatar
Linus Torvalds committed
437
		reason = get_nmi_reason();
Ingo Molnar's avatar
Ingo Molnar committed
438

Linus Torvalds's avatar
Linus Torvalds committed
439
	if (!(reason & 0xc0)) {
440
		if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT)
441
								== NOTIFY_STOP)
Linus Torvalds's avatar
Linus Torvalds committed
442 443 444 445 446 447
			return;
#ifdef CONFIG_X86_LOCAL_APIC
		/*
		 * Ok, so this is none of the documented NMI sources,
		 * so it must be the NMI watchdog.
		 */
448
		if (nmi_watchdog_tick(regs, reason))
Linus Torvalds's avatar
Linus Torvalds committed
449
			return;
450
		if (!do_nmi_callback(regs, cpu))
451
			unknown_nmi_error(reason, regs);
Ingo Molnar's avatar
Ingo Molnar committed
452 453 454
#else
		unknown_nmi_error(reason, regs);
#endif
455

Linus Torvalds's avatar
Linus Torvalds committed
456 457
		return;
	}
458
	if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP)
Linus Torvalds's avatar
Linus Torvalds committed
459
		return;
460 461

	/* AK: following checks seem to be broken on modern chipsets. FIXME */
Linus Torvalds's avatar
Linus Torvalds committed
462 463 464 465
	if (reason & 0x80)
		mem_parity_error(reason, regs);
	if (reason & 0x40)
		io_check_error(reason, regs);
466
#ifdef CONFIG_X86_32
Linus Torvalds's avatar
Linus Torvalds committed
467 468
	/*
	 * Reassert NMI in case it became active meanwhile
Ingo Molnar's avatar
Ingo Molnar committed
469
	 * as it's edge-triggered:
Linus Torvalds's avatar
Linus Torvalds committed
470 471
	 */
	reassert_nmi();
472
#endif
Linus Torvalds's avatar
Linus Torvalds committed
473 474
}

475 476
dotraplinkage notrace __kprobes void
do_nmi(struct pt_regs *regs, long error_code)
Linus Torvalds's avatar
Linus Torvalds committed
477 478 479
{
	nmi_enter();

480
	inc_irq_stat(__nmi_count);
Linus Torvalds's avatar
Linus Torvalds committed
481

482 483
	if (!ignore_nmis)
		default_do_nmi(regs);
Linus Torvalds's avatar
Linus Torvalds committed
484 485 486 487

	nmi_exit();
}

488 489 490 491 492 493 494 495 496 497 498 499
void stop_nmi(void)
{
	acpi_nmi_disable();
	ignore_nmis++;
}

void restart_nmi(void)
{
	ignore_nmis--;
	acpi_nmi_enable();
}

500
/* May run on IST stack. */
501
dotraplinkage void __kprobes do_int3(struct pt_regs *regs, long error_code)
Linus Torvalds's avatar
Linus Torvalds committed
502
{
503
#ifdef CONFIG_KPROBES
Linus Torvalds's avatar
Linus Torvalds committed
504 505
	if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP)
			== NOTIFY_STOP)
506
		return;
507 508 509 510 511
#else
	if (notify_die(DIE_TRAP, "int3", regs, error_code, 3, SIGTRAP)
			== NOTIFY_STOP)
		return;
#endif
Ingo Molnar's avatar
Ingo Molnar committed
512

513
	preempt_conditional_sti(regs);
514
	do_trap(3, SIGTRAP, "int3", regs, error_code, NULL);
515
	preempt_conditional_cli(regs);
Linus Torvalds's avatar
Linus Torvalds committed
516 517
}

518
#ifdef CONFIG_X86_64
519 520 521 522 523
/*
 * Help handler running on IST stack to switch back to user stack
 * for scheduling or signal handling. The actual stack switch is done in
 * entry.S
 */
524 525 526 527 528 529 530 531 532
asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs)
{
	struct pt_regs *regs = eregs;
	/* Did already sync */
	if (eregs == (struct pt_regs *)eregs->sp)
		;
	/* Exception from user space */
	else if (user_mode(eregs))
		regs = task_pt_regs(current);
533 534 535 536
	/*
	 * Exception from kernel and interrupts are enabled. Move to
	 * kernel process stack.
	 */
537 538 539 540 541 542 543 544
	else if (eregs->flags & X86_EFLAGS_IF)
		regs = (struct pt_regs *)(eregs->sp -= sizeof(struct pt_regs));
	if (eregs != regs)
		*regs = *eregs;
	return regs;
}
#endif

Linus Torvalds's avatar
Linus Torvalds committed
545 546 547 548 549 550 551 552 553 554
/*
 * Our handling of the processor debug registers is non-trivial.
 * We do not clear them on entry and exit from the kernel. Therefore
 * it is possible to get a watchpoint trap here from inside the kernel.
 * However, the code in ./ptrace.c has ensured that the user can
 * only set watchpoints on userspace addresses. Therefore the in-kernel
 * watchpoint trap can only occur in code which is reading/writing
 * from user space. Such code must not hold kernel locks (since it
 * can equally take a page fault), therefore it is safe to call
 * force_sig_info even though that claims and releases locks.
Ingo Molnar's avatar
Ingo Molnar committed
555
 *
Linus Torvalds's avatar
Linus Torvalds committed
556 557 558 559 560 561 562 563 564 565
 * Code in ./signal.c ensures that the debug control register
 * is restored before we deliver any signal, and therefore that
 * user code runs with the correct debug control register even though
 * we clear it here.
 *
 * Being careful here means that we don't have to be as careful in a
 * lot of more complicated places (task switching can be a bit lazy
 * about restoring all the debug state, and ptrace doesn't have to
 * find every occurrence of the TF bit that could be saved away even
 * by user code)
566 567
 *
 * May run on IST stack.
Linus Torvalds's avatar
Linus Torvalds committed
568
 */
569
dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
Linus Torvalds's avatar
Linus Torvalds committed
570 571
{
	struct task_struct *tsk = current;
572
	unsigned long condition;
573
	int si_code;
Linus Torvalds's avatar
Linus Torvalds committed
574

575
	get_debugreg(condition, 6);
Linus Torvalds's avatar
Linus Torvalds committed
576

577 578 579 580 581 582
	/*
	 * The processor cleared BTF, so don't mark that we need it set.
	 */
	clear_tsk_thread_flag(tsk, TIF_DEBUGCTLMSR);
	tsk->thread.debugctlmsr = 0;

Linus Torvalds's avatar
Linus Torvalds committed
583
	if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code,
584
						SIGTRAP) == NOTIFY_STOP)
Linus Torvalds's avatar
Linus Torvalds committed
585
		return;
586

Linus Torvalds's avatar
Linus Torvalds committed
587
	/* It's safe to allow irq's after DR6 has been saved */
588
	preempt_conditional_sti(regs);
Linus Torvalds's avatar
Linus Torvalds committed
589 590 591

	/* Mask out spurious debug traps due to lazy DR7 setting */
	if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) {
592
		if (!tsk->thread.debugreg7)
Linus Torvalds's avatar
Linus Torvalds committed
593 594 595
			goto clear_dr7;
	}

596
#ifdef CONFIG_X86_32
597
	if (regs->flags & X86_VM_MASK)
Linus Torvalds's avatar
Linus Torvalds committed
598
		goto debug_vm86;
599
#endif
Linus Torvalds's avatar
Linus Torvalds committed
600 601

	/* Save debug status register where ptrace can see it */
602
	tsk->thread.debugreg6 = condition;
Linus Torvalds's avatar
Linus Torvalds committed
603 604 605 606 607 608

	/*
	 * Single-stepping through TF: make sure we ignore any events in
	 * kernel space (but re-enable TF when returning to user mode).
	 */
	if (condition & DR_STEP) {
609
		if (!user_mode(regs))
Linus Torvalds's avatar
Linus Torvalds committed
610 611 612
			goto clear_TF_reenable;
	}

613
	si_code = get_si_code(condition);
Linus Torvalds's avatar
Linus Torvalds committed
614
	/* Ok, finally something we can handle */
615
	send_sigtrap(tsk, regs, error_code, si_code);
Linus Torvalds's avatar
Linus Torvalds committed
616

Ingo Molnar's avatar
Ingo Molnar committed
617 618
	/*
	 * Disable additional traps. They'll be re-enabled when
Linus Torvalds's avatar
Linus Torvalds committed
619 620 621
	 * the signal is delivered.
	 */
clear_dr7:
622
	set_debugreg(0, 7);
623
	preempt_conditional_cli(regs);
Linus Torvalds's avatar
Linus Torvalds committed
624 625
	return;

626
#ifdef CONFIG_X86_32
Linus Torvalds's avatar
Linus Torvalds committed
627 628
debug_vm86:
	handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1);
629
	preempt_conditional_cli(regs);
Linus Torvalds's avatar
Linus Torvalds committed
630
	return;
631
#endif
Linus Torvalds's avatar
Linus Torvalds committed
632 633 634

clear_TF_reenable:
	set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
635
	regs->flags &= ~X86_EFLAGS_TF;
636
	preempt_conditional_cli(regs);
Linus Torvalds's avatar
Linus Torvalds committed
637 638 639
	return;
}

640 641 642 643 644 645 646 647 648 649 650 651 652 653
#ifdef CONFIG_X86_64
static int kernel_math_error(struct pt_regs *regs, const char *str, int trapnr)
{
	if (fixup_exception(regs))
		return 1;

	notify_die(DIE_GPF, str, regs, 0, trapnr, SIGFPE);
	/* Illegal floating point operation in the kernel */
	current->thread.trap_no = trapnr;
	die(str, regs, 0);
	return 0;
}
#endif

Linus Torvalds's avatar
Linus Torvalds committed
654 655 656 657 658
/*
 * Note that we play around with the 'TS' bit in an attempt to get
 * the correct behaviour even in the presence of the asynchronous
 * IRQ13 behaviour
 */
659
void math_error(void __user *ip)
Linus Torvalds's avatar
Linus Torvalds committed
660
{
Ingo Molnar's avatar
Ingo Molnar committed
661
	struct task_struct *task;
Linus Torvalds's avatar
Linus Torvalds committed
662
	siginfo_t info;
663
	unsigned short cwd, swd, err;
Linus Torvalds's avatar
Linus Torvalds committed
664 665 666 667 668 669 670 671 672 673

	/*
	 * Save the info for the exception handler and clear the error.
	 */
	task = current;
	save_init_fpu(task);
	task->thread.trap_no = 16;
	task->thread.error_code = 0;
	info.si_signo = SIGFPE;
	info.si_errno = 0;
674
	info.si_addr = ip;
Linus Torvalds's avatar
Linus Torvalds committed
675 676 677 678 679 680
	/*
	 * (~cwd & swd) will mask out exceptions that are not set to unmasked
	 * status.  0x3f is the exception bits in these regs, 0x200 is the
	 * C1 reg you need in case of a stack fault, 0x040 is the stack
	 * fault bit.  We should only be taking one exception at a time,
	 * so if this combination doesn't produce any single exception,
681
	 * then we have a bad program that isn't synchronizing its FPU usage
Linus Torvalds's avatar
Linus Torvalds committed
682 683 684 685 686
	 * and it will suffer the consequences since we won't be able to
	 * fully reproduce the context of the exception
	 */
	cwd = get_fpu_cwd(task);
	swd = get_fpu_swd(task);
687

688
	err = swd & ~cwd;
689 690

	if (err & 0x001) {	/* Invalid op */
Ingo Molnar's avatar
Ingo Molnar committed
691 692 693 694 695 696
		/*
		 * swd & 0x240 == 0x040: Stack Underflow
		 * swd & 0x240 == 0x240: Stack Overflow
		 * User must clear the SF bit (0x40) if set
		 */
		info.si_code = FPE_FLTINV;
697
	} else if (err & 0x004) { /* Divide by Zero */
Ingo Molnar's avatar
Ingo Molnar committed
698
		info.si_code = FPE_FLTDIV;
699
	} else if (err & 0x008) { /* Overflow */
Ingo Molnar's avatar
Ingo Molnar committed
700
		info.si_code = FPE_FLTOVF;
701 702 703
	} else if (err & 0x012) { /* Denormal, Underflow */
		info.si_code = FPE_FLTUND;
	} else if (err & 0x020) { /* Precision */
Ingo Molnar's avatar
Ingo Molnar committed
704
		info.si_code = FPE_FLTRES;
705
	} else {
706 707 708 709
		/*
		 * If we're using IRQ 13, or supposedly even some trap 16
		 * implementations, it's possible we get a spurious trap...
		 */
710
		return;		/* Spurious trap, no error */
Linus Torvalds's avatar
Linus Torvalds committed
711 712 713 714
	}
	force_sig_info(SIGFPE, &info, task);
}

715
dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code)
Linus Torvalds's avatar
Linus Torvalds committed
716
{
717
	conditional_sti(regs);
718 719

#ifdef CONFIG_X86_32
Linus Torvalds's avatar
Linus Torvalds committed
720
	ignore_fpu_irq = 1;
721 722 723 724 725 726
#else
	if (!user_mode(regs) &&
	    kernel_math_error(regs, "kernel x87 math error", 16))
		return;
#endif

727
	math_error((void __user *)regs->ip);
Linus Torvalds's avatar
Linus Torvalds committed
728 729
}

730
static void simd_math_error(void __user *ip)
Linus Torvalds's avatar
Linus Torvalds committed
731
{
Ingo Molnar's avatar
Ingo Molnar committed
732 733
	struct task_struct *task;
	siginfo_t info;
734
	unsigned short mxcsr;
Linus Torvalds's avatar
Linus Torvalds committed
735 736 737 738 739 740 741 742 743 744 745

	/*
	 * Save the info for the exception handler and clear the error.
	 */
	task = current;
	save_init_fpu(task);
	task->thread.trap_no = 19;
	task->thread.error_code = 0;
	info.si_signo = SIGFPE;
	info.si_errno = 0;
	info.si_code = __SI_FAULT;
746
	info.si_addr = ip;
Linus Torvalds's avatar
Linus Torvalds committed
747 748 749 750 751 752 753 754
	/*
	 * The SIMD FPU exceptions are handled a little differently, as there
	 * is only a single status/control register.  Thus, to determine which
	 * unmasked exception was caught we must mask the exception mask bits
	 * at 0x1f80, and then use these to mask the exception bits at 0x3f.
	 */
	mxcsr = get_fpu_mxcsr(task);
	switch (~((mxcsr & 0x1f80) >> 7) & (mxcsr & 0x3f)) {
Ingo Molnar's avatar
Ingo Molnar committed
755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773
	case 0x000:
	default:
		break;
	case 0x001: /* Invalid Op */
		info.si_code = FPE_FLTINV;
		break;
	case 0x002: /* Denormalize */
	case 0x010: /* Underflow */
		info.si_code = FPE_FLTUND;
		break;
	case 0x004: /* Zero Divide */
		info.si_code = FPE_FLTDIV;
		break;
	case 0x008: /* Overflow */
		info.si_code = FPE_FLTOVF;
		break;
	case 0x020: /* Precision */
		info.si_code = FPE_FLTRES;
		break;
Linus Torvalds's avatar
Linus Torvalds committed
774 775 776 777
	}
	force_sig_info(SIGFPE, &info, task);
}

778 779
dotraplinkage void
do_simd_coprocessor_error(struct pt_regs *regs, long error_code)
Linus Torvalds's avatar
Linus Torvalds committed
780
{
781 782
	conditional_sti(regs);

783
#ifdef CONFIG_X86_32
Linus Torvalds's avatar
Linus Torvalds committed
784 785 786
	if (cpu_has_xmm) {
		/* Handle SIMD FPU exceptions on PIII+ processors. */
		ignore_fpu_irq = 1;
787
		simd_math_error((void __user *)regs->ip);
Ingo Molnar's avatar
Ingo Molnar committed
788 789 790 791 792 793
		return;
	}
	/*
	 * Handle strange cache flush from user space exception
	 * in all other cases.  This is undocumented behaviour.
	 */
794
	if (regs->flags & X86_VM_MASK) {
Ingo Molnar's avatar
Ingo Molnar committed
795 796
		handle_vm86_fault((struct kernel_vm86_regs *)regs, error_code);
		return;
Linus Torvalds's avatar
Linus Torvalds committed
797
	}
Ingo Molnar's avatar
Ingo Molnar committed
798 799 800 801
	current->thread.trap_no = 19;
	current->thread.error_code = error_code;
	die_if_kernel("cache flush denied", regs, error_code);
	force_sig(SIGSEGV, current);
802 803 804 805 806 807
#else
	if (!user_mode(regs) &&
			kernel_math_error(regs, "kernel simd math error", 19))
		return;
	simd_math_error((void __user *)regs->ip);
#endif
Linus Torvalds's avatar
Linus Torvalds committed
808 809
}

810 811
dotraplinkage void
do_spurious_interrupt_bug(struct pt_regs *regs, long error_code)
Linus Torvalds's avatar
Linus Torvalds committed
812
{
813
	conditional_sti(regs);
Linus Torvalds's avatar
Linus Torvalds committed
814 815
#if 0
	/* No need to warn about this any longer. */
Ingo Molnar's avatar
Ingo Molnar committed
816
	printk(KERN_INFO "Ignoring P6 Local APIC Spurious Interrupt Bug...\n");
Linus Torvalds's avatar
Linus Torvalds committed
817 818 819
#endif
}

820
#ifdef CONFIG_X86_32
Ingo Molnar's avatar
Ingo Molnar committed
821
unsigned long patch_espfix_desc(unsigned long uesp, unsigned long kesp)
Linus Torvalds's avatar
Linus Torvalds committed
822
{
823
	struct desc_struct *gdt = get_cpu_gdt_table(smp_processor_id());
Stas Sergeev's avatar
Stas Sergeev committed
824 825 826 827
	unsigned long base = (kesp - uesp) & -THREAD_SIZE;
	unsigned long new_kesp = kesp - base;
	unsigned long lim_pages = (new_kesp | (THREAD_SIZE - 1)) >> PAGE_SHIFT;
	__u64 desc = *(__u64 *)&gdt[GDT_ENTRY_ESPFIX_SS];
Ingo Molnar's avatar
Ingo Molnar committed
828

Stas Sergeev's avatar
Stas Sergeev committed
829
	/* Set up base for espfix segment */
Ingo Molnar's avatar
Ingo Molnar committed
830 831
	desc &= 0x00f0ff0000000000ULL;
	desc |=	((((__u64)base) << 16) & 0x000000ffffff0000ULL) |
Stas Sergeev's avatar
Stas Sergeev committed
832 833 834 835
		((((__u64)base) << 32) & 0xff00000000000000ULL) |
		((((__u64)lim_pages) << 32) & 0x000f000000000000ULL) |
		(lim_pages & 0xffff);
	*(__u64 *)&gdt[GDT_ENTRY_ESPFIX_SS] = desc;
Ingo Molnar's avatar
Ingo Molnar committed
836

Stas Sergeev's avatar
Stas Sergeev committed
837
	return new_kesp;
Linus Torvalds's avatar
Linus Torvalds committed
838
}
839 840 841 842 843 844 845 846 847
#else
asmlinkage void __attribute__((weak)) smp_thermal_interrupt(void)
{
}

asmlinkage void __attribute__((weak)) mce_threshold_interrupt(void)
{
}
#endif
Linus Torvalds's avatar
Linus Torvalds committed
848 849

/*
Ingo Molnar's avatar
Ingo Molnar committed
850
 * 'math_state_restore()' saves the current math information in the
Linus Torvalds's avatar
Linus Torvalds committed
851 852 853 854 855 856 857 858
 * old math state array, and gets the new ones from the current task
 *
 * Careful.. There are problems with IBM-designed IRQ13 behaviour.
 * Don't touch unless you *really* know how it works.
 *
 * Must be called with kernel preemption disabled (in this case,
 * local interrupts are disabled at the call-site in entry.S).
 */
859
asmlinkage void math_state_restore(void)
Linus Torvalds's avatar
Linus Torvalds committed
860 861 862 863
{
	struct thread_info *thread = current_thread_info();
	struct task_struct *tsk = thread->task;

864 865 866 867 868 869 870 871 872 873 874 875 876 877 878
	if (!tsk_used_math(tsk)) {
		local_irq_enable();
		/*
		 * does a slab alloc which can sleep
		 */
		if (init_fpu(tsk)) {
			/*
			 * ran out of memory!
			 */
			do_group_exit(SIGKILL);
			return;
		}
		local_irq_disable();
	}

Ingo Molnar's avatar
Ingo Molnar committed
879
	clts();				/* Allow maths ops (or we recurse) */
880
#ifdef CONFIG_X86_32
Linus Torvalds's avatar
Linus Torvalds committed
881
	restore_fpu(tsk);
882 883 884 885 886 887 888 889 890 891
#else
	/*
	 * Paranoid restore. send a SIGSEGV if we fail to restore the state.
	 */
	if (unlikely(restore_fpu_checking(tsk))) {
		stts();
		force_sig(SIGSEGV, tsk);
		return;
	}
#endif
Linus Torvalds's avatar
Linus Torvalds committed
892
	thread->status |= TS_USEDFPU;	/* So we fnsave on switch_to() */
893
	tsk->fpu_counter++;
Linus Torvalds's avatar
Linus Torvalds committed
894
}
895
EXPORT_SYMBOL_GPL(math_state_restore);
Linus Torvalds's avatar
Linus Torvalds committed
896 897

#ifndef CONFIG_MATH_EMULATION
898
void math_emulate(struct math_emu_info *info)
Linus Torvalds's avatar
Linus Torvalds committed
899
{
Ingo Molnar's avatar
Ingo Molnar committed
900 901 902 903
	printk(KERN_EMERG
		"math-emulation not enabled and no coprocessor found.\n");
	printk(KERN_EMERG "killing %s.\n", current->comm);
	force_sig(SIGFPE, current);
Linus Torvalds's avatar
Linus Torvalds committed
904 905 906 907
	schedule();
}
#endif /* CONFIG_MATH_EMULATION */

908 909
dotraplinkage void __kprobes
do_device_not_available(struct pt_regs *regs, long error_code)
910
{
911
#ifdef CONFIG_X86_32
912
	if (read_cr0() & X86_CR0_EM) {
913 914
		struct math_emu_info info = { };

915
		conditional_sti(regs);
916

917
		info.regs = regs;
918
		math_emulate(&info);
919 920
	} else {
		math_state_restore(); /* interrupts still off */
921
		conditional_sti(regs);
922
	}
923 924 925
#else
	math_state_restore();
#endif
926 927
}

928
#ifdef CONFIG_X86_32
929
dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code)
930 931 932 933 934 935 936 937 938 939 940
{
	siginfo_t info;
	local_irq_enable();

	info.si_signo = SIGILL;
	info.si_errno = 0;
	info.si_code = ILL_BADSTK;
	info.si_addr = 0;
	if (notify_die(DIE_TRAP, "iret exception",
			regs, error_code, 32, SIGILL) == NOTIFY_STOP)
		return;
941
	do_trap(32, SIGILL, "iret exception", regs, error_code, &info);
942
}
943
#endif
944

Linus Torvalds's avatar
Linus Torvalds committed
945 946
void __init trap_init(void)
{
947 948
	int i;

Linus Torvalds's avatar
Linus Torvalds committed
949
#ifdef CONFIG_EISA
Ingo Molnar's avatar
Ingo Molnar committed
950
	void __iomem *p = early_ioremap(0x0FFFD9, 4);
Ingo Molnar's avatar
Ingo Molnar committed
951 952

	if (readl(p) == 'E' + ('I'<<8) + ('S'<<16) + ('A'<<24))
Linus Torvalds's avatar
Linus Torvalds committed
953
		EISA_bus = 1;
Ingo Molnar's avatar
Ingo Molnar committed
954
	early_iounmap(p, 4);
Linus Torvalds's avatar
Linus Torvalds committed
955 956
#endif

957
	set_intr_gate(0, &divide_error);
958 959 960 961 962 963
	set_intr_gate_ist(1, &debug, DEBUG_STACK);
	set_intr_gate_ist(2, &nmi, NMI_STACK);
	/* int3 can be called from all */
	set_system_intr_gate_ist(3, &int3, DEBUG_STACK);
	/* int4 can be called from all */
	set_system_intr_gate(4, &overflow);
964
	set_intr_gate(5, &bounds);
965
	set_intr_gate(6, &invalid_op);
966
	set_intr_gate(7, &device_not_available);
967
#ifdef CONFIG_X86_32
968
	set_task_gate(8, GDT_ENTRY_DOUBLEFAULT_TSS);
969 970 971
#else
	set_intr_gate_ist(8, &double_fault, DOUBLEFAULT_STACK);
#endif
972
	set_intr_gate(9, &coprocessor_segment_overrun);
973
	set_intr_gate(10, &invalid_TSS);
974
	set_intr_gate(11, &segment_not_present);
975
	set_intr_gate_ist(12, &stack_segment, STACKFAULT_STACK);
976
	set_intr_gate(13, &general_protection);
Ingo Molnar's avatar
Ingo Molnar committed
977
	set_intr_gate(14, &page_fault);
978
	set_intr_gate(15, &spurious_interrupt_bug);
979
	set_intr_gate(16, &coprocessor_error);
980
	set_intr_gate(17, &alignment_check);
Linus Torvalds's avatar
Linus Torvalds committed
981
#ifdef CONFIG_X86_MCE
982
	set_intr_gate_ist(18, &machine_check, MCE_STACK);
Linus Torvalds's avatar
Linus Torvalds committed
983
#endif
984
	set_intr_gate(19, &simd_coprocessor_error);
Linus Torvalds's avatar
Linus Torvalds committed
985

986 987 988 989
	/* Reserve all the builtin and the syscall vector: */
	for (i = 0; i < FIRST_EXTERNAL_VECTOR; i++)
		set_bit(i, used_vectors);

990 991
#ifdef CONFIG_IA32_EMULATION
	set_system_intr_gate(IA32_SYSCALL_VECTOR, ia32_syscall);
992
	set_bit(IA32_SYSCALL_VECTOR, used_vectors);
993 994 995
#endif

#ifdef CONFIG_X86_32
996 997 998 999 1000 1001
	if (cpu_has_fxsr) {
		printk(KERN_INFO "Enabling fast FPU save and restore... ");
		set_in_cr4(X86_CR4_OSFXSR);
		printk("done.\n");
	}
	if (cpu_has_xmm) {
Ingo Molnar's avatar
Ingo Molnar committed
1002 1003
		printk(KERN_INFO
			"Enabling unmasked SIMD FPU exception support... ");
1004 1005 1006 1007
		set_in_cr4(X86_CR4_OSXMMEXCPT);
		printk("done.\n");
	}

1008
	set_system_trap_gate(SYSCALL_VECTOR, &system_call);
1009
	set_bit(SYSCALL_VECTOR, used_vectors);
1010
#endif
1011

Linus Torvalds's avatar
Linus Torvalds committed
1012
	/*
Ingo Molnar's avatar
Ingo Molnar committed
1013
	 * Should be a barrier for any external CPU state:
Linus Torvalds's avatar
Linus Torvalds committed
1014 1015 1016
	 */
	cpu_init();

1017
#ifdef CONFIG_X86_32
Linus Torvalds's avatar
Linus Torvalds committed
1018
	trap_init_hook();
1019
#endif
Linus Torvalds's avatar
Linus Torvalds committed
1020
}