Commit 47e190fa authored by David A. Long's avatar David A. Long

ARM: Change the remaining shared kprobes/uprobes symbols to something generic

Any more ARM kprobes/uprobes symbols which have "kprobe" in the name must be
changed to the more generic "probes" or other non-kprobes specific symbol.
Signed-off-by: default avatarDavid A. Long <dave.long@linaro.org>
Acked-by: default avatarJon Medhurst <tixy@linaro.org>
parent 44a0a59c
...@@ -19,26 +19,25 @@ ...@@ -19,26 +19,25 @@
#ifndef _ASM_PROBES_H #ifndef _ASM_PROBES_H
#define _ASM_PROBES_H #define _ASM_PROBES_H
struct kprobe;
typedef u32 probes_opcode_t; typedef u32 probes_opcode_t;
struct arch_specific_insn; struct arch_specific_insn;
typedef void (kprobe_insn_handler_t)(probes_opcode_t, typedef void (probes_insn_handler_t)(probes_opcode_t,
struct arch_specific_insn *, struct arch_specific_insn *,
struct pt_regs *); struct pt_regs *);
typedef unsigned long (probes_check_cc)(unsigned long); typedef unsigned long (probes_check_cc)(unsigned long);
typedef void (kprobe_insn_singlestep_t)(probes_opcode_t, typedef void (probes_insn_singlestep_t)(probes_opcode_t,
struct arch_specific_insn *, struct arch_specific_insn *,
struct pt_regs *); struct pt_regs *);
typedef void (kprobe_insn_fn_t)(void); typedef void (probes_insn_fn_t)(void);
/* Architecture specific copy of original instruction. */ /* Architecture specific copy of original instruction. */
struct arch_specific_insn { struct arch_specific_insn {
probes_opcode_t *insn; probes_opcode_t *insn;
kprobe_insn_handler_t *insn_handler; probes_insn_handler_t *insn_handler;
probes_check_cc *insn_check_cc; probes_check_cc *insn_check_cc;
kprobe_insn_singlestep_t *insn_singlestep; probes_insn_singlestep_t *insn_singlestep;
kprobe_insn_fn_t *insn_fn; probes_insn_fn_t *insn_fn;
}; };
#endif #endif
...@@ -127,7 +127,7 @@ enum probes_insn __kprobes ...@@ -127,7 +127,7 @@ enum probes_insn __kprobes
kprobe_decode_ldmstm(probes_opcode_t insn, struct arch_specific_insn *asi, kprobe_decode_ldmstm(probes_opcode_t insn, struct arch_specific_insn *asi,
const struct decode_header *h) const struct decode_header *h)
{ {
kprobe_insn_handler_t *handler = 0; probes_insn_handler_t *handler = 0;
unsigned reglist = insn & 0xffff; unsigned reglist = insn & 0xffff;
int is_ldm = insn & 0x100000; int is_ldm = insn & 0x100000;
int rn = (insn >> 16) & 0xf; int rn = (insn >> 16) & 0xf;
......
...@@ -207,6 +207,8 @@ ...@@ -207,6 +207,8 @@
#include <asm/opcodes.h> #include <asm/opcodes.h>
#include "kprobes.h" #include "kprobes.h"
#include "probes-arm.h"
#include "probes-thumb.h"
#include "kprobes-test.h" #include "kprobes-test.h"
...@@ -1610,7 +1612,7 @@ static int __init run_all_tests(void) ...@@ -1610,7 +1612,7 @@ static int __init run_all_tests(void)
goto out; goto out;
pr_info("ARM instruction simulation\n"); pr_info("ARM instruction simulation\n");
ret = run_test_cases(kprobe_arm_test_cases, kprobe_decode_arm_table); ret = run_test_cases(kprobe_arm_test_cases, probes_decode_arm_table);
if (ret) if (ret)
goto out; goto out;
...@@ -1633,13 +1635,13 @@ static int __init run_all_tests(void) ...@@ -1633,13 +1635,13 @@ static int __init run_all_tests(void)
pr_info("16-bit Thumb instruction simulation\n"); pr_info("16-bit Thumb instruction simulation\n");
ret = run_test_cases(kprobe_thumb16_test_cases, ret = run_test_cases(kprobe_thumb16_test_cases,
kprobe_decode_thumb16_table); probes_decode_thumb16_table);
if (ret) if (ret)
goto out; goto out;
pr_info("32-bit Thumb instruction simulation\n"); pr_info("32-bit Thumb instruction simulation\n");
ret = run_test_cases(kprobe_thumb32_test_cases, ret = run_test_cases(kprobe_thumb32_test_cases,
kprobe_decode_thumb32_table); probes_decode_thumb32_table);
if (ret) if (ret)
goto out; goto out;
#endif #endif
......
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
#include <linux/bug.h> #include <linux/bug.h>
#include "kprobes.h" #include "kprobes.h"
#include "probes-arm.h"
#include "probes-thumb.h"
#include "patch.h" #include "patch.h"
#define MIN_STACK_SIZE(addr) \ #define MIN_STACK_SIZE(addr) \
...@@ -69,10 +71,10 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) ...@@ -69,10 +71,10 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
if (is_wide_instruction(insn)) { if (is_wide_instruction(insn)) {
insn <<= 16; insn <<= 16;
insn |= ((u16 *)addr)[1]; insn |= ((u16 *)addr)[1];
decode_insn = thumb32_kprobe_decode_insn; decode_insn = thumb32_probes_decode_insn;
actions = kprobes_t32_actions; actions = kprobes_t32_actions;
} else { } else {
decode_insn = thumb16_kprobe_decode_insn; decode_insn = thumb16_probes_decode_insn;
actions = kprobes_t16_actions; actions = kprobes_t16_actions;
} }
#else /* !CONFIG_THUMB2_KERNEL */ #else /* !CONFIG_THUMB2_KERNEL */
...@@ -80,7 +82,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) ...@@ -80,7 +82,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
if (addr & 0x3) if (addr & 0x3)
return -EINVAL; return -EINVAL;
insn = *p->addr; insn = *p->addr;
decode_insn = arm_kprobe_decode_insn; decode_insn = arm_probes_decode_insn;
actions = kprobes_arm_actions; actions = kprobes_arm_actions;
#endif #endif
...@@ -99,7 +101,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) ...@@ -99,7 +101,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
p->ainsn.insn[is] = tmp_insn[is]; p->ainsn.insn[is] = tmp_insn[is];
flush_insns(p->ainsn.insn, flush_insns(p->ainsn.insn,
sizeof(p->ainsn.insn[0]) * MAX_INSN_SIZE); sizeof(p->ainsn.insn[0]) * MAX_INSN_SIZE);
p->ainsn.insn_fn = (kprobe_insn_fn_t *) p->ainsn.insn_fn = (probes_insn_fn_t *)
((uintptr_t)p->ainsn.insn | thumb); ((uintptr_t)p->ainsn.insn | thumb);
break; break;
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#ifndef _ARM_KERNEL_KPROBES_H #ifndef _ARM_KERNEL_KPROBES_H
#define _ARM_KERNEL_KPROBES_H #define _ARM_KERNEL_KPROBES_H
#include "probes.h"
/* /*
* These undefined instructions must be unique and * These undefined instructions must be unique and
* reserved solely for kprobes' use. * reserved solely for kprobes' use.
...@@ -27,8 +29,9 @@ ...@@ -27,8 +29,9 @@
#define KPROBE_THUMB16_BREAKPOINT_INSTRUCTION 0xde18 #define KPROBE_THUMB16_BREAKPOINT_INSTRUCTION 0xde18
#define KPROBE_THUMB32_BREAKPOINT_INSTRUCTION 0xf7f0a018 #define KPROBE_THUMB32_BREAKPOINT_INSTRUCTION 0xf7f0a018
struct decode_header; enum probes_insn __kprobes
union decode_action; kprobe_decode_ldmstm(kprobe_opcode_t insn, struct arch_specific_insn *asi,
const struct decode_header *h);
typedef enum probes_insn (kprobe_decode_insn_t)(probes_opcode_t, typedef enum probes_insn (kprobe_decode_insn_t)(probes_opcode_t,
struct arch_specific_insn *, struct arch_specific_insn *,
...@@ -36,21 +39,13 @@ typedef enum probes_insn (kprobe_decode_insn_t)(probes_opcode_t, ...@@ -36,21 +39,13 @@ typedef enum probes_insn (kprobe_decode_insn_t)(probes_opcode_t,
#ifdef CONFIG_THUMB2_KERNEL #ifdef CONFIG_THUMB2_KERNEL
enum probes_insn thumb16_kprobe_decode_insn(probes_opcode_t, extern const union decode_action kprobes_t32_actions[];
struct arch_specific_insn *, extern const union decode_action kprobes_t16_actions[];
const union decode_action *);
enum probes_insn thumb32_kprobe_decode_insn(probes_opcode_t,
struct arch_specific_insn *,
const union decode_action *);
#else /* !CONFIG_THUMB2_KERNEL */ #else /* !CONFIG_THUMB2_KERNEL */
enum probes_insn arm_kprobe_decode_insn(probes_opcode_t, extern const union decode_action kprobes_arm_actions[];
struct arch_specific_insn *,
const union decode_action *);
#endif #endif
#include "probes.h"
#endif /* _ARM_KERNEL_KPROBES_H */ #endif /* _ARM_KERNEL_KPROBES_H */
...@@ -610,7 +610,7 @@ static const union decode_item arm_cccc_100x_table[] = { ...@@ -610,7 +610,7 @@ static const union decode_item arm_cccc_100x_table[] = {
DECODE_END DECODE_END
}; };
const union decode_item kprobe_decode_arm_table[] = { const union decode_item probes_decode_arm_table[] = {
/* /*
* Unconditional instructions * Unconditional instructions
* 1111 xxxx xxxx xxxx xxxx xxxx xxxx xxxx * 1111 xxxx xxxx xxxx xxxx xxxx xxxx xxxx
...@@ -701,7 +701,7 @@ const union decode_item kprobe_decode_arm_table[] = { ...@@ -701,7 +701,7 @@ const union decode_item kprobe_decode_arm_table[] = {
DECODE_END DECODE_END
}; };
#ifdef CONFIG_ARM_KPROBES_TEST_MODULE #ifdef CONFIG_ARM_KPROBES_TEST_MODULE
EXPORT_SYMBOL_GPL(kprobe_decode_arm_table); EXPORT_SYMBOL_GPL(probes_decode_arm_table);
#endif #endif
static void __kprobes arm_singlestep(probes_opcode_t insn, static void __kprobes arm_singlestep(probes_opcode_t insn,
...@@ -724,11 +724,11 @@ static void __kprobes arm_singlestep(probes_opcode_t insn, ...@@ -724,11 +724,11 @@ static void __kprobes arm_singlestep(probes_opcode_t insn,
* should also be very rare. * should also be very rare.
*/ */
enum probes_insn __kprobes enum probes_insn __kprobes
arm_kprobe_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi, arm_probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
const union decode_action *actions) const union decode_action *actions)
{ {
asi->insn_singlestep = arm_singlestep; asi->insn_singlestep = arm_singlestep;
asi->insn_check_cc = probes_condition_checks[insn>>28]; asi->insn_check_cc = probes_condition_checks[insn>>28];
return kprobe_decode_insn(insn, asi, kprobe_decode_arm_table, false, return probes_decode_insn(insn, asi, probes_decode_arm_table, false,
actions); actions);
} }
...@@ -64,4 +64,10 @@ void __kprobes simulate_mrs(probes_opcode_t opcode, ...@@ -64,4 +64,10 @@ void __kprobes simulate_mrs(probes_opcode_t opcode,
void __kprobes simulate_mov_ipsp(probes_opcode_t opcode, void __kprobes simulate_mov_ipsp(probes_opcode_t opcode,
struct arch_specific_insn *asi, struct pt_regs *regs); struct arch_specific_insn *asi, struct pt_regs *regs);
extern const union decode_item probes_decode_arm_table[];
enum probes_insn arm_probes_decode_insn(probes_opcode_t,
struct arch_specific_insn *,
const union decode_action *actions);
#endif #endif
/* /*
* arch/arm/kernel/kprobes-thumb.c * arch/arm/kernel/probes-thumb.c
* *
* Copyright (C) 2011 Jon Medhurst <tixy@yxit.co.uk>. * Copyright (C) 2011 Jon Medhurst <tixy@yxit.co.uk>.
* *
...@@ -552,7 +552,7 @@ static const union decode_item t32_table_1111_1011_1[] = { ...@@ -552,7 +552,7 @@ static const union decode_item t32_table_1111_1011_1[] = {
DECODE_END DECODE_END
}; };
const union decode_item kprobe_decode_thumb32_table[] = { const union decode_item probes_decode_thumb32_table[] = {
/* /*
* Load/store multiple instructions * Load/store multiple instructions
...@@ -641,7 +641,7 @@ const union decode_item kprobe_decode_thumb32_table[] = { ...@@ -641,7 +641,7 @@ const union decode_item kprobe_decode_thumb32_table[] = {
DECODE_END DECODE_END
}; };
#ifdef CONFIG_ARM_KPROBES_TEST_MODULE #ifdef CONFIG_ARM_KPROBES_TEST_MODULE
EXPORT_SYMBOL_GPL(kprobe_decode_thumb32_table); EXPORT_SYMBOL_GPL(probes_decode_thumb32_table);
#endif #endif
static const union decode_item t16_table_1011[] = { static const union decode_item t16_table_1011[] = {
...@@ -696,7 +696,7 @@ static const union decode_item t16_table_1011[] = { ...@@ -696,7 +696,7 @@ static const union decode_item t16_table_1011[] = {
DECODE_END DECODE_END
}; };
const union decode_item kprobe_decode_thumb16_table[] = { const union decode_item probes_decode_thumb16_table[] = {
/* /*
* Shift (immediate), add, subtract, move, and compare * Shift (immediate), add, subtract, move, and compare
...@@ -833,7 +833,7 @@ const union decode_item kprobe_decode_thumb16_table[] = { ...@@ -833,7 +833,7 @@ const union decode_item kprobe_decode_thumb16_table[] = {
DECODE_END DECODE_END
}; };
#ifdef CONFIG_ARM_KPROBES_TEST_MODULE #ifdef CONFIG_ARM_KPROBES_TEST_MODULE
EXPORT_SYMBOL_GPL(kprobe_decode_thumb16_table); EXPORT_SYMBOL_GPL(probes_decode_thumb16_table);
#endif #endif
static unsigned long __kprobes thumb_check_cc(unsigned long cpsr) static unsigned long __kprobes thumb_check_cc(unsigned long cpsr)
...@@ -862,21 +862,21 @@ static void __kprobes thumb32_singlestep(probes_opcode_t opcode, ...@@ -862,21 +862,21 @@ static void __kprobes thumb32_singlestep(probes_opcode_t opcode,
} }
enum probes_insn __kprobes enum probes_insn __kprobes
thumb16_kprobe_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi, thumb16_probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
const union decode_action *actions) const union decode_action *actions)
{ {
asi->insn_singlestep = thumb16_singlestep; asi->insn_singlestep = thumb16_singlestep;
asi->insn_check_cc = thumb_check_cc; asi->insn_check_cc = thumb_check_cc;
return kprobe_decode_insn(insn, asi, kprobe_decode_thumb16_table, true, return probes_decode_insn(insn, asi, probes_decode_thumb16_table, true,
actions); actions);
} }
enum probes_insn __kprobes enum probes_insn __kprobes
thumb32_kprobe_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi, thumb32_probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
const union decode_action *actions) const union decode_action *actions)
{ {
asi->insn_singlestep = thumb32_singlestep; asi->insn_singlestep = thumb32_singlestep;
asi->insn_check_cc = thumb_check_cc; asi->insn_check_cc = thumb_check_cc;
return kprobe_decode_insn(insn, asi, kprobe_decode_thumb32_table, true, return probes_decode_insn(insn, asi, probes_decode_thumb32_table, true,
actions); actions);
} }
...@@ -84,4 +84,14 @@ enum probes_t16_action { ...@@ -84,4 +84,14 @@ enum probes_t16_action {
NUM_PROBES_T16_ACTIONS NUM_PROBES_T16_ACTIONS
}; };
extern const union decode_item probes_decode_thumb32_table[];
extern const union decode_item probes_decode_thumb16_table[];
enum probes_insn __kprobes
thumb16_probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
const union decode_action *actions);
enum probes_insn __kprobes
thumb32_probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
const union decode_action *actions);
#endif #endif
...@@ -340,7 +340,7 @@ static const int decode_struct_sizes[NUM_DECODE_TYPES] = { ...@@ -340,7 +340,7 @@ static const int decode_struct_sizes[NUM_DECODE_TYPES] = {
}; };
/* /*
* kprobe_decode_insn operates on data tables in order to decode an ARM * probes_decode_insn operates on data tables in order to decode an ARM
* architecture instruction onto which a kprobe has been placed. * architecture instruction onto which a kprobe has been placed.
* *
* These instruction decoding tables are a concatenation of entries each * These instruction decoding tables are a concatenation of entries each
...@@ -383,7 +383,7 @@ static const int decode_struct_sizes[NUM_DECODE_TYPES] = { ...@@ -383,7 +383,7 @@ static const int decode_struct_sizes[NUM_DECODE_TYPES] = {
* *
*/ */
int __kprobes int __kprobes
kprobe_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi, probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
const union decode_item *table, bool thumb, const union decode_item *table, bool thumb,
const union decode_action *actions) const union decode_action *actions)
{ {
......
...@@ -21,11 +21,12 @@ ...@@ -21,11 +21,12 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/kprobes.h> #include <asm/probes.h>
#include "kprobes.h"
void __init arm_probes_decode_init(void); void __init arm_probes_decode_init(void);
extern probes_check_cc * const probes_condition_checks[16];
#if __LINUX_ARM_ARCH__ >= 7 #if __LINUX_ARM_ARCH__ >= 7
/* str_pc_offset is architecturally defined from ARMv7 onwards */ /* str_pc_offset is architecturally defined from ARMv7 onwards */
...@@ -40,7 +41,6 @@ void __init find_str_pc_offset(void); ...@@ -40,7 +41,6 @@ void __init find_str_pc_offset(void);
#endif #endif
struct decode_header;
/* /*
* Update ITSTATE after normal execution of an IT block instruction. * Update ITSTATE after normal execution of an IT block instruction.
...@@ -133,15 +133,6 @@ static inline void __kprobes alu_write_pc(long pcv, struct pt_regs *regs) ...@@ -133,15 +133,6 @@ static inline void __kprobes alu_write_pc(long pcv, struct pt_regs *regs)
} }
void __kprobes probes_simulate_nop(probes_opcode_t, struct arch_specific_insn *,
struct pt_regs *regs);
void __kprobes probes_emulate_none(probes_opcode_t, struct arch_specific_insn *,
struct pt_regs *regs);
enum probes_insn __kprobes
kprobe_decode_ldmstm(probes_opcode_t insn, struct arch_specific_insn *asi,
const struct decode_header *h);
/* /*
* Test if load/store instructions writeback the address register. * Test if load/store instructions writeback the address register.
* if P (bit 24) == 0 or W (bit 21) == 1 * if P (bit 24) == 0 or W (bit 21) == 1
...@@ -150,7 +141,7 @@ kprobe_decode_ldmstm(probes_opcode_t insn, struct arch_specific_insn *asi, ...@@ -150,7 +141,7 @@ kprobe_decode_ldmstm(probes_opcode_t insn, struct arch_specific_insn *asi,
/* /*
* The following definitions and macros are used to build instruction * The following definitions and macros are used to build instruction
* decoding tables for use by kprobe_decode_insn. * decoding tables for use by probes_decode_insn.
* *
* These tables are a concatenation of entries each of which consist of one of * These tables are a concatenation of entries each of which consist of one of
* the decode_* structs. All of the fields in every type of decode structure * the decode_* structs. All of the fields in every type of decode structure
...@@ -313,12 +304,13 @@ union decode_item { ...@@ -313,12 +304,13 @@ union decode_item {
int action; int action;
}; };
struct decode_header;
typedef enum probes_insn (probes_custom_decode_t)(probes_opcode_t, typedef enum probes_insn (probes_custom_decode_t)(probes_opcode_t,
struct arch_specific_insn *, struct arch_specific_insn *,
const struct decode_header *); const struct decode_header *);
union decode_action { union decode_action {
kprobe_insn_handler_t *handler; probes_insn_handler_t *handler;
probes_custom_decode_t *decoder; probes_custom_decode_t *decoder;
}; };
...@@ -404,22 +396,12 @@ struct decode_reject { ...@@ -404,22 +396,12 @@ struct decode_reject {
#define DECODE_REJECT(_mask, _value) \ #define DECODE_REJECT(_mask, _value) \
DECODE_HEADER(DECODE_TYPE_REJECT, _mask, _value, 0) DECODE_HEADER(DECODE_TYPE_REJECT, _mask, _value, 0)
probes_insn_handler_t probes_simulate_nop;
probes_insn_handler_t probes_emulate_none;
#ifdef CONFIG_THUMB2_KERNEL int __kprobes
extern const union decode_item kprobe_decode_thumb16_table[]; probes_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
extern const union decode_item kprobe_decode_thumb32_table[]; const union decode_item *table, bool thumb,
extern const union decode_action kprobes_t32_actions[]; const union decode_action *actions);
extern const union decode_action kprobes_t16_actions[];
#else
extern const union decode_item kprobe_decode_arm_table[];
extern const union decode_action kprobes_arm_actions[];
#endif
extern probes_check_cc * const probes_condition_checks[16];
int kprobe_decode_insn(probes_opcode_t insn, struct arch_specific_insn *asi,
const union decode_item *table, bool thumb16,
const union decode_action *actions);
#endif #endif
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