Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f8efbb9 authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds
Browse files

[PATCH] x86_64: Allow nesting of int3 by default for kprobes



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: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent aa41eb99
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -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;
}
+5 −7
Original line number Diff line number Diff line
@@ -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
+7 −0
Original line number Diff line number Diff line
@@ -26,6 +26,13 @@
#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)

+0 −7
Original line number Diff line number Diff line
@@ -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);							\