162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * arch/arm/probes/decode-thumb.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2013 Linaro Ltd.
662306a36Sopenharmony_ci * Written by: David A. Long
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef _ARM_KERNEL_PROBES_THUMB_H
1062306a36Sopenharmony_ci#define  _ARM_KERNEL_PROBES_THUMB_H
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include "decode.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/*
1562306a36Sopenharmony_ci * True if current instruction is in an IT block.
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci#define in_it_block(cpsr)	((cpsr & 0x06000c00) != 0x00000000)
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/*
2062306a36Sopenharmony_ci * Return the condition code to check for the currently executing instruction.
2162306a36Sopenharmony_ci * This is in ITSTATE<7:4> which is in CPSR<15:12> but is only valid if
2262306a36Sopenharmony_ci * in_it_block returns true.
2362306a36Sopenharmony_ci */
2462306a36Sopenharmony_ci#define current_cond(cpsr)	((cpsr >> 12) & 0xf)
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cienum probes_t32_action {
2762306a36Sopenharmony_ci	PROBES_T32_EMULATE_NONE,
2862306a36Sopenharmony_ci	PROBES_T32_SIMULATE_NOP,
2962306a36Sopenharmony_ci	PROBES_T32_LDMSTM,
3062306a36Sopenharmony_ci	PROBES_T32_LDRDSTRD,
3162306a36Sopenharmony_ci	PROBES_T32_TABLE_BRANCH,
3262306a36Sopenharmony_ci	PROBES_T32_TST,
3362306a36Sopenharmony_ci	PROBES_T32_CMP,
3462306a36Sopenharmony_ci	PROBES_T32_MOV,
3562306a36Sopenharmony_ci	PROBES_T32_ADDSUB,
3662306a36Sopenharmony_ci	PROBES_T32_LOGICAL,
3762306a36Sopenharmony_ci	PROBES_T32_ADDWSUBW_PC,
3862306a36Sopenharmony_ci	PROBES_T32_ADDWSUBW,
3962306a36Sopenharmony_ci	PROBES_T32_MOVW,
4062306a36Sopenharmony_ci	PROBES_T32_SAT,
4162306a36Sopenharmony_ci	PROBES_T32_BITFIELD,
4262306a36Sopenharmony_ci	PROBES_T32_SEV,
4362306a36Sopenharmony_ci	PROBES_T32_WFE,
4462306a36Sopenharmony_ci	PROBES_T32_MRS,
4562306a36Sopenharmony_ci	PROBES_T32_BRANCH_COND,
4662306a36Sopenharmony_ci	PROBES_T32_BRANCH,
4762306a36Sopenharmony_ci	PROBES_T32_PLDI,
4862306a36Sopenharmony_ci	PROBES_T32_LDR_LIT,
4962306a36Sopenharmony_ci	PROBES_T32_LDRSTR,
5062306a36Sopenharmony_ci	PROBES_T32_SIGN_EXTEND,
5162306a36Sopenharmony_ci	PROBES_T32_MEDIA,
5262306a36Sopenharmony_ci	PROBES_T32_REVERSE,
5362306a36Sopenharmony_ci	PROBES_T32_MUL_ADD,
5462306a36Sopenharmony_ci	PROBES_T32_MUL_ADD2,
5562306a36Sopenharmony_ci	PROBES_T32_MUL_ADD_LONG,
5662306a36Sopenharmony_ci	NUM_PROBES_T32_ACTIONS
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cienum probes_t16_action {
6062306a36Sopenharmony_ci	PROBES_T16_ADD_SP,
6162306a36Sopenharmony_ci	PROBES_T16_CBZ,
6262306a36Sopenharmony_ci	PROBES_T16_SIGN_EXTEND,
6362306a36Sopenharmony_ci	PROBES_T16_PUSH,
6462306a36Sopenharmony_ci	PROBES_T16_POP,
6562306a36Sopenharmony_ci	PROBES_T16_SEV,
6662306a36Sopenharmony_ci	PROBES_T16_WFE,
6762306a36Sopenharmony_ci	PROBES_T16_IT,
6862306a36Sopenharmony_ci	PROBES_T16_CMP,
6962306a36Sopenharmony_ci	PROBES_T16_ADDSUB,
7062306a36Sopenharmony_ci	PROBES_T16_LOGICAL,
7162306a36Sopenharmony_ci	PROBES_T16_BLX,
7262306a36Sopenharmony_ci	PROBES_T16_HIREGOPS,
7362306a36Sopenharmony_ci	PROBES_T16_LDR_LIT,
7462306a36Sopenharmony_ci	PROBES_T16_LDRHSTRH,
7562306a36Sopenharmony_ci	PROBES_T16_LDRSTR,
7662306a36Sopenharmony_ci	PROBES_T16_ADR,
7762306a36Sopenharmony_ci	PROBES_T16_LDMSTM,
7862306a36Sopenharmony_ci	PROBES_T16_BRANCH_COND,
7962306a36Sopenharmony_ci	PROBES_T16_BRANCH,
8062306a36Sopenharmony_ci	NUM_PROBES_T16_ACTIONS
8162306a36Sopenharmony_ci};
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ciextern const union decode_item probes_decode_thumb32_table[];
8462306a36Sopenharmony_ciextern const union decode_item probes_decode_thumb16_table[];
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cienum probes_insn __kprobes
8762306a36Sopenharmony_cithumb16_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi,
8862306a36Sopenharmony_ci		bool emulate, const union decode_action *actions,
8962306a36Sopenharmony_ci		const struct decode_checker *checkers[]);
9062306a36Sopenharmony_cienum probes_insn __kprobes
9162306a36Sopenharmony_cithumb32_probes_decode_insn(probes_opcode_t insn, struct arch_probes_insn *asi,
9262306a36Sopenharmony_ci		bool emulate, const union decode_action *actions,
9362306a36Sopenharmony_ci		const struct decode_checker *checkers[]);
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci#endif
96