aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2007-07-18 14:59:22 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-18 15:09:01 -0400
commita10d9a71bafd3a283da240d2868e71346d2aef6f (patch)
tree82142891ea3f2b148b8afd2d2734d6bafcb16ec8 /arch/i386
parent29eb51101c02df517ca64ec472d7501127ad1da8 (diff)
i386: fixup TRACE_IRQ breakage
The TRACE_IRQS_ON function in iret_exc: calls a C function without ensuring that the segments are set properly. Move the trace function and the enabling of interrupt into the C stub. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/i386')
-rw-r--r--arch/i386/kernel/entry.S2
-rw-r--r--arch/i386/kernel/traps.c10
2 files changed, 6 insertions, 6 deletions
diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S
index 32980b834935..a714d6b43506 100644
--- a/arch/i386/kernel/entry.S
+++ b/arch/i386/kernel/entry.S
@@ -409,8 +409,6 @@ restore_nocheck_notrace:
4091: INTERRUPT_RETURN 4091: INTERRUPT_RETURN
410.section .fixup,"ax" 410.section .fixup,"ax"
411iret_exc: 411iret_exc:
412 TRACE_IRQS_ON
413 ENABLE_INTERRUPTS(CLBR_NONE)
414 pushl $0 # no error code 412 pushl $0 # no error code
415 pushl $do_iret_error 413 pushl $do_iret_error
416 jmp error_code 414 jmp error_code
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c
index 18c1c285836d..d32fd4b6f78e 100644
--- a/arch/i386/kernel/traps.c
+++ b/arch/i386/kernel/traps.c
@@ -518,10 +518,12 @@ fastcall void do_##name(struct pt_regs * regs, long error_code) \
518 do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \ 518 do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \
519} 519}
520 520
521#define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \ 521#define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr, irq) \
522fastcall void do_##name(struct pt_regs * regs, long error_code) \ 522fastcall void do_##name(struct pt_regs * regs, long error_code) \
523{ \ 523{ \
524 siginfo_t info; \ 524 siginfo_t info; \
525 if (irq) \
526 local_irq_enable(); \
525 info.si_signo = signr; \ 527 info.si_signo = signr; \
526 info.si_errno = 0; \ 528 info.si_errno = 0; \
527 info.si_code = sicode; \ 529 info.si_code = sicode; \
@@ -561,13 +563,13 @@ DO_VM86_ERROR( 3, SIGTRAP, "int3", int3)
561#endif 563#endif
562DO_VM86_ERROR( 4, SIGSEGV, "overflow", overflow) 564DO_VM86_ERROR( 4, SIGSEGV, "overflow", overflow)
563DO_VM86_ERROR( 5, SIGSEGV, "bounds", bounds) 565DO_VM86_ERROR( 5, SIGSEGV, "bounds", bounds)
564DO_ERROR_INFO( 6, SIGILL, "invalid opcode", invalid_op, ILL_ILLOPN, regs->eip) 566DO_ERROR_INFO( 6, SIGILL, "invalid opcode", invalid_op, ILL_ILLOPN, regs->eip, 0)
565DO_ERROR( 9, SIGFPE, "coprocessor segment overrun", coprocessor_segment_overrun) 567DO_ERROR( 9, SIGFPE, "coprocessor segment overrun", coprocessor_segment_overrun)
566DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS) 568DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
567DO_ERROR(11, SIGBUS, "segment not present", segment_not_present) 569DO_ERROR(11, SIGBUS, "segment not present", segment_not_present)
568DO_ERROR(12, SIGBUS, "stack segment", stack_segment) 570DO_ERROR(12, SIGBUS, "stack segment", stack_segment)
569DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0) 571DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0, 0)
570DO_ERROR_INFO(32, SIGSEGV, "iret exception", iret_error, ILL_BADSTK, 0) 572DO_ERROR_INFO(32, SIGSEGV, "iret exception", iret_error, ILL_BADSTK, 0, 1)
571 573
572fastcall void __kprobes do_general_protection(struct pt_regs * regs, 574fastcall void __kprobes do_general_protection(struct pt_regs * regs,
573 long error_code) 575 long error_code)