1#ifndef TARGET_ARM_TRANSLATE_H
2#define TARGET_ARM_TRANSLATE_H
3
4#include "exec/translator.h"
5
6
7
8typedef struct DisasContext {
9 DisasContextBase base;
10 const ARMISARegisters *isar;
11
12 target_ulong pc;
13 target_ulong page_start;
14 uint32_t insn;
15
16 int condjmp;
17
18 TCGLabel *condlabel;
19
20 int condexec_mask;
21 int condexec_cond;
22 int thumb;
23 int sctlr_b;
24 TCGMemOp be_data;
25#if !defined(CONFIG_USER_ONLY)
26 int user;
27#endif
28 ARMMMUIdx mmu_idx;
29 bool tbi0;
30 bool tbi1;
31 bool ns;
32 int fp_excp_el;
33 int sve_excp_el;
34 int sve_len;
35
36 bool secure_routed_to_el3;
37 bool vfp_enabled;
38 int vec_len;
39 int vec_stride;
40 bool v7m_handler_mode;
41 bool v8m_secure;
42 bool v8m_stackcheck;
43
44
45
46 uint32_t svc_imm;
47 int aarch64;
48 int current_el;
49 GHashTable *cp_regs;
50 uint64_t features;
51
52
53
54
55
56
57
58 bool fp_access_checked;
59
60
61
62 bool ss_active;
63 bool pstate_ss;
64
65
66
67
68 bool is_ldex;
69
70 bool ss_same_el;
71
72 int c15_cpar;
73
74 TCGOp *insn_start;
75#define TMP_A64_MAX 16
76 int tmp_a64_count;
77 TCGv_i64 tmp_a64[TMP_A64_MAX];
78} DisasContext;
79
80typedef struct DisasCompare {
81 TCGCond cond;
82 TCGv_i32 value;
83 bool value_global;
84} DisasCompare;
85
86
87extern TCGv_i32 cpu_NF, cpu_ZF, cpu_CF, cpu_VF;
88extern TCGv_i64 cpu_exclusive_addr;
89extern TCGv_i64 cpu_exclusive_val;
90
91static inline int arm_dc_feature(DisasContext *dc, int feature)
92{
93 return (dc->features & (1ULL << feature)) != 0;
94}
95
96static inline int get_mem_index(DisasContext *s)
97{
98 return arm_to_core_mmu_idx(s->mmu_idx);
99}
100
101
102
103
104static inline int default_exception_el(DisasContext *s)
105{
106
107
108
109
110
111 return (s->mmu_idx == ARMMMUIdx_S1SE0 && s->secure_routed_to_el3)
112 ? 3 : MAX(1, s->current_el);
113}
114
115static inline void disas_set_insn_syndrome(DisasContext *s, uint32_t syn)
116{
117
118
119
120 syn &= ARM_INSN_START_WORD2_MASK;
121 syn >>= ARM_INSN_START_WORD2_SHIFT;
122
123
124 assert(s->insn_start != NULL);
125 tcg_set_insn_start_param(s->insn_start, 2, syn);
126 s->insn_start = NULL;
127}
128
129
130#define DISAS_JUMP DISAS_TARGET_0
131#define DISAS_UPDATE DISAS_TARGET_1
132
133
134
135
136#define DISAS_WFI DISAS_TARGET_2
137#define DISAS_SWI DISAS_TARGET_3
138
139#define DISAS_WFE DISAS_TARGET_4
140#define DISAS_HVC DISAS_TARGET_5
141#define DISAS_SMC DISAS_TARGET_6
142#define DISAS_YIELD DISAS_TARGET_7
143
144
145
146#define DISAS_BX_EXCRET DISAS_TARGET_8
147
148
149
150
151
152
153#define DISAS_EXIT DISAS_TARGET_9
154
155#ifdef TARGET_AARCH64
156void a64_translate_init(void);
157void gen_a64_set_pc_im(uint64_t val);
158void aarch64_cpu_dump_state(CPUState *cs, FILE *f,
159 fprintf_function cpu_fprintf, int flags);
160extern const TranslatorOps aarch64_translator_ops;
161#else
162static inline void a64_translate_init(void)
163{
164}
165
166static inline void gen_a64_set_pc_im(uint64_t val)
167{
168}
169
170static inline void aarch64_cpu_dump_state(CPUState *cs, FILE *f,
171 fprintf_function cpu_fprintf,
172 int flags)
173{
174}
175#endif
176
177void arm_test_cc(DisasCompare *cmp, int cc);
178void arm_free_cc(DisasCompare *cmp);
179void arm_jump_cc(DisasCompare *cmp, TCGLabel *label);
180void arm_gen_test_cc(int cc, TCGLabel *label);
181
182
183static inline TCGv_i32 get_ahp_flag(void)
184{
185 TCGv_i32 ret = tcg_temp_new_i32();
186
187 tcg_gen_ld_i32(ret, cpu_env,
188 offsetof(CPUARMState, vfp.xregs[ARM_VFP_FPSCR]));
189 tcg_gen_extract_i32(ret, ret, 26, 1);
190
191 return ret;
192}
193
194
195
196extern const GVecGen3 bsl_op;
197extern const GVecGen3 bit_op;
198extern const GVecGen3 bif_op;
199extern const GVecGen3 mla_op[4];
200extern const GVecGen3 mls_op[4];
201extern const GVecGen3 cmtst_op[4];
202extern const GVecGen2i ssra_op[4];
203extern const GVecGen2i usra_op[4];
204extern const GVecGen2i sri_op[4];
205extern const GVecGen2i sli_op[4];
206void gen_cmtst_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b);
207
208
209
210
211#define dc_isar_feature(name, ctx) \
212 ({ DisasContext *ctx_ = (ctx); isar_feature_##name(ctx_->isar); })
213
214#endif
215