arm64/kprobes: Tidy up sign-extension usage
PATCH 1/1 arm64/kprobes: Tidy up sign-extension usage
Kprobes does not need its own homebrewed (and frankly inscrutable) sign extension macro; just use the standard kernel functions instead. Since the compiler actually recognises the sign-extension idiom of the latter, we also get the small bonus of some nicer codegen, as each displacement calculation helper then compiles to a single optimal SBFX instruction.
--- arch/arm64/kernel/probes/simulate-insn.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-)
arch/arm64/kernel/probes/simulate-insn.c +7 -9
@@ -13,28 +13,26 @@* General Public License for more details. */ +#include <linux/bitops.h> #include <linux/kernel.h> #include <linux/kprobes.h> #include "simulate-insn.h" -#define sign_extend (x, signbit) \ - ((x) | (0 - ((x) & (1 << (signbit))))) -#define bbl_displacement (insn) \ - sign_extend(((insn) & 0x3ffffff) << 2, 27) + sign_extend32(((insn) & 0x3ffffff) << 2, 27)#define bcond_displacement (insn) \ - sign_extend(((insn >> 5) & 0x7ffff) << 2, 20) + sign_extend32(((insn >> 5) & 0x7ffff) << 2, 20)#define cbz_displacement (insn) \ - sign_extend(((insn >> 5) & 0x7ffff) << 2, 20) + sign_extend32(((insn >> 5) & 0x7ffff) << 2, 20)#define tbz_displacement (insn) \ - sign_extend(((insn >> 5) & 0x3fff) << 2, 15) + sign_extend32(((insn >> 5) & 0x3fff) << 2, 15)#define ldr_displacement (insn) \ - sign_extend(((insn >> 5) & 0x7ffff) << 2, 20) + sign_extend32(((insn >> 5) & 0x7ffff) << 2, 20)static inline void set_x_reg (struct pt_regs *regs,int reg,u64 val) {
@@ -106,7 +104,7 @@ static bool __kprobes check_tbnz(u32 opcode, struct pt_regs *regs) xn = opcode &0x1f ; imm = ((opcode >>3 ) &0x1ffffc ) | ((opcode >>29 ) &0x3 ); - imm =sign_extend (imm,20 ); + imm =sign_extend64 (imm,20 );if (opcode &0x80000000 ) val = (imm<<12 ) + (addr &0xfffffffffffff000 );else
Signature · 1 line
1.9.1
PATCH 1/1 arm64/kprobes: Tidy up sign-extension usage
Quoted 10 lines · Robin Murphy
Kprobes does not need its own homebrewed (and frankly inscrutable) sign extension macro; just use the standard kernel functions instead. Since the compiler actually recognises the sign-extension idiom of the latter, we also get the small bonus of some nicer codegen, as each displacement calculation helper then compiles to a single optimal SBFX instruction.
Signed-off-by Robin Murphy <[email protected]>--- arch/arm64/kernel/probes/simulate-insn.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-)
Will
PATCH 1/1 arm64/kprobes: Tidy up sign-extension usage
In reply to Robin MurphyQuoted 7 lines · Robin Murphy
Kprobes does not need its own homebrewed (and frankly inscrutable) sign extension macro; just use the standard kernel functions instead. Since the compiler actually recognises the sign-extension idiom of the latter, we also get the small bonus of some nicer codegen, as each displacement calculation helper then compiles to a single optimal SBFX instruction.
Signed-off-by Robin Murphy <[email protected]>
Queued for 4.10. Thanks.
Signature · 1 line
Catalin