^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) * Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef _ARCH_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define _ARCH_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <stdbool.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "objtool.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include "cfi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #ifdef INSN_USE_ORC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <asm/orc_types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) enum insn_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) INSN_JUMP_CONDITIONAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) INSN_JUMP_UNCONDITIONAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) INSN_JUMP_DYNAMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) INSN_JUMP_DYNAMIC_CONDITIONAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) INSN_CALL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) INSN_CALL_DYNAMIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) INSN_RETURN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) INSN_CONTEXT_SWITCH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) INSN_BUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) INSN_NOP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) INSN_STAC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) INSN_CLAC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) INSN_STD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) INSN_CLD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) INSN_OTHER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) enum op_dest_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) OP_DEST_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) OP_DEST_REG_INDIRECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) OP_DEST_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) OP_DEST_PUSH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) OP_DEST_PUSHF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) OP_DEST_LEAVE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct op_dest {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) enum op_dest_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) unsigned char reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) int offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) enum op_src_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) OP_SRC_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) OP_SRC_REG_INDIRECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) OP_SRC_CONST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) OP_SRC_POP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) OP_SRC_POPF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) OP_SRC_ADD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) OP_SRC_AND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct op_src {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) enum op_src_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) unsigned char reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) int offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct stack_op {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct op_dest dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) struct op_src src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) struct instruction;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) void arch_initial_func_cfi_state(struct cfi_init_state *state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) int arch_decode_instruction(const struct elf *elf, const struct section *sec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) unsigned long offset, unsigned int maxlen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) unsigned int *len, enum insn_type *type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) unsigned long *immediate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct list_head *ops_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) bool arch_callee_saved_reg(unsigned char reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) unsigned long arch_jump_destination(struct instruction *insn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) unsigned long arch_dest_reloc_offset(int addend);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) const char *arch_nop_insn(int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) int arch_decode_hint_reg(struct instruction *insn, u8 sp_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #endif /* _ARCH_H */