All of lore.kernel.org
 help / color / mirror / Atom feed
From: Masami Hiramatsu <mhiramat@kernel.org>
To: Peter Zijlstra <peterz@infradead.org>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org,
	rostedt@goodmis.org, mhiramat@kernel.org, bristot@redhat.com,
	jbaron@akamai.com, torvalds@linux-foundation.org,
	tglx@linutronix.de, mingo@kernel.org, namit@vmware.com,
	hpa@zytor.com, luto@kernel.org, ard.biesheuvel@linaro.org,
	jpoimboe@redhat.com, jeyu@kernel.org
Subject: Re: [PATCH v4 11/16] x86/kprobes: Convert to text-patching.h
Date: Mon, 21 Oct 2019 23:57:19 +0900	[thread overview]
Message-ID: <20191021235719.aa4bfffae033409e6e295890@kernel.org> (raw)
In-Reply-To: <20191018074634.571994469@infradead.org>

Hi Peter,

On Fri, 18 Oct 2019 09:35:36 +0200
Peter Zijlstra <peterz@infradead.org> wrote:

> Convert kprobes to the new text-poke naming.
> 

Looks good to me :)

Acked-by: Masami Hiramatsu <mhiramat@kernel.org>

Thanks,

> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
>  arch/x86/include/asm/kprobes.h       |   14 +++--------
>  arch/x86/include/asm/text-patching.h |    2 +
>  arch/x86/kernel/kprobes/core.c       |   18 +++++++-------
>  arch/x86/kernel/kprobes/opt.c        |   44 ++++++++++++++++-------------------
>  4 files changed, 37 insertions(+), 41 deletions(-)
> 
> --- a/arch/x86/include/asm/kprobes.h
> +++ b/arch/x86/include/asm/kprobes.h
> @@ -11,12 +11,11 @@
>  
>  #include <asm-generic/kprobes.h>
>  
> -#define BREAKPOINT_INSTRUCTION	0xcc
> -
>  #ifdef CONFIG_KPROBES
>  #include <linux/types.h>
>  #include <linux/ptrace.h>
>  #include <linux/percpu.h>
> +#include <asm/text-patching.h>
>  #include <asm/insn.h>
>  
>  #define  __ARCH_WANT_KPROBES_INSN_SLOT
> @@ -25,10 +24,7 @@ struct pt_regs;
>  struct kprobe;
>  
>  typedef u8 kprobe_opcode_t;
> -#define RELATIVEJUMP_OPCODE 0xe9
> -#define RELATIVEJUMP_SIZE 5
> -#define RELATIVECALL_OPCODE 0xe8
> -#define RELATIVE_ADDR_SIZE 4
> +
>  #define MAX_STACK_SIZE 64
>  #define CUR_STACK_SIZE(ADDR) \
>  	(current_top_of_stack() - (unsigned long)(ADDR))
> @@ -43,11 +39,11 @@ extern __visible kprobe_opcode_t optprob
>  extern __visible kprobe_opcode_t optprobe_template_val[];
>  extern __visible kprobe_opcode_t optprobe_template_call[];
>  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 + DISP32_SIZE)
>  #define MAX_OPTINSN_SIZE 				\
>  	(((unsigned long)optprobe_template_end -	\
>  	  (unsigned long)optprobe_template_entry) +	\
> -	 MAX_OPTIMIZED_LENGTH + RELATIVEJUMP_SIZE)
> +	 MAX_OPTIMIZED_LENGTH + JMP32_INSN_SIZE)
>  
>  extern const int kretprobe_blacklist_size;
>  
> @@ -73,7 +69,7 @@ struct arch_specific_insn {
>  
>  struct arch_optimized_insn {
>  	/* copy of the original instructions */
> -	kprobe_opcode_t copied_insn[RELATIVE_ADDR_SIZE];
> +	kprobe_opcode_t copied_insn[DISP32_SIZE];
>  	/* detour code buffer */
>  	kprobe_opcode_t *insn;
>  	/* the size of instructions copied to detour code buffer */
> --- a/arch/x86/include/asm/text-patching.h
> +++ b/arch/x86/include/asm/text-patching.h
> @@ -61,6 +61,8 @@ extern void text_poke_finish(void);
>  #define JMP8_INSN_SIZE		2
>  #define JMP8_INSN_OPCODE	0xEB
>  
> +#define DISP32_SIZE		4
> +
>  static inline int text_opcode_size(u8 opcode)
>  {
>  	int size = 0;
> --- a/arch/x86/kernel/kprobes/core.c
> +++ b/arch/x86/kernel/kprobes/core.c
> @@ -119,14 +119,14 @@ __synthesize_relative_insn(void *dest, v
>  /* Insert a jump instruction at address 'from', which jumps to address 'to'.*/
>  void synthesize_reljump(void *dest, void *from, void *to)
>  {
> -	__synthesize_relative_insn(dest, from, to, RELATIVEJUMP_OPCODE);
> +	__synthesize_relative_insn(dest, from, to, JMP32_INSN_OPCODE);
>  }
>  NOKPROBE_SYMBOL(synthesize_reljump);
>  
>  /* Insert a call instruction at address 'from', which calls address 'to'.*/
>  void synthesize_relcall(void *dest, void *from, void *to)
>  {
> -	__synthesize_relative_insn(dest, from, to, RELATIVECALL_OPCODE);
> +	__synthesize_relative_insn(dest, from, to, CALL_INSN_OPCODE);
>  }
>  NOKPROBE_SYMBOL(synthesize_relcall);
>  
> @@ -301,7 +301,7 @@ static int can_probe(unsigned long paddr
>  		 * Another debugging subsystem might insert this breakpoint.
>  		 * In that case, we can't recover it.
>  		 */
> -		if (insn.opcode.bytes[0] == BREAKPOINT_INSTRUCTION)
> +		if (insn.opcode.bytes[0] == INT3_INSN_OPCODE)
>  			return 0;
>  		addr += insn.length;
>  	}
> @@ -352,7 +352,7 @@ int __copy_instruction(u8 *dest, u8 *src
>  	insn_get_length(insn);
>  
>  	/* Another subsystem puts a breakpoint, failed to recover */
> -	if (insn->opcode.bytes[0] == BREAKPOINT_INSTRUCTION)
> +	if (insn->opcode.bytes[0] == INT3_INSN_OPCODE)
>  		return 0;
>  
>  	/* We should not singlestep on the exception masking instructions */
> @@ -396,14 +396,14 @@ static int prepare_boost(kprobe_opcode_t
>  	int len = insn->length;
>  
>  	if (can_boost(insn, p->addr) &&
> -	    MAX_INSN_SIZE - len >= RELATIVEJUMP_SIZE) {
> +	    MAX_INSN_SIZE - len >= JMP32_INSN_SIZE) {
>  		/*
>  		 * These instructions can be executed directly if it
>  		 * jumps back to correct address.
>  		 */
>  		synthesize_reljump(buf + len, p->ainsn.insn + len,
>  				   p->addr + insn->length);
> -		len += RELATIVEJUMP_SIZE;
> +		len += JMP32_INSN_SIZE;
>  		p->ainsn.boostable = true;
>  	} else {
>  		p->ainsn.boostable = false;
> @@ -497,7 +497,7 @@ int arch_prepare_kprobe(struct kprobe *p
>  
>  void arch_arm_kprobe(struct kprobe *p)
>  {
> -	text_poke(p->addr, ((unsigned char []){BREAKPOINT_INSTRUCTION}), 1);
> +	text_poke(p->addr, ((unsigned char []){INT3_INSN_OPCODE}), 1);
>  }
>  
>  void arch_disarm_kprobe(struct kprobe *p)
> @@ -605,7 +605,7 @@ static void setup_singlestep(struct kpro
>  	regs->flags |= X86_EFLAGS_TF;
>  	regs->flags &= ~X86_EFLAGS_IF;
>  	/* single step inline if the instruction is an int3 */
> -	if (p->opcode == BREAKPOINT_INSTRUCTION)
> +	if (p->opcode == INT3_INSN_OPCODE)
>  		regs->ip = (unsigned long)p->addr;
>  	else
>  		regs->ip = (unsigned long)p->ainsn.insn;
> @@ -691,7 +691,7 @@ int kprobe_int3_handler(struct pt_regs *
>  				reset_current_kprobe();
>  			return 1;
>  		}
> -	} else if (*addr != BREAKPOINT_INSTRUCTION) {
> +	} else if (*addr != INT3_INSN_OPCODE) {
>  		/*
>  		 * The breakpoint instruction was removed right
>  		 * after we hit it.  Another cpu has removed
> --- a/arch/x86/kernel/kprobes/opt.c
> +++ b/arch/x86/kernel/kprobes/opt.c
> @@ -38,7 +38,7 @@ unsigned long __recover_optprobed_insn(k
>  	long offs;
>  	int i;
>  
> -	for (i = 0; i < RELATIVEJUMP_SIZE; i++) {
> +	for (i = 0; i < JMP32_INSN_SIZE; i++) {
>  		kp = get_kprobe((void *)addr - i);
>  		/* This function only handles jump-optimized kprobe */
>  		if (kp && kprobe_optimized(kp)) {
> @@ -62,10 +62,10 @@ unsigned long __recover_optprobed_insn(k
>  
>  	if (addr == (unsigned long)kp->addr) {
>  		buf[0] = kp->opcode;
> -		memcpy(buf + 1, op->optinsn.copied_insn, RELATIVE_ADDR_SIZE);
> +		memcpy(buf + 1, op->optinsn.copied_insn, DISP32_SIZE);
>  	} else {
>  		offs = addr - (unsigned long)kp->addr - 1;
> -		memcpy(buf, op->optinsn.copied_insn + offs, RELATIVE_ADDR_SIZE - offs);
> +		memcpy(buf, op->optinsn.copied_insn + offs, DISP32_SIZE - offs);
>  	}
>  
>  	return (unsigned long)buf;
> @@ -141,8 +141,6 @@ STACK_FRAME_NON_STANDARD(optprobe_templa
>  #define TMPL_END_IDX \
>  	((long)optprobe_template_end - (long)optprobe_template_entry)
>  
> -#define INT3_SIZE sizeof(kprobe_opcode_t)
> -
>  /* Optimized kprobe call back function: called from optinsn */
>  static void
>  optimized_callback(struct optimized_kprobe *op, struct pt_regs *regs)
> @@ -162,7 +160,7 @@ optimized_callback(struct optimized_kpro
>  		regs->cs |= get_kernel_rpl();
>  		regs->gs = 0;
>  #endif
> -		regs->ip = (unsigned long)op->kp.addr + INT3_SIZE;
> +		regs->ip = (unsigned long)op->kp.addr + INT3_INSN_SIZE;
>  		regs->orig_ax = ~0UL;
>  
>  		__this_cpu_write(current_kprobe, &op->kp);
> @@ -179,7 +177,7 @@ static int copy_optimized_instructions(u
>  	struct insn insn;
>  	int len = 0, ret;
>  
> -	while (len < RELATIVEJUMP_SIZE) {
> +	while (len < JMP32_INSN_SIZE) {
>  		ret = __copy_instruction(dest + len, src + len, real + len, &insn);
>  		if (!ret || !can_boost(&insn, src + len))
>  			return -EINVAL;
> @@ -271,7 +269,7 @@ static int can_optimize(unsigned long pa
>  		return 0;
>  
>  	/* Check there is enough space for a relative jump. */
> -	if (size - offset < RELATIVEJUMP_SIZE)
> +	if (size - offset < JMP32_INSN_SIZE)
>  		return 0;
>  
>  	/* Decode instructions */
> @@ -290,15 +288,15 @@ static int can_optimize(unsigned long pa
>  		kernel_insn_init(&insn, (void *)recovered_insn, MAX_INSN_SIZE);
>  		insn_get_length(&insn);
>  		/* Another subsystem puts a breakpoint */
> -		if (insn.opcode.bytes[0] == BREAKPOINT_INSTRUCTION)
> +		if (insn.opcode.bytes[0] == INT3_INSN_OPCODE)
>  			return 0;
>  		/* Recover address */
>  		insn.kaddr = (void *)addr;
>  		insn.next_byte = (void *)(addr + insn.length);
>  		/* Check any instructions don't jump into target */
>  		if (insn_is_indirect_jump(&insn) ||
> -		    insn_jump_into_range(&insn, paddr + INT3_SIZE,
> -					 RELATIVE_ADDR_SIZE))
> +		    insn_jump_into_range(&insn, paddr + INT3_INSN_SIZE,
> +					 DISP32_SIZE))
>  			return 0;
>  		addr += insn.length;
>  	}
> @@ -374,7 +372,7 @@ int arch_prepare_optimized_kprobe(struct
>  	 * Verify if the address gap is in 2GB range, because this uses
>  	 * a relative jump.
>  	 */
> -	rel = (long)slot - (long)op->kp.addr + RELATIVEJUMP_SIZE;
> +	rel = (long)slot - (long)op->kp.addr + JMP32_INSN_SIZE;
>  	if (abs(rel) > 0x7fffffff) {
>  		ret = -ERANGE;
>  		goto err;
> @@ -401,7 +399,7 @@ int arch_prepare_optimized_kprobe(struct
>  	/* Set returning jmp instruction at the tail of out-of-line buffer */
>  	synthesize_reljump(buf + len, slot + len,
>  			   (u8 *)op->kp.addr + op->optinsn.size);
> -	len += RELATIVEJUMP_SIZE;
> +	len += JMP32_INSN_SIZE;
>  
>  	/* We have to use text_poke() for instruction buffer because it is RO */
>  	text_poke(slot, buf, len);
> @@ -422,22 +420,22 @@ int arch_prepare_optimized_kprobe(struct
>  void arch_optimize_kprobes(struct list_head *oplist)
>  {
>  	struct optimized_kprobe *op, *tmp;
> -	u8 insn_buff[RELATIVEJUMP_SIZE];
> +	u8 insn_buff[JMP32_INSN_SIZE];
>  
>  	list_for_each_entry_safe(op, tmp, oplist, list) {
>  		s32 rel = (s32)((long)op->optinsn.insn -
> -			((long)op->kp.addr + RELATIVEJUMP_SIZE));
> +			((long)op->kp.addr + JMP32_INSN_SIZE));
>  
>  		WARN_ON(kprobe_disabled(&op->kp));
>  
>  		/* Backup instructions which will be replaced by jump address */
> -		memcpy(op->optinsn.copied_insn, op->kp.addr + INT3_SIZE,
> -		       RELATIVE_ADDR_SIZE);
> +		memcpy(op->optinsn.copied_insn, op->kp.addr + INT3_INSN_SIZE,
> +		       DISP32_SIZE);
>  
> -		insn_buff[0] = RELATIVEJUMP_OPCODE;
> +		insn_buff[0] = JMP32_INSN_OPCODE;
>  		*(s32 *)(&insn_buff[1]) = rel;
>  
> -		text_poke_bp(op->kp.addr, insn_buff, RELATIVEJUMP_SIZE, NULL);
> +		text_poke_bp(op->kp.addr, insn_buff, JMP32_INSN_SIZE, NULL);
>  
>  		list_del_init(&op->list);
>  	}
> @@ -446,13 +444,13 @@ void arch_optimize_kprobes(struct list_h
>  /* Replace a relative jump with a breakpoint (int3).  */
>  void arch_unoptimize_kprobe(struct optimized_kprobe *op)
>  {
> -	u8 insn_buff[RELATIVEJUMP_SIZE];
> +	u8 insn_buff[JMP32_INSN_SIZE];
>  
>  	/* Set int3 to first byte for kprobes */
> -	insn_buff[0] = BREAKPOINT_INSTRUCTION;
> -	memcpy(insn_buff + 1, op->optinsn.copied_insn, RELATIVE_ADDR_SIZE);
> +	insn_buff[0] = INT3_INSN_OPCODE;
> +	memcpy(insn_buff + 1, op->optinsn.copied_insn, DISP32_SIZE);
>  
> -	text_poke_bp(op->kp.addr, insn_buff, RELATIVEJUMP_SIZE,
> +	text_poke_bp(op->kp.addr, insn_buff, JMP32_INSN_SIZE,
>  		     text_gen_insn(JMP32_INSN_OPCODE, op->kp.addr, op->optinsn.insn));
>  }
>  
> 
> 


-- 
Masami Hiramatsu <mhiramat@kernel.org>

  reply	other threads:[~2019-10-21 14:57 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-18  7:35 [PATCH v4 00/16] Rewrite x86/ftrace to use text_poke (and more) Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 01/16] x86/alternatives: Teach text_poke_bp() to emulate instructions Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 02/16] x86/alternatives: Update int3_emulate_push() comment Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 03/16] x86/alternatives,jump_label: Provide better text_poke() batching interface Peter Zijlstra
2019-10-21  8:48   ` Ingo Molnar
2019-10-21  9:21     ` Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 04/16] x86/alternatives: Add and use text_gen_insn() helper Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 05/16] x86/ftrace: Use text_poke() Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 06/16] x86/mm: Remove set_kernel_text_r[ow]() Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 07/16] x86/alternative: Add text_opcode_size() Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 08/16] x86/ftrace: Use text_gen_insn() Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 09/16] x86/alternative: Remove text_poke_loc::len Peter Zijlstra
2019-10-21  8:58   ` Ingo Molnar
2019-10-21  9:02     ` Ingo Molnar
2019-10-18  7:35 ` [PATCH v4 10/16] x86/alternative: Shrink text_poke_loc Peter Zijlstra
2019-10-21  9:01   ` Ingo Molnar
2019-10-21  9:25     ` Peter Zijlstra
2019-10-21  9:33       ` Ingo Molnar
2019-10-18  7:35 ` [PATCH v4 11/16] x86/kprobes: Convert to text-patching.h Peter Zijlstra
2019-10-21 14:57   ` Masami Hiramatsu [this message]
2019-10-18  7:35 ` [PATCH v4 12/16] x86/kprobes: Fix ordering Peter Zijlstra
2019-10-22  1:35   ` Masami Hiramatsu
2019-10-22 10:31     ` Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 13/16] arm/ftrace: Use __patch_text_real() Peter Zijlstra
2019-10-28 16:25   ` Will Deacon
2019-10-28 16:34     ` Peter Zijlstra
2019-10-28 16:35       ` Peter Zijlstra
2019-10-28 16:47       ` Will Deacon
2019-10-28 16:55         ` Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 14/16] module: Remove set_all_modules_text_*() Peter Zijlstra
2019-10-18  7:35 ` [PATCH v4 15/16] module: Move where we mark modules RO,X Peter Zijlstra
2019-10-21 13:53   ` Josh Poimboeuf
2019-10-21 14:14     ` Peter Zijlstra
2019-10-21 15:34       ` Peter Zijlstra
2019-10-21 15:44         ` Peter Zijlstra
2019-10-21 16:11         ` Peter Zijlstra
2019-10-22 11:31           ` Heiko Carstens
2019-10-22 12:31             ` Peter Zijlstra
2019-10-23 11:48       ` Peter Zijlstra
2019-10-23 15:16         ` Peter Zijlstra
2019-10-23 17:15           ` Josh Poimboeuf
2019-10-24 10:59             ` Peter Zijlstra
2019-10-24 18:31               ` Josh Poimboeuf
2019-10-24 20:33                 ` Peter Zijlstra
2019-10-23 17:00         ` Josh Poimboeuf
2019-10-24 13:16           ` Peter Zijlstra
2019-10-25  6:44             ` Petr Mladek
2019-10-25  8:43               ` Peter Zijlstra
2019-10-25 10:06                 ` Peter Zijlstra
2019-10-25 13:50                   ` Josh Poimboeuf
2019-10-26  1:17                   ` Josh Poimboeuf
2019-10-28 10:07                     ` Peter Zijlstra
2019-10-28 10:43                     ` Peter Zijlstra
2019-10-25  9:16               ` Peter Zijlstra
2019-10-22  2:21   ` Steven Rostedt
2019-10-22 20:24     ` Peter Zijlstra
2019-10-22 20:40       ` Steven Rostedt
2019-10-23  9:07         ` Peter Zijlstra
2019-10-23 18:52       ` Steven Rostedt
2019-10-24 10:16         ` Peter Zijlstra
2019-10-24 10:18           ` Peter Zijlstra
2019-10-24 15:00           ` Steven Rostedt
2019-10-24 16:43             ` Peter Zijlstra
2019-10-24 18:17               ` Steven Rostedt
2019-10-24 20:24                 ` Peter Zijlstra
2019-10-24 20:28                   ` Steven Rostedt
2019-10-18  7:35 ` [PATCH v4 16/16] ftrace: Merge ftrace_module_{init,enable}() Peter Zijlstra
2019-10-18  8:20   ` Peter Zijlstra
2019-10-21  9:09 ` [PATCH v4 00/16] Rewrite x86/ftrace to use text_poke (and more) Ingo Molnar
2019-10-21 13:38   ` Steven Rostedt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191021235719.aa4bfffae033409e6e295890@kernel.org \
    --to=mhiramat@kernel.org \
    --cc=ard.biesheuvel@linaro.org \
    --cc=bristot@redhat.com \
    --cc=hpa@zytor.com \
    --cc=jbaron@akamai.com \
    --cc=jeyu@kernel.org \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mingo@kernel.org \
    --cc=namit@vmware.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.