x86/kprobes: Refactor can_{probe,boost} return type to bool
authorJinghao Jia <jinghao7@illinois.edu>
Wed, 6 Mar 2024 15:26:01 +0000 (00:26 +0900)
committerMasami Hiramatsu (Google) <mhiramat@kernel.org>
Wed, 6 Mar 2024 15:26:01 +0000 (00:26 +0900)
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: Jinghao Jia <jinghao7@illinois.edu>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
arch/x86/kernel/kprobes/common.h
arch/x86/kernel/kprobes/core.c

index c993521d49332af48c9859c70e659f301a4da8ac..e772276f5aa900de376a7b740da8a893547016fc 100644 (file)
@@ -78,7 +78,7 @@
 #endif
 
 /* 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 */
 extern unsigned long recover_probed_instruction(kprobe_opcode_t *buf,
                                         unsigned long addr);
index a0ce46c0a2d880d0b218a3846af82d9f206086bc..70982e725fd7a400888b199ab9f2b35fd437cf29 100644 (file)
@@ -137,14 +137,14 @@ NOKPROBE_SYMBOL(synthesize_relcall);
  * Returns non-zero if INSN is boostable.
  * 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;
        insn_byte_t prefix;
        int i;
 
        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 */
        if (insn->opcode.nbytes == 2)
@@ -152,7 +152,7 @@ int can_boost(struct insn *insn, void *addr)
                                (unsigned long *)twobyte_is_boostable);
 
        if (insn->opcode.nbytes != 1)
-               return 0;
+               return false;
 
        for_each_insn_prefix(insn, i, prefix) {
                insn_attr_t attr;
@@ -160,7 +160,7 @@ int can_boost(struct insn *insn, void *addr)
                attr = inat_get_opcode_attribute(prefix);
                /* Can't boost Address-size override prefix and CS override prefix */
                if (prefix == 0x2e || inat_is_address_size_prefix(attr))
-                       return 0;
+                       return false;
        }
 
        opcode = insn->opcode.bytes[0];
@@ -181,12 +181,12 @@ int can_boost(struct insn *insn, void *addr)
        case 0xf6 ... 0xf7:     /* Grp3 */
        case 0xfe:              /* Grp4 */
                /* ... are not boostable */
-               return 0;
+               return false;
        case 0xff:              /* Grp5 */
                /* Only indirect jmp is boostable */
                return X86_MODRM_REG(insn->modrm.bytes[0]) == 4;
        default:
-               return 1;
+               return true;
        }
 }
 
@@ -253,20 +253,18 @@ unsigned long recover_probed_instruction(kprobe_opcode_t *buf, unsigned long add
 }
 
 /* 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;
        struct insn insn;
        kprobe_opcode_t buf[MAX_INSN_SIZE];
 
        if (!kallsyms_lookup_size_offset(paddr, NULL, &offset))
-               return 0;
+               return false;
 
        /* Decode instructions */
        addr = paddr - offset;
        while (addr < paddr) {
-               int ret;
-
                /*
                 * Check if the instruction has been modified by another
                 * kprobe, in which case we replace the breakpoint by the
@@ -277,11 +275,10 @@ static int can_probe(unsigned long paddr)
                 */
                __addr = recover_probed_instruction(buf, addr);
                if (!__addr)
-                       return 0;
+                       return false;
 
-               ret = insn_decode_kernel(&insn, (void *)__addr);
-               if (ret < 0)
-                       return 0;
+               if (insn_decode_kernel(&insn, (void *)__addr) < 0)
+                       return false;
 
 #ifdef CONFIG_KGDB
                /*
@@ -290,7 +287,7 @@ static int can_probe(unsigned long paddr)
                 */
                if (insn.opcode.bytes[0] == INT3_INSN_OPCODE &&
                    kgdb_has_hit_break(addr))
-                       return 0;
+                       return false;
 #endif
                addr += insn.length;
        }
@@ -310,10 +307,10 @@ static int can_probe(unsigned long paddr)
                 */
                __addr = recover_probed_instruction(buf, addr);
                if (!__addr)
-                       return 0;
+                       return false;
 
                if (insn_decode_kernel(&insn, (void *)__addr) < 0)
-                       return 0;
+                       return false;
 
                if (insn.opcode.value == 0xBA)
                        offset = 12;
@@ -324,7 +321,7 @@ static int can_probe(unsigned long paddr)
 
                /* This movl/addl is used for decoding CFI. */
                if (is_cfi_trap(addr + offset))
-                       return 0;
+                       return false;
        }
 
 out: