^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * arch/arm/probes/decode-arm.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright 2013 Linaro Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Written by: David A. Long
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #ifndef _ARM_KERNEL_PROBES_ARM_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define _ARM_KERNEL_PROBES_ARM_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include "decode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) enum probes_arm_action {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) PROBES_PRELOAD_IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) PROBES_PRELOAD_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) PROBES_BRANCH_IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) PROBES_BRANCH_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) PROBES_MRS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) PROBES_CLZ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) PROBES_SATURATING_ARITHMETIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) PROBES_MUL1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) PROBES_MUL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) PROBES_SWP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) PROBES_LDRSTRD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) PROBES_LOAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) PROBES_STORE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) PROBES_LOAD_EXTRA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) PROBES_STORE_EXTRA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) PROBES_MOV_IP_SP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) PROBES_DATA_PROCESSING_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) PROBES_DATA_PROCESSING_IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) PROBES_MOV_HALFWORD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) PROBES_SEV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) PROBES_WFE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) PROBES_SATURATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) PROBES_REV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) PROBES_MMI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) PROBES_PACK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) PROBES_EXTEND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) PROBES_EXTEND_ADD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) PROBES_MUL_ADD_LONG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) PROBES_MUL_ADD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) PROBES_BITFIELD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) PROBES_BRANCH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) PROBES_LDMSTM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) NUM_PROBES_ARM_ACTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) void __kprobes simulate_bbl(probes_opcode_t opcode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct arch_probes_insn *asi, struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) void __kprobes simulate_blx1(probes_opcode_t opcode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct arch_probes_insn *asi, struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) void __kprobes simulate_blx2bx(probes_opcode_t opcode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct arch_probes_insn *asi, struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) void __kprobes simulate_mrs(probes_opcode_t opcode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct arch_probes_insn *asi, struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) void __kprobes simulate_mov_ipsp(probes_opcode_t opcode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct arch_probes_insn *asi, struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) extern const union decode_item probes_decode_arm_table[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) enum probes_insn arm_probes_decode_insn(probes_opcode_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct arch_probes_insn *, bool emulate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) const union decode_action *actions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) const struct decode_checker *checkers[]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #endif