diff options
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r-- | kernel/trace/ftrace.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 7694f3e59797..4dda4f60a2a9 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -576,6 +576,16 @@ static void ftrace_shutdown_replenish(void) | |||
576 | ftrace_pages->next = (void *)get_zeroed_page(GFP_KERNEL); | 576 | ftrace_pages->next = (void *)get_zeroed_page(GFP_KERNEL); |
577 | } | 577 | } |
578 | 578 | ||
579 | static void print_ip_ins(const char *fmt, unsigned char *p) | ||
580 | { | ||
581 | int i; | ||
582 | |||
583 | printk(KERN_CONT "%s", fmt); | ||
584 | |||
585 | for (i = 0; i < MCOUNT_INSN_SIZE; i++) | ||
586 | printk(KERN_CONT "%s%02x", i ? ":" : "", p[i]); | ||
587 | } | ||
588 | |||
579 | static int | 589 | static int |
580 | ftrace_code_disable(struct dyn_ftrace *rec) | 590 | ftrace_code_disable(struct dyn_ftrace *rec) |
581 | { | 591 | { |
@@ -590,6 +600,23 @@ ftrace_code_disable(struct dyn_ftrace *rec) | |||
590 | 600 | ||
591 | failed = ftrace_modify_code(ip, call, nop); | 601 | failed = ftrace_modify_code(ip, call, nop); |
592 | if (failed) { | 602 | if (failed) { |
603 | switch (failed) { | ||
604 | case 1: | ||
605 | WARN_ON_ONCE(1); | ||
606 | pr_info("ftrace faulted on modifying "); | ||
607 | print_ip_sym(ip); | ||
608 | break; | ||
609 | case 2: | ||
610 | WARN_ON_ONCE(1); | ||
611 | pr_info("ftrace failed to modify "); | ||
612 | print_ip_sym(ip); | ||
613 | print_ip_ins(" expected: ", call); | ||
614 | print_ip_ins(" actual: ", (unsigned char *)ip); | ||
615 | print_ip_ins(" replace: ", nop); | ||
616 | printk(KERN_CONT "\n"); | ||
617 | break; | ||
618 | } | ||
619 | |||
593 | rec->flags |= FTRACE_FL_FAILED; | 620 | rec->flags |= FTRACE_FL_FAILED; |
594 | return 0; | 621 | return 0; |
595 | } | 622 | } |