diff options
Diffstat (limited to 'arch/x86/kernel/ftrace.c')
| -rw-r--r-- | arch/x86/kernel/ftrace.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 1b43086b097a..231bdd3c5b1c 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c | |||
| @@ -488,20 +488,21 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) | |||
| 488 | * ignore such a protection. | 488 | * ignore such a protection. |
| 489 | */ | 489 | */ |
| 490 | asm volatile( | 490 | asm volatile( |
| 491 | "1: " _ASM_MOV " (%[parent_old]), %[old]\n" | 491 | "1: " _ASM_MOV " (%[parent]), %[old]\n" |
| 492 | "2: " _ASM_MOV " %[return_hooker], (%[parent_replaced])\n" | 492 | "2: " _ASM_MOV " %[return_hooker], (%[parent])\n" |
| 493 | " movl $0, %[faulted]\n" | 493 | " movl $0, %[faulted]\n" |
| 494 | "3:\n" | ||
| 494 | 495 | ||
| 495 | ".section .fixup, \"ax\"\n" | 496 | ".section .fixup, \"ax\"\n" |
| 496 | "3: movl $1, %[faulted]\n" | 497 | "4: movl $1, %[faulted]\n" |
| 498 | " jmp 3b\n" | ||
| 497 | ".previous\n" | 499 | ".previous\n" |
| 498 | 500 | ||
| 499 | _ASM_EXTABLE(1b, 3b) | 501 | _ASM_EXTABLE(1b, 4b) |
| 500 | _ASM_EXTABLE(2b, 3b) | 502 | _ASM_EXTABLE(2b, 4b) |
| 501 | 503 | ||
| 502 | : [parent_replaced] "=r" (parent), [old] "=r" (old), | 504 | : [old] "=r" (old), [faulted] "=r" (faulted) |
| 503 | [faulted] "=r" (faulted) | 505 | : [parent] "r" (parent), [return_hooker] "r" (return_hooker) |
| 504 | : [parent_old] "0" (parent), [return_hooker] "r" (return_hooker) | ||
| 505 | : "memory" | 506 | : "memory" |
| 506 | ); | 507 | ); |
| 507 | 508 | ||
