[PATCH] x86_64: Allow nesting of int3 by default for kprobes
authorAndi Kleen <ak@suse.de>
Mon, 16 Jan 2006 00:56:39 +0000 (01:56 +0100)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 16 Jan 2006 19:27:58 +0000 (11:27 -0800)
This unbreaks recursive kprobes which didn't work anymore
due to an earlier patch which converted the debug entry point
to use an IST.

This also allows nesting of the debug entry point too.

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/x86_64/kernel/asm-offsets.c
arch/x86_64/kernel/entry.S
include/asm-x86_64/page.h
include/asm-x86_64/processor.h

index cfb4f9cebea4d7e9670a1131ee60055216292650..38834bbbae1119c908c8b4cf6e653d120833a679 100644 (file)
@@ -43,6 +43,7 @@ int main(void)
        ENTRY(irqcount);
        ENTRY(cpunumber);
        ENTRY(irqstackptr);
+       ENTRY(data_offset);
        BLANK();
 #undef ENTRY
 #ifdef CONFIG_IA32_EMULATION
@@ -66,8 +67,6 @@ int main(void)
        DEFINE(pbe_orig_address, offsetof(struct pbe, orig_address));
        DEFINE(pbe_next, offsetof(struct pbe, next));
        BLANK();
-#if DEBUG_STKSZ > EXCEPTION_STKSZ
-       DEFINE(DEBUG_IST, DEBUG_STACK);
-#endif
+       DEFINE(TSS_ist, offsetof(struct tss_struct, ist));
        return 0;
 }
index 632fc0f59fccc23a70ff6c8e4b891e4f6ba96b88..dbdba56e8faad4fa77fa1b87f212c309b201ffd7 100644 (file)
@@ -41,6 +41,7 @@
 #include <asm/unistd.h>
 #include <asm/thread_info.h>
 #include <asm/hw_irq.h>
+#include <asm/page.h>
 
        .code64
 
@@ -674,9 +675,6 @@ ENTRY(spurious_interrupt)
 
        /* error code is on the stack already */
        /* handle NMI like exceptions that can happen everywhere */
-#ifndef DEBUG_IST
-# define DEBUG_IST 0
-#endif
        .macro paranoidentry sym, ist=0
        SAVE_ALL
        cld
@@ -695,11 +693,11 @@ ENTRY(spurious_interrupt)
        movq ORIG_RAX(%rsp),%rsi
        movq $-1,ORIG_RAX(%rsp)
        .if \ist
-       subq    $EXCEPTION_STACK_SIZE, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp)
+       subq    $EXCEPTION_STKSZ, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp)
        .endif
        call \sym
        .if \ist
-       addq    $EXCEPTION_STACK_SIZE, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp)
+       addq    $EXCEPTION_STKSZ, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp)
        .endif
        cli
        .endm
@@ -918,7 +916,7 @@ KPROBE_ENTRY(debug)
        INTR_FRAME
        pushq $0
        CFI_ADJUST_CFA_OFFSET 8         
-       paranoidentry do_debug, DEBUG_IST
+       paranoidentry do_debug, DEBUG_STACK
        jmp paranoid_exit
        CFI_ENDPROC
        .previous .text
@@ -976,7 +974,7 @@ KPROBE_ENTRY(int3)
        INTR_FRAME
        pushq $0
        CFI_ADJUST_CFA_OFFSET 8
-       paranoidentry do_int3, DEBUG_IST
+       paranoidentry do_int3, DEBUG_STACK
        jmp paranoid_exit
        CFI_ENDPROC
        .previous .text
index dcbb4fcd9a180b33d44023c351f1131580eb77f0..615e3e494929797ef4f9411f1b9b039ea4a74e50 100644 (file)
 #define IRQSTACK_ORDER 2
 #define IRQSTACKSIZE (PAGE_SIZE << IRQSTACK_ORDER)
 
+#define STACKFAULT_STACK 1
+#define DOUBLEFAULT_STACK 2
+#define NMI_STACK 3
+#define DEBUG_STACK 4
+#define MCE_STACK 5
+#define N_EXCEPTION_STACKS 5  /* hw limit: 7 */
+
 #define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
 #define LARGE_PAGE_SIZE (1UL << PMD_SHIFT)
 
index 87a282b1043a65cb2188e6c0a17a080c22bd2df6..a1ba7c97465a5f1d58eb38be35c3872e3e03014b 100644 (file)
@@ -273,13 +273,6 @@ struct thread_struct {
 #define INIT_MMAP \
 { &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, NULL, NULL }
 
-#define STACKFAULT_STACK 1
-#define DOUBLEFAULT_STACK 2 
-#define NMI_STACK 3 
-#define DEBUG_STACK 4 
-#define MCE_STACK 5
-#define N_EXCEPTION_STACKS 5  /* hw limit: 7 */
-
 #define start_thread(regs,new_rip,new_rsp) do { \
        asm volatile("movl %0,%%fs; movl %0,%%es; movl %0,%%ds": :"r" (0));      \
        load_gs_index(0);                                                       \