1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#ifndef CPU_LM32_H
21#define CPU_LM32_H
22
23#define TARGET_LONG_BITS 32
24
25#define CPUState struct CPULM32State
26
27#include "qemu-common.h"
28#include "cpu-defs.h"
29struct CPULM32State;
30
31#define TARGET_HAS_ICE 1
32
33#define ELF_MACHINE EM_LATTICEMICO32
34
35#define NB_MMU_MODES 1
36#define TARGET_PAGE_BITS 12
37static inline int cpu_mmu_index(CPUState *env)
38{
39 return 0;
40}
41
42#define TARGET_PHYS_ADDR_SPACE_BITS 32
43#define TARGET_VIRT_ADDR_SPACE_BITS 32
44
45
46enum {
47 EXCP_RESET = 0,
48 EXCP_BREAKPOINT,
49 EXCP_INSN_BUS_ERROR,
50 EXCP_WATCHPOINT,
51 EXCP_DATA_BUS_ERROR,
52 EXCP_DIVIDE_BY_ZERO,
53 EXCP_IRQ,
54 EXCP_SYSTEMCALL
55};
56
57
58enum {
59 R_R0 = 0, R_R1, R_R2, R_R3, R_R4, R_R5, R_R6, R_R7, R_R8, R_R9, R_R10,
60 R_R11, R_R12, R_R13, R_R14, R_R15, R_R16, R_R17, R_R18, R_R19, R_R20,
61 R_R21, R_R22, R_R23, R_R24, R_R25, R_R26, R_R27, R_R28, R_R29, R_R30,
62 R_R31
63};
64
65
66enum {
67 R_GP = R_R26,
68 R_FP = R_R27,
69 R_SP = R_R28,
70 R_RA = R_R29,
71 R_EA = R_R30,
72 R_BA = R_R31
73};
74
75
76enum {
77 IE_IE = (1<<0),
78 IE_EIE = (1<<1),
79 IE_BIE = (1<<2),
80};
81
82
83enum {
84 DC_SS = (1<<0),
85 DC_RE = (1<<1),
86 DC_C0 = (1<<2),
87 DC_C1 = (1<<3),
88 DC_C2 = (1<<4),
89 DC_C3 = (1<<5),
90};
91
92
93enum {
94 CFG_M = (1<<0),
95 CFG_D = (1<<1),
96 CFG_S = (1<<2),
97 CFG_U = (1<<3),
98 CFG_X = (1<<4),
99 CFG_CC = (1<<5),
100 CFG_IC = (1<<6),
101 CFG_DC = (1<<7),
102 CFG_G = (1<<8),
103 CFG_H = (1<<9),
104 CFG_R = (1<<10),
105 CFG_J = (1<<11),
106 CFG_INT_SHIFT = 12,
107 CFG_BP_SHIFT = 18,
108 CFG_WP_SHIFT = 22,
109 CFG_REV_SHIFT = 26,
110};
111
112
113enum {
114 CSR_IE = 0x00,
115 CSR_IM = 0x01,
116 CSR_IP = 0x02,
117 CSR_ICC = 0x03,
118 CSR_DCC = 0x04,
119 CSR_CC = 0x05,
120 CSR_CFG = 0x06,
121 CSR_EBA = 0x07,
122 CSR_DC = 0x08,
123 CSR_DEBA = 0x09,
124 CSR_JTX = 0x0e,
125 CSR_JRX = 0x0f,
126 CSR_BP0 = 0x10,
127 CSR_BP1 = 0x11,
128 CSR_BP2 = 0x12,
129 CSR_BP3 = 0x13,
130 CSR_WP0 = 0x18,
131 CSR_WP1 = 0x19,
132 CSR_WP2 = 0x1a,
133 CSR_WP3 = 0x1b,
134};
135
136enum {
137 LM32_FEATURE_MULTIPLY = 1,
138 LM32_FEATURE_DIVIDE = 2,
139 LM32_FEATURE_SHIFT = 4,
140 LM32_FEATURE_SIGN_EXTEND = 8,
141 LM32_FEATURE_I_CACHE = 16,
142 LM32_FEATURE_D_CACHE = 32,
143 LM32_FEATURE_CYCLE_COUNT = 64,
144};
145
146enum {
147 LM32_FLAG_IGNORE_MSB = 1,
148};
149
150typedef struct CPULM32State {
151
152 uint32_t regs[32];
153
154
155 uint32_t pc;
156 uint32_t ie;
157 uint32_t icc;
158 uint32_t dcc;
159 uint32_t cc;
160 uint32_t cfg;
161
162
163 uint32_t dc;
164 uint32_t bp[4];
165 uint32_t wp[4];
166
167 CPU_COMMON
168
169 uint32_t eba;
170 uint32_t deba;
171
172
173 DeviceState *pic_state;
174
175 DeviceState *juart_state;
176
177
178 uint32_t features;
179 uint32_t flags;
180 uint8_t num_bps;
181 uint8_t num_wps;
182
183} CPULM32State;
184
185
186CPUState *cpu_lm32_init(const char *cpu_model);
187void cpu_lm32_list(FILE *f, fprintf_function cpu_fprintf);
188int cpu_lm32_exec(CPUState *s);
189void cpu_lm32_close(CPUState *s);
190void do_interrupt(CPUState *env);
191
192
193
194int cpu_lm32_signal_handler(int host_signum, void *pinfo,
195 void *puc);
196void lm32_translate_init(void);
197void cpu_lm32_set_phys_msb_ignore(CPUState *env, int value);
198
199#define cpu_list cpu_lm32_list
200#define cpu_init cpu_lm32_init
201#define cpu_exec cpu_lm32_exec
202#define cpu_gen_code cpu_lm32_gen_code
203#define cpu_signal_handler cpu_lm32_signal_handler
204
205#define CPU_SAVE_VERSION 1
206
207int cpu_lm32_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
208 int mmu_idx);
209#define cpu_handle_mmu_fault cpu_lm32_handle_mmu_fault
210
211#if defined(CONFIG_USER_ONLY)
212static inline void cpu_clone_regs(CPUState *env, target_ulong newsp)
213{
214 if (newsp) {
215 env->regs[R_SP] = newsp;
216 }
217 env->regs[R_R1] = 0;
218}
219#endif
220
221static inline void cpu_set_tls(CPUState *env, target_ulong newtls)
222{
223}
224
225static inline int cpu_interrupts_enabled(CPUState *env)
226{
227 return env->ie & IE_IE;
228}
229
230#include "cpu-all.h"
231
232static inline target_ulong cpu_get_pc(CPUState *env)
233{
234 return env->pc;
235}
236
237static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc,
238 target_ulong *cs_base, int *flags)
239{
240 *pc = env->pc;
241 *cs_base = 0;
242 *flags = 0;
243}
244
245static inline bool cpu_has_work(CPUState *env)
246{
247 return env->interrupt_request & CPU_INTERRUPT_HARD;
248}
249
250#include "exec-all.h"
251
252static inline void cpu_pc_from_tb(CPUState *env, TranslationBlock *tb)
253{
254 env->pc = tb->pc;
255}
256
257#endif
258