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