1#ifndef TARGET_ARM_TRANSLATE_H
2#define TARGET_ARM_TRANSLATE_H
3
4
5typedef struct DisasContext {
6 target_ulong pc;
7 uint32_t insn;
8 int is_jmp;
9
10 int condjmp;
11
12 TCGLabel *condlabel;
13
14 int condexec_mask;
15 int condexec_cond;
16 struct TranslationBlock *tb;
17 int singlestep_enabled;
18 int thumb;
19 int bswap_code;
20#if !defined(CONFIG_USER_ONLY)
21 int user;
22#endif
23 ARMMMUIdx mmu_idx;
24 bool ns;
25 int fp_excp_el;
26
27 bool secure_routed_to_el3;
28 bool vfp_enabled;
29 int vec_len;
30 int vec_stride;
31
32
33
34 uint32_t svc_imm;
35 int aarch64;
36 int current_el;
37 GHashTable *cp_regs;
38 uint64_t features;
39
40
41
42
43
44
45
46 bool fp_access_checked;
47
48
49
50 bool ss_active;
51 bool pstate_ss;
52
53
54
55
56 bool is_ldex;
57
58 bool ss_same_el;
59
60 int c15_cpar;
61#define TMP_A64_MAX 16
62 int tmp_a64_count;
63 TCGv_i64 tmp_a64[TMP_A64_MAX];
64} DisasContext;
65
66typedef struct DisasCompare {
67 TCGCond cond;
68 TCGv_i32 value;
69 bool value_global;
70} DisasCompare;
71
72
73extern TCGv_ptr cpu_env;
74extern TCGv_i32 cpu_NF, cpu_ZF, cpu_CF, cpu_VF;
75extern TCGv_i64 cpu_exclusive_addr;
76extern TCGv_i64 cpu_exclusive_val;
77#ifdef CONFIG_USER_ONLY
78extern TCGv_i64 cpu_exclusive_test;
79extern TCGv_i32 cpu_exclusive_info;
80#endif
81
82static inline int arm_dc_feature(DisasContext *dc, int feature)
83{
84 return (dc->features & (1ULL << feature)) != 0;
85}
86
87static inline int get_mem_index(DisasContext *s)
88{
89 return s->mmu_idx;
90}
91
92
93
94
95static inline int default_exception_el(DisasContext *s)
96{
97
98
99
100
101
102 return (s->mmu_idx == ARMMMUIdx_S1SE0 && s->secure_routed_to_el3)
103 ? 3 : MAX(1, s->current_el);
104}
105
106
107
108
109
110
111#define DISAS_WFI 4
112#define DISAS_SWI 5
113
114
115
116#define DISAS_EXC 6
117
118#define DISAS_WFE 7
119#define DISAS_HVC 8
120#define DISAS_SMC 9
121#define DISAS_YIELD 10
122
123#ifdef TARGET_AARCH64
124void a64_translate_init(void);
125void gen_intermediate_code_a64(ARMCPU *cpu, TranslationBlock *tb);
126void gen_a64_set_pc_im(uint64_t val);
127void aarch64_cpu_dump_state(CPUState *cs, FILE *f,
128 fprintf_function cpu_fprintf, int flags);
129#else
130static inline void a64_translate_init(void)
131{
132}
133
134static inline void gen_intermediate_code_a64(ARMCPU *cpu, TranslationBlock *tb)
135{
136}
137
138static inline void gen_a64_set_pc_im(uint64_t val)
139{
140}
141
142static inline void aarch64_cpu_dump_state(CPUState *cs, FILE *f,
143 fprintf_function cpu_fprintf,
144 int flags)
145{
146}
147#endif
148
149void arm_test_cc(DisasCompare *cmp, int cc);
150void arm_free_cc(DisasCompare *cmp);
151void arm_jump_cc(DisasCompare *cmp, TCGLabel *label);
152void arm_gen_test_cc(int cc, TCGLabel *label);
153
154#endif
155