mirror of
https://github.com/torvalds/linux.git
synced 2024-11-18 01:51:53 +00:00
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: David A. Long <dave.long@linaro.org> Acked-by: Jon Medhurst <tixy@linaro.org>
This commit is contained in:
parent
44a0a59c53
commit
47e190fafd
@ -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
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
|
|
||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
#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 @@
|
|||||||
#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,
|
|||||||
|
|
||||||
#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[] = {
|
|||||||
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[] = {
|
|||||||
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,
|
|||||||
* 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,
|
|||||||
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
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* 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[] = {
|
|||||||
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[] = {
|
|||||||
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[] = {
|
|||||||
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[] = {
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
|||||||
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] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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] = {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
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 @@
|
|||||||
|
|
||||||
#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);
|
|||||||
|
|
||||||
#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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* 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 {
|
|||||||
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 {
|
|||||||
#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
|
||||||
|
Loading…
Reference in New Issue
Block a user