From: Charlie Jenkins <charlie@rivosinc.com>
To: Nam Cao <namcaov@gmail.com>
Cc: Paul Walmsley <paul.walmsley@sifive.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/3] riscv: kprobes: simulate c.j instruction
Date: Tue, 8 Aug 2023 17:11:48 -0700 [thread overview]
Message-ID: <ZNLZxIRM5iIjmdcD@ghost> (raw)
In-Reply-To: <6ef76cd9984b8015826649d13f870f8ac45a2d0d.1690704360.git.namcaov@gmail.com>
On Sun, Jul 30, 2023 at 10:27:07AM +0200, Nam Cao wrote:
> kprobes currently rejects c.j instruction. Implement it.
>
> Signed-off-by: Nam Cao <namcaov@gmail.com>
> ---
> arch/riscv/kernel/probes/decode-insn.c | 3 ++-
> arch/riscv/kernel/probes/simulate-insn.c | 24 ++++++++++++++++++++++++
> arch/riscv/kernel/probes/simulate-insn.h | 1 +
> 3 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/arch/riscv/kernel/probes/decode-insn.c b/arch/riscv/kernel/probes/decode-insn.c
> index 64f6183b4717..39adb07a342d 100644
> --- a/arch/riscv/kernel/probes/decode-insn.c
> +++ b/arch/riscv/kernel/probes/decode-insn.c
> @@ -29,13 +29,14 @@ riscv_probe_decode_insn(probe_opcode_t *addr, struct arch_probe_insn *api)
> * TODO: the REJECTED ones below need to be implemented
> */
> #ifdef CONFIG_RISCV_ISA_C
> - RISCV_INSN_REJECTED(c_j, insn);
> RISCV_INSN_REJECTED(c_jr, insn);
> RISCV_INSN_REJECTED(c_jal, insn);
> RISCV_INSN_REJECTED(c_jalr, insn);
> RISCV_INSN_REJECTED(c_beqz, insn);
> RISCV_INSN_REJECTED(c_bnez, insn);
> RISCV_INSN_REJECTED(c_ebreak, insn);
> +
> + RISCV_INSN_SET_SIMULATE(c_j, insn);
> #endif
>
> RISCV_INSN_SET_SIMULATE(jal, insn);
> diff --git a/arch/riscv/kernel/probes/simulate-insn.c b/arch/riscv/kernel/probes/simulate-insn.c
> index 7441ac8a6843..3ba45c612cd8 100644
> --- a/arch/riscv/kernel/probes/simulate-insn.c
> +++ b/arch/riscv/kernel/probes/simulate-insn.c
> @@ -188,3 +188,27 @@ bool __kprobes simulate_branch(u32 opcode, unsigned long addr, struct pt_regs *r
>
> return true;
> }
> +
> +bool __kprobes simulate_c_j(u32 opcode, unsigned long addr, struct pt_regs *regs)
> +{
> + /*
> + * 15 13 12 2 1 0
> + * | funct3 | offset[11|4|9:8|10|6|7|3:1|5] | opcode |
> + * 3 11 2
> + */
> +
> + s32 offset;
> +
> + offset = ((opcode >> 3) & 0x7) << 1;
> + offset |= ((opcode >> 11) & 0x1) << 4;
> + offset |= ((opcode >> 2) & 0x1) << 5;
> + offset |= ((opcode >> 7) & 0x1) << 6;
> + offset |= ((opcode >> 6) & 0x1) << 7;
> + offset |= ((opcode >> 9) & 0x3) << 8;
> + offset |= ((opcode >> 8) & 0x1) << 10;
> + offset |= ((opcode >> 12) & 0x1) << 11;
> +
> + instruction_pointer_set(regs, addr + sign_extend32(offset, 11));
Can you use riscv_insn_insert_jtype_imm() from insn.h since it is
already created? It will also sign extend for you. Don't worry about
creating a similar function for the branches, I am in the process of
refactoring the insn.h file.
> +
> + return true;
> +}
> diff --git a/arch/riscv/kernel/probes/simulate-insn.h b/arch/riscv/kernel/probes/simulate-insn.h
> index 61e35db31001..4bd6c266e7d3 100644
> --- a/arch/riscv/kernel/probes/simulate-insn.h
> +++ b/arch/riscv/kernel/probes/simulate-insn.h
> @@ -24,5 +24,6 @@ bool simulate_auipc(u32 opcode, unsigned long addr, struct pt_regs *regs);
> bool simulate_branch(u32 opcode, unsigned long addr, struct pt_regs *regs);
> bool simulate_jal(u32 opcode, unsigned long addr, struct pt_regs *regs);
> bool simulate_jalr(u32 opcode, unsigned long addr, struct pt_regs *regs);
> +bool simulate_c_j(u32 opcode, unsigned long addr, struct pt_regs *regs);
>
> #endif /* _RISCV_KERNEL_PROBES_SIMULATE_INSN_H */
> --
> 2.34.1
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv
Thanks,
Charlie
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: Charlie Jenkins <charlie@rivosinc.com>
To: Nam Cao <namcaov@gmail.com>
Cc: Paul Walmsley <paul.walmsley@sifive.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/3] riscv: kprobes: simulate c.j instruction
Date: Tue, 8 Aug 2023 17:11:48 -0700 [thread overview]
Message-ID: <ZNLZxIRM5iIjmdcD@ghost> (raw)
In-Reply-To: <6ef76cd9984b8015826649d13f870f8ac45a2d0d.1690704360.git.namcaov@gmail.com>
On Sun, Jul 30, 2023 at 10:27:07AM +0200, Nam Cao wrote:
> kprobes currently rejects c.j instruction. Implement it.
>
> Signed-off-by: Nam Cao <namcaov@gmail.com>
> ---
> arch/riscv/kernel/probes/decode-insn.c | 3 ++-
> arch/riscv/kernel/probes/simulate-insn.c | 24 ++++++++++++++++++++++++
> arch/riscv/kernel/probes/simulate-insn.h | 1 +
> 3 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/arch/riscv/kernel/probes/decode-insn.c b/arch/riscv/kernel/probes/decode-insn.c
> index 64f6183b4717..39adb07a342d 100644
> --- a/arch/riscv/kernel/probes/decode-insn.c
> +++ b/arch/riscv/kernel/probes/decode-insn.c
> @@ -29,13 +29,14 @@ riscv_probe_decode_insn(probe_opcode_t *addr, struct arch_probe_insn *api)
> * TODO: the REJECTED ones below need to be implemented
> */
> #ifdef CONFIG_RISCV_ISA_C
> - RISCV_INSN_REJECTED(c_j, insn);
> RISCV_INSN_REJECTED(c_jr, insn);
> RISCV_INSN_REJECTED(c_jal, insn);
> RISCV_INSN_REJECTED(c_jalr, insn);
> RISCV_INSN_REJECTED(c_beqz, insn);
> RISCV_INSN_REJECTED(c_bnez, insn);
> RISCV_INSN_REJECTED(c_ebreak, insn);
> +
> + RISCV_INSN_SET_SIMULATE(c_j, insn);
> #endif
>
> RISCV_INSN_SET_SIMULATE(jal, insn);
> diff --git a/arch/riscv/kernel/probes/simulate-insn.c b/arch/riscv/kernel/probes/simulate-insn.c
> index 7441ac8a6843..3ba45c612cd8 100644
> --- a/arch/riscv/kernel/probes/simulate-insn.c
> +++ b/arch/riscv/kernel/probes/simulate-insn.c
> @@ -188,3 +188,27 @@ bool __kprobes simulate_branch(u32 opcode, unsigned long addr, struct pt_regs *r
>
> return true;
> }
> +
> +bool __kprobes simulate_c_j(u32 opcode, unsigned long addr, struct pt_regs *regs)
> +{
> + /*
> + * 15 13 12 2 1 0
> + * | funct3 | offset[11|4|9:8|10|6|7|3:1|5] | opcode |
> + * 3 11 2
> + */
> +
> + s32 offset;
> +
> + offset = ((opcode >> 3) & 0x7) << 1;
> + offset |= ((opcode >> 11) & 0x1) << 4;
> + offset |= ((opcode >> 2) & 0x1) << 5;
> + offset |= ((opcode >> 7) & 0x1) << 6;
> + offset |= ((opcode >> 6) & 0x1) << 7;
> + offset |= ((opcode >> 9) & 0x3) << 8;
> + offset |= ((opcode >> 8) & 0x1) << 10;
> + offset |= ((opcode >> 12) & 0x1) << 11;
> +
> + instruction_pointer_set(regs, addr + sign_extend32(offset, 11));
Can you use riscv_insn_insert_jtype_imm() from insn.h since it is
already created? It will also sign extend for you. Don't worry about
creating a similar function for the branches, I am in the process of
refactoring the insn.h file.
> +
> + return true;
> +}
> diff --git a/arch/riscv/kernel/probes/simulate-insn.h b/arch/riscv/kernel/probes/simulate-insn.h
> index 61e35db31001..4bd6c266e7d3 100644
> --- a/arch/riscv/kernel/probes/simulate-insn.h
> +++ b/arch/riscv/kernel/probes/simulate-insn.h
> @@ -24,5 +24,6 @@ bool simulate_auipc(u32 opcode, unsigned long addr, struct pt_regs *regs);
> bool simulate_branch(u32 opcode, unsigned long addr, struct pt_regs *regs);
> bool simulate_jal(u32 opcode, unsigned long addr, struct pt_regs *regs);
> bool simulate_jalr(u32 opcode, unsigned long addr, struct pt_regs *regs);
> +bool simulate_c_j(u32 opcode, unsigned long addr, struct pt_regs *regs);
>
> #endif /* _RISCV_KERNEL_PROBES_SIMULATE_INSN_H */
> --
> 2.34.1
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv
Thanks,
Charlie
next prev parent reply other threads:[~2023-08-09 0:12 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-30 8:27 [PATCH 0/3] riscv: kprobes: simulate some instructions Nam Cao
2023-07-30 8:27 ` Nam Cao
2023-07-30 8:27 ` [PATCH 1/3] riscv: kprobes: simulate c.j instruction Nam Cao
2023-07-30 8:27 ` Nam Cao
2023-08-09 0:11 ` Charlie Jenkins [this message]
2023-08-09 0:11 ` Charlie Jenkins
2023-08-09 1:05 ` Charlie Jenkins
2023-08-09 1:05 ` Charlie Jenkins
2023-07-30 8:27 ` [PATCH 2/3] riscv: kprobes: simulate c.jr and c.jalr instructions Nam Cao
2023-07-30 8:27 ` Nam Cao
2023-08-09 1:06 ` Charlie Jenkins
2023-08-09 1:06 ` Charlie Jenkins
2023-07-30 8:27 ` [PATCH 3/3] riscv: kprobes: simulate c.beqz and c.bnez Nam Cao
2023-07-30 8:27 ` Nam Cao
2023-08-09 1:14 ` Charlie Jenkins
2023-08-09 1:14 ` Charlie Jenkins
2023-07-30 8:27 ` test code for kprobe Nam Cao
2023-07-30 8:27 ` Nam Cao
2023-08-14 12:28 ` Björn Töpel
2023-08-14 12:28 ` Björn Töpel
2023-08-14 13:50 ` Nam Cao
2023-08-14 13:50 ` Nam Cao
2023-08-14 14:10 ` Björn Töpel
2023-08-14 14:10 ` Björn Töpel
2023-08-30 13:20 ` [PATCH 0/3] riscv: kprobes: simulate some instructions patchwork-bot+linux-riscv
2023-08-30 13:20 ` patchwork-bot+linux-riscv
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=ZNLZxIRM5iIjmdcD@ghost \
--to=charlie@rivosinc.com \
--cc=aou@eecs.berkeley.edu \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=namcaov@gmail.com \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
/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.