|
@@ -257,14 +257,9 @@ do_ftrace_mod_code(unsigned long ip, void *new_code)
|
|
|
return mod_code_status;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-static unsigned char ftrace_nop[MCOUNT_INSN_SIZE];
|
|
|
-
|
|
|
static unsigned char *ftrace_nop_replace(void)
|
|
|
{
|
|
|
- return ftrace_nop;
|
|
|
+ return ideal_nop5;
|
|
|
}
|
|
|
|
|
|
static int
|
|
@@ -338,62 +333,6 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
|
|
|
|
|
int __init ftrace_dyn_arch_init(void *data)
|
|
|
{
|
|
|
- extern const unsigned char ftrace_test_p6nop[];
|
|
|
- extern const unsigned char ftrace_test_nop5[];
|
|
|
- extern const unsigned char ftrace_test_jmp[];
|
|
|
- int faulted = 0;
|
|
|
-
|
|
|
- /*
|
|
|
- * There is no good nop for all x86 archs.
|
|
|
- * We will default to using the P6_NOP5, but first we
|
|
|
- * will test to make sure that the nop will actually
|
|
|
- * work on this CPU. If it faults, we will then
|
|
|
- * go to a lesser efficient 5 byte nop. If that fails
|
|
|
- * we then just use a jmp as our nop. This isn't the most
|
|
|
- * efficient nop, but we can not use a multi part nop
|
|
|
- * since we would then risk being preempted in the middle
|
|
|
- * of that nop, and if we enabled tracing then, it might
|
|
|
- * cause a system crash.
|
|
|
- *
|
|
|
- * TODO: check the cpuid to determine the best nop.
|
|
|
- */
|
|
|
- asm volatile (
|
|
|
- "ftrace_test_jmp:"
|
|
|
- "jmp ftrace_test_p6nop\n"
|
|
|
- "nop\n"
|
|
|
- "nop\n"
|
|
|
- "nop\n" /* 2 byte jmp + 3 bytes */
|
|
|
- "ftrace_test_p6nop:"
|
|
|
- P6_NOP5
|
|
|
- "jmp 1f\n"
|
|
|
- "ftrace_test_nop5:"
|
|
|
- ".byte 0x66,0x66,0x66,0x66,0x90\n"
|
|
|
- "1:"
|
|
|
- ".section .fixup, \"ax\"\n"
|
|
|
- "2: movl $1, %0\n"
|
|
|
- " jmp ftrace_test_nop5\n"
|
|
|
- "3: movl $2, %0\n"
|
|
|
- " jmp 1b\n"
|
|
|
- ".previous\n"
|
|
|
- _ASM_EXTABLE(ftrace_test_p6nop, 2b)
|
|
|
- _ASM_EXTABLE(ftrace_test_nop5, 3b)
|
|
|
- : "=r"(faulted) : "0" (faulted));
|
|
|
-
|
|
|
- switch (faulted) {
|
|
|
- case 0:
|
|
|
- pr_info("converting mcount calls to 0f 1f 44 00 00\n");
|
|
|
- memcpy(ftrace_nop, ftrace_test_p6nop, MCOUNT_INSN_SIZE);
|
|
|
- break;
|
|
|
- case 1:
|
|
|
- pr_info("converting mcount calls to 66 66 66 66 90\n");
|
|
|
- memcpy(ftrace_nop, ftrace_test_nop5, MCOUNT_INSN_SIZE);
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- pr_info("converting mcount calls to jmp . + 5\n");
|
|
|
- memcpy(ftrace_nop, ftrace_test_jmp, MCOUNT_INSN_SIZE);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
/* The return code is retured via data */
|
|
|
*(unsigned long *)data = 0;
|
|
|
|