Commit | Line | Data |
---|---|---|
442f04c3 JP |
1 | /* |
2 | * Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com> | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU General Public License | |
6 | * as published by the Free Software Foundation; either version 2 | |
7 | * of the License, or (at your option) any later version. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, | |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | * GNU General Public License for more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License | |
15 | * along with this program; if not, see <http://www.gnu.org/licenses/>. | |
16 | */ | |
17 | ||
18 | #ifndef _ARCH_H | |
19 | #define _ARCH_H | |
20 | ||
21 | #include <stdbool.h> | |
baa41469 | 22 | #include <linux/list.h> |
442f04c3 | 23 | #include "elf.h" |
baa41469 | 24 | #include "cfi.h" |
442f04c3 | 25 | |
baa41469 JP |
26 | #define INSN_JUMP_CONDITIONAL 1 |
27 | #define INSN_JUMP_UNCONDITIONAL 2 | |
28 | #define INSN_JUMP_DYNAMIC 3 | |
29 | #define INSN_CALL 4 | |
30 | #define INSN_CALL_DYNAMIC 5 | |
31 | #define INSN_RETURN 6 | |
32 | #define INSN_CONTEXT_SWITCH 7 | |
33 | #define INSN_STACK 8 | |
649ea4d5 JP |
34 | #define INSN_BUG 9 |
35 | #define INSN_NOP 10 | |
36 | #define INSN_OTHER 11 | |
442f04c3 JP |
37 | #define INSN_LAST INSN_OTHER |
38 | ||
baa41469 JP |
39 | enum op_dest_type { |
40 | OP_DEST_REG, | |
41 | OP_DEST_REG_INDIRECT, | |
42 | OP_DEST_MEM, | |
43 | OP_DEST_PUSH, | |
44 | OP_DEST_LEAVE, | |
45 | }; | |
46 | ||
47 | struct op_dest { | |
48 | enum op_dest_type type; | |
49 | unsigned char reg; | |
50 | int offset; | |
51 | }; | |
52 | ||
53 | enum op_src_type { | |
54 | OP_SRC_REG, | |
55 | OP_SRC_REG_INDIRECT, | |
56 | OP_SRC_CONST, | |
57 | OP_SRC_POP, | |
58 | OP_SRC_ADD, | |
59 | OP_SRC_AND, | |
60 | }; | |
61 | ||
62 | struct op_src { | |
63 | enum op_src_type type; | |
64 | unsigned char reg; | |
65 | int offset; | |
66 | }; | |
67 | ||
68 | struct stack_op { | |
69 | struct op_dest dest; | |
70 | struct op_src src; | |
71 | }; | |
72 | ||
73 | void arch_initial_func_cfi_state(struct cfi_state *state); | |
74 | ||
442f04c3 JP |
75 | int arch_decode_instruction(struct elf *elf, struct section *sec, |
76 | unsigned long offset, unsigned int maxlen, | |
77 | unsigned int *len, unsigned char *type, | |
baa41469 JP |
78 | unsigned long *immediate, struct stack_op *op); |
79 | ||
80 | bool arch_callee_saved_reg(unsigned char reg); | |
442f04c3 JP |
81 | |
82 | #endif /* _ARCH_H */ |