Commit e4778a0e authored by Jinghao Jia's avatar Jinghao Jia Committed by Masami Hiramatsu (Google)

x86/kprobes: Refactor can_{probe,boost} return type to bool

Both can_probe and can_boost have int return type but are using int as
boolean in their context.

Refactor both functions to make them actually return boolean.

Link: https://lore.kernel.org/all/20240204031300.830475-2-jinghao7@illinois.edu/Signed-off-by: default avatarJinghao Jia <jinghao7@illinois.edu>
Acked-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
parent 90d35da6
...@@ -78,7 +78,7 @@ ...@@ -78,7 +78,7 @@
#endif #endif
/* Ensure if the instruction can be boostable */ /* Ensure if the instruction can be boostable */
extern int can_boost(struct insn *insn, void *orig_addr); extern bool can_boost(struct insn *insn, void *orig_addr);
/* Recover instruction if given address is probed */ /* Recover instruction if given address is probed */
extern unsigned long recover_probed_instruction(kprobe_opcode_t *buf, extern unsigned long recover_probed_instruction(kprobe_opcode_t *buf,
unsigned long addr); unsigned long addr);
......
...@@ -137,14 +137,14 @@ NOKPROBE_SYMBOL(synthesize_relcall); ...@@ -137,14 +137,14 @@ NOKPROBE_SYMBOL(synthesize_relcall);
* Returns non-zero if INSN is boostable. * Returns non-zero if INSN is boostable.
* RIP relative instructions are adjusted at copying time in 64 bits mode * RIP relative instructions are adjusted at copying time in 64 bits mode
*/ */
int can_boost(struct insn *insn, void *addr) bool can_boost(struct insn *insn, void *addr)
{ {
kprobe_opcode_t opcode; kprobe_opcode_t opcode;
insn_byte_t prefix; insn_byte_t prefix;
int i; int i;
if (search_exception_tables((unsigned long)addr)) if (search_exception_tables((unsigned long)addr))
return 0; /* Page fault may occur on this address. */ return false; /* Page fault may occur on this address. */
/* 2nd-byte opcode */ /* 2nd-byte opcode */
if (insn->opcode.nbytes == 2) if (insn->opcode.nbytes == 2)
...@@ -152,7 +152,7 @@ int can_boost(struct insn *insn, void *addr) ...@@ -152,7 +152,7 @@ int can_boost(struct insn *insn, void *addr)
(unsigned long *)twobyte_is_boostable); (unsigned long *)twobyte_is_boostable);
if (insn->opcode.nbytes != 1) if (insn->opcode.nbytes != 1)
return 0; return false;
for_each_insn_prefix(insn, i, prefix) { for_each_insn_prefix(insn, i, prefix) {
insn_attr_t attr; insn_attr_t attr;
...@@ -160,7 +160,7 @@ int can_boost(struct insn *insn, void *addr) ...@@ -160,7 +160,7 @@ int can_boost(struct insn *insn, void *addr)
attr = inat_get_opcode_attribute(prefix); attr = inat_get_opcode_attribute(prefix);
/* Can't boost Address-size override prefix and CS override prefix */ /* Can't boost Address-size override prefix and CS override prefix */
if (prefix == 0x2e || inat_is_address_size_prefix(attr)) if (prefix == 0x2e || inat_is_address_size_prefix(attr))
return 0; return false;
} }
opcode = insn->opcode.bytes[0]; opcode = insn->opcode.bytes[0];
...@@ -181,12 +181,12 @@ int can_boost(struct insn *insn, void *addr) ...@@ -181,12 +181,12 @@ int can_boost(struct insn *insn, void *addr)
case 0xf6 ... 0xf7: /* Grp3 */ case 0xf6 ... 0xf7: /* Grp3 */
case 0xfe: /* Grp4 */ case 0xfe: /* Grp4 */
/* ... are not boostable */ /* ... are not boostable */
return 0; return false;
case 0xff: /* Grp5 */ case 0xff: /* Grp5 */
/* Only indirect jmp is boostable */ /* Only indirect jmp is boostable */
return X86_MODRM_REG(insn->modrm.bytes[0]) == 4; return X86_MODRM_REG(insn->modrm.bytes[0]) == 4;
default: default:
return 1; return true;
} }
} }
...@@ -253,20 +253,18 @@ unsigned long recover_probed_instruction(kprobe_opcode_t *buf, unsigned long add ...@@ -253,20 +253,18 @@ unsigned long recover_probed_instruction(kprobe_opcode_t *buf, unsigned long add
} }
/* Check if paddr is at an instruction boundary */ /* Check if paddr is at an instruction boundary */
static int can_probe(unsigned long paddr) static bool can_probe(unsigned long paddr)
{ {
unsigned long addr, __addr, offset = 0; unsigned long addr, __addr, offset = 0;
struct insn insn; struct insn insn;
kprobe_opcode_t buf[MAX_INSN_SIZE]; kprobe_opcode_t buf[MAX_INSN_SIZE];
if (!kallsyms_lookup_size_offset(paddr, NULL, &offset)) if (!kallsyms_lookup_size_offset(paddr, NULL, &offset))
return 0; return false;
/* Decode instructions */ /* Decode instructions */
addr = paddr - offset; addr = paddr - offset;
while (addr < paddr) { while (addr < paddr) {
int ret;
/* /*
* Check if the instruction has been modified by another * Check if the instruction has been modified by another
* kprobe, in which case we replace the breakpoint by the * kprobe, in which case we replace the breakpoint by the
...@@ -277,11 +275,10 @@ static int can_probe(unsigned long paddr) ...@@ -277,11 +275,10 @@ static int can_probe(unsigned long paddr)
*/ */
__addr = recover_probed_instruction(buf, addr); __addr = recover_probed_instruction(buf, addr);
if (!__addr) if (!__addr)
return 0; return false;
ret = insn_decode_kernel(&insn, (void *)__addr); if (insn_decode_kernel(&insn, (void *)__addr) < 0)
if (ret < 0) return false;
return 0;
#ifdef CONFIG_KGDB #ifdef CONFIG_KGDB
/* /*
...@@ -290,7 +287,7 @@ static int can_probe(unsigned long paddr) ...@@ -290,7 +287,7 @@ static int can_probe(unsigned long paddr)
*/ */
if (insn.opcode.bytes[0] == INT3_INSN_OPCODE && if (insn.opcode.bytes[0] == INT3_INSN_OPCODE &&
kgdb_has_hit_break(addr)) kgdb_has_hit_break(addr))
return 0; return false;
#endif #endif
addr += insn.length; addr += insn.length;
} }
...@@ -310,10 +307,10 @@ static int can_probe(unsigned long paddr) ...@@ -310,10 +307,10 @@ static int can_probe(unsigned long paddr)
*/ */
__addr = recover_probed_instruction(buf, addr); __addr = recover_probed_instruction(buf, addr);
if (!__addr) if (!__addr)
return 0; return false;
if (insn_decode_kernel(&insn, (void *)__addr) < 0) if (insn_decode_kernel(&insn, (void *)__addr) < 0)
return 0; return false;
if (insn.opcode.value == 0xBA) if (insn.opcode.value == 0xBA)
offset = 12; offset = 12;
...@@ -324,7 +321,7 @@ static int can_probe(unsigned long paddr) ...@@ -324,7 +321,7 @@ static int can_probe(unsigned long paddr)
/* This movl/addl is used for decoding CFI. */ /* This movl/addl is used for decoding CFI. */
if (is_cfi_trap(addr + offset)) if (is_cfi_trap(addr + offset))
return 0; return false;
} }
out: out:
......
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