Commit 04bb591c authored by Andi Kleen's avatar Andi Kleen Committed by H. Peter Anvin

x86, asmlinkage: Make kprobes code visible and fix assembler code

- Make all the external assembler template symbols __visible
- Move the templates inline assembler code into a top level
  assembler statement, not inside a function. This avoids it being
  optimized away or cloned.

Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
Link: http://lkml.kernel.org/r/1375740170-7446-8-git-send-email-andi@firstfloor.orgSigned-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
parent ff49103f
...@@ -49,10 +49,10 @@ typedef u8 kprobe_opcode_t; ...@@ -49,10 +49,10 @@ typedef u8 kprobe_opcode_t;
#define flush_insn_slot(p) do { } while (0) #define flush_insn_slot(p) do { } while (0)
/* optinsn template addresses */ /* optinsn template addresses */
extern kprobe_opcode_t optprobe_template_entry; extern __visible kprobe_opcode_t optprobe_template_entry;
extern kprobe_opcode_t optprobe_template_val; extern __visible kprobe_opcode_t optprobe_template_val;
extern kprobe_opcode_t optprobe_template_call; extern __visible kprobe_opcode_t optprobe_template_call;
extern kprobe_opcode_t optprobe_template_end; extern __visible kprobe_opcode_t optprobe_template_end;
#define MAX_OPTIMIZED_LENGTH (MAX_INSN_SIZE + RELATIVE_ADDR_SIZE) #define MAX_OPTIMIZED_LENGTH (MAX_INSN_SIZE + RELATIVE_ADDR_SIZE)
#define MAX_OPTINSN_SIZE \ #define MAX_OPTINSN_SIZE \
(((unsigned long)&optprobe_template_end - \ (((unsigned long)&optprobe_template_end - \
...@@ -62,7 +62,7 @@ extern kprobe_opcode_t optprobe_template_end; ...@@ -62,7 +62,7 @@ extern kprobe_opcode_t optprobe_template_end;
extern const int kretprobe_blacklist_size; extern const int kretprobe_blacklist_size;
void arch_remove_kprobe(struct kprobe *p); void arch_remove_kprobe(struct kprobe *p);
void kretprobe_trampoline(void); asmlinkage void kretprobe_trampoline(void);
/* Architecture specific copy of original instruction*/ /* Architecture specific copy of original instruction*/
struct arch_specific_insn { struct arch_specific_insn {
......
...@@ -661,7 +661,7 @@ static void __used __kprobes kretprobe_trampoline_holder(void) ...@@ -661,7 +661,7 @@ static void __used __kprobes kretprobe_trampoline_holder(void)
/* /*
* Called from kretprobe_trampoline * Called from kretprobe_trampoline
*/ */
static __used __kprobes void *trampoline_handler(struct pt_regs *regs) __visible __used __kprobes void *trampoline_handler(struct pt_regs *regs)
{ {
struct kretprobe_instance *ri = NULL; struct kretprobe_instance *ri = NULL;
struct hlist_head *head, empty_rp; struct hlist_head *head, empty_rp;
......
...@@ -88,9 +88,7 @@ static void __kprobes synthesize_set_arg1(kprobe_opcode_t *addr, unsigned long v ...@@ -88,9 +88,7 @@ static void __kprobes synthesize_set_arg1(kprobe_opcode_t *addr, unsigned long v
*(unsigned long *)addr = val; *(unsigned long *)addr = val;
} }
static void __used __kprobes kprobes_optinsn_template_holder(void) asm (
{
asm volatile (
".global optprobe_template_entry\n" ".global optprobe_template_entry\n"
"optprobe_template_entry:\n" "optprobe_template_entry:\n"
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
...@@ -129,7 +127,6 @@ static void __used __kprobes kprobes_optinsn_template_holder(void) ...@@ -129,7 +127,6 @@ static void __used __kprobes kprobes_optinsn_template_holder(void)
#endif #endif
".global optprobe_template_end\n" ".global optprobe_template_end\n"
"optprobe_template_end:\n"); "optprobe_template_end:\n");
}
#define TMPL_MOVE_IDX \ #define TMPL_MOVE_IDX \
((long)&optprobe_template_val - (long)&optprobe_template_entry) ((long)&optprobe_template_val - (long)&optprobe_template_entry)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment