Commit e37e863f5e492cf60db21233f4008aafd6c5f610
1 parent
fdabc366
correct split between helper.c and op_helper.c - cosmetics
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1505 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
233 additions
and
242 deletions
target-mips/cpu.h
@@ -240,174 +240,6 @@ enum { | @@ -240,174 +240,6 @@ enum { | ||
240 | EXCP_FLUSH = 0x109, | 240 | EXCP_FLUSH = 0x109, |
241 | }; | 241 | }; |
242 | 242 | ||
243 | -/* MIPS opcodes */ | ||
244 | -#define EXT_SPECIAL 0x100 | ||
245 | -#define EXT_SPECIAL2 0x200 | ||
246 | -#define EXT_REGIMM 0x300 | ||
247 | -#define EXT_CP0 0x400 | ||
248 | -#define EXT_CP1 0x500 | ||
249 | -#define EXT_CP2 0x600 | ||
250 | -#define EXT_CP3 0x700 | ||
251 | - | ||
252 | -enum { | ||
253 | - /* indirect opcode tables */ | ||
254 | - OPC_SPECIAL = 0x00, | ||
255 | - OPC_BREGIMM = 0x01, | ||
256 | - OPC_CP0 = 0x10, | ||
257 | - OPC_CP1 = 0x11, | ||
258 | - OPC_CP2 = 0x12, | ||
259 | - OPC_CP3 = 0x13, | ||
260 | - OPC_SPECIAL2 = 0x1C, | ||
261 | - /* arithmetic with immediate */ | ||
262 | - OPC_ADDI = 0x08, | ||
263 | - OPC_ADDIU = 0x09, | ||
264 | - OPC_SLTI = 0x0A, | ||
265 | - OPC_SLTIU = 0x0B, | ||
266 | - OPC_ANDI = 0x0C, | ||
267 | - OPC_ORI = 0x0D, | ||
268 | - OPC_XORI = 0x0E, | ||
269 | - OPC_LUI = 0x0F, | ||
270 | - /* Jump and branches */ | ||
271 | - OPC_J = 0x02, | ||
272 | - OPC_JAL = 0x03, | ||
273 | - OPC_BEQ = 0x04, /* Unconditional if rs = rt = 0 (B) */ | ||
274 | - OPC_BEQL = 0x14, | ||
275 | - OPC_BNE = 0x05, | ||
276 | - OPC_BNEL = 0x15, | ||
277 | - OPC_BLEZ = 0x06, | ||
278 | - OPC_BLEZL = 0x16, | ||
279 | - OPC_BGTZ = 0x07, | ||
280 | - OPC_BGTZL = 0x17, | ||
281 | - OPC_JALX = 0x1D, /* MIPS 16 only */ | ||
282 | - /* Load and stores */ | ||
283 | - OPC_LB = 0x20, | ||
284 | - OPC_LH = 0x21, | ||
285 | - OPC_LWL = 0x22, | ||
286 | - OPC_LW = 0x23, | ||
287 | - OPC_LBU = 0x24, | ||
288 | - OPC_LHU = 0x25, | ||
289 | - OPC_LWR = 0x26, | ||
290 | - OPC_SB = 0x28, | ||
291 | - OPC_SH = 0x29, | ||
292 | - OPC_SWL = 0x2A, | ||
293 | - OPC_SW = 0x2B, | ||
294 | - OPC_SWR = 0x2E, | ||
295 | - OPC_LL = 0x30, | ||
296 | - OPC_SC = 0x38, | ||
297 | - /* Floating point load/store */ | ||
298 | - OPC_LWC1 = 0x31, | ||
299 | - OPC_LWC2 = 0x32, | ||
300 | - OPC_LDC1 = 0x35, | ||
301 | - OPC_LDC2 = 0x36, | ||
302 | - OPC_SWC1 = 0x39, | ||
303 | - OPC_SWC2 = 0x3A, | ||
304 | - OPC_SDC1 = 0x3D, | ||
305 | - OPC_SDC2 = 0x3E, | ||
306 | - /* Cache and prefetch */ | ||
307 | - OPC_CACHE = 0x2F, | ||
308 | - OPC_PREF = 0x33, | ||
309 | -}; | ||
310 | - | ||
311 | -/* MIPS special opcodes */ | ||
312 | -enum { | ||
313 | - /* Shifts */ | ||
314 | - OPC_SLL = 0x00 | EXT_SPECIAL, | ||
315 | - /* NOP is SLL r0, r0, 0 */ | ||
316 | - /* SSNOP is SLL r0, r0, 1 */ | ||
317 | - OPC_SRL = 0x02 | EXT_SPECIAL, | ||
318 | - OPC_SRA = 0x03 | EXT_SPECIAL, | ||
319 | - OPC_SLLV = 0x04 | EXT_SPECIAL, | ||
320 | - OPC_SRLV = 0x06 | EXT_SPECIAL, | ||
321 | - OPC_SRAV = 0x07 | EXT_SPECIAL, | ||
322 | - /* Multiplication / division */ | ||
323 | - OPC_MULT = 0x18 | EXT_SPECIAL, | ||
324 | - OPC_MULTU = 0x19 | EXT_SPECIAL, | ||
325 | - OPC_DIV = 0x1A | EXT_SPECIAL, | ||
326 | - OPC_DIVU = 0x1B | EXT_SPECIAL, | ||
327 | - /* 2 registers arithmetic / logic */ | ||
328 | - OPC_ADD = 0x20 | EXT_SPECIAL, | ||
329 | - OPC_ADDU = 0x21 | EXT_SPECIAL, | ||
330 | - OPC_SUB = 0x22 | EXT_SPECIAL, | ||
331 | - OPC_SUBU = 0x23 | EXT_SPECIAL, | ||
332 | - OPC_AND = 0x24 | EXT_SPECIAL, | ||
333 | - OPC_OR = 0x25 | EXT_SPECIAL, | ||
334 | - OPC_XOR = 0x26 | EXT_SPECIAL, | ||
335 | - OPC_NOR = 0x27 | EXT_SPECIAL, | ||
336 | - OPC_SLT = 0x2A | EXT_SPECIAL, | ||
337 | - OPC_SLTU = 0x2B | EXT_SPECIAL, | ||
338 | - /* Jumps */ | ||
339 | - OPC_JR = 0x08 | EXT_SPECIAL, | ||
340 | - OPC_JALR = 0x09 | EXT_SPECIAL, | ||
341 | - /* Traps */ | ||
342 | - OPC_TGE = 0x30 | EXT_SPECIAL, | ||
343 | - OPC_TGEU = 0x31 | EXT_SPECIAL, | ||
344 | - OPC_TLT = 0x32 | EXT_SPECIAL, | ||
345 | - OPC_TLTU = 0x33 | EXT_SPECIAL, | ||
346 | - OPC_TEQ = 0x34 | EXT_SPECIAL, | ||
347 | - OPC_TNE = 0x36 | EXT_SPECIAL, | ||
348 | - /* HI / LO registers load & stores */ | ||
349 | - OPC_MFHI = 0x10 | EXT_SPECIAL, | ||
350 | - OPC_MTHI = 0x11 | EXT_SPECIAL, | ||
351 | - OPC_MFLO = 0x12 | EXT_SPECIAL, | ||
352 | - OPC_MTLO = 0x13 | EXT_SPECIAL, | ||
353 | - /* Conditional moves */ | ||
354 | - OPC_MOVZ = 0x0A | EXT_SPECIAL, | ||
355 | - OPC_MOVN = 0x0B | EXT_SPECIAL, | ||
356 | - | ||
357 | - OPC_MOVCI = 0x01 | EXT_SPECIAL, | ||
358 | - | ||
359 | - /* Special */ | ||
360 | - OPC_PMON = 0x05 | EXT_SPECIAL, | ||
361 | - OPC_SYSCALL = 0x0C | EXT_SPECIAL, | ||
362 | - OPC_BREAK = 0x0D | EXT_SPECIAL, | ||
363 | - OPC_SYNC = 0x0F | EXT_SPECIAL, | ||
364 | -}; | ||
365 | - | ||
366 | -enum { | ||
367 | - /* Mutiply & xxx operations */ | ||
368 | - OPC_MADD = 0x00 | EXT_SPECIAL2, | ||
369 | - OPC_MADDU = 0x01 | EXT_SPECIAL2, | ||
370 | - OPC_MUL = 0x02 | EXT_SPECIAL2, | ||
371 | - OPC_MSUB = 0x04 | EXT_SPECIAL2, | ||
372 | - OPC_MSUBU = 0x05 | EXT_SPECIAL2, | ||
373 | - /* Misc */ | ||
374 | - OPC_CLZ = 0x20 | EXT_SPECIAL2, | ||
375 | - OPC_CLO = 0x21 | EXT_SPECIAL2, | ||
376 | - /* Special */ | ||
377 | - OPC_SDBBP = 0x3F | EXT_SPECIAL2, | ||
378 | -}; | ||
379 | - | ||
380 | -/* Branch REGIMM */ | ||
381 | -enum { | ||
382 | - OPC_BLTZ = 0x00 | EXT_REGIMM, | ||
383 | - OPC_BLTZL = 0x02 | EXT_REGIMM, | ||
384 | - OPC_BGEZ = 0x01 | EXT_REGIMM, | ||
385 | - OPC_BGEZL = 0x03 | EXT_REGIMM, | ||
386 | - OPC_BLTZAL = 0x10 | EXT_REGIMM, | ||
387 | - OPC_BLTZALL = 0x12 | EXT_REGIMM, | ||
388 | - OPC_BGEZAL = 0x11 | EXT_REGIMM, | ||
389 | - OPC_BGEZALL = 0x13 | EXT_REGIMM, | ||
390 | - OPC_TGEI = 0x08 | EXT_REGIMM, | ||
391 | - OPC_TGEIU = 0x09 | EXT_REGIMM, | ||
392 | - OPC_TLTI = 0x0A | EXT_REGIMM, | ||
393 | - OPC_TLTIU = 0x0B | EXT_REGIMM, | ||
394 | - OPC_TEQI = 0x0C | EXT_REGIMM, | ||
395 | - OPC_TNEI = 0x0E | EXT_REGIMM, | ||
396 | -}; | ||
397 | - | ||
398 | -enum { | ||
399 | - /* Coprocessor 0 (MMU) */ | ||
400 | - OPC_MFC0 = 0x00 | EXT_CP0, | ||
401 | - OPC_MTC0 = 0x04 | EXT_CP0, | ||
402 | - OPC_TLBR = 0x01 | EXT_CP0, | ||
403 | - OPC_TLBWI = 0x02 | EXT_CP0, | ||
404 | - OPC_TLBWR = 0x06 | EXT_CP0, | ||
405 | - OPC_TLBP = 0x08 | EXT_CP0, | ||
406 | - OPC_ERET = 0x18 | EXT_CP0, | ||
407 | - OPC_DERET = 0x1F | EXT_CP0, | ||
408 | - OPC_WAIT = 0x20 | EXT_CP0, | ||
409 | -}; | ||
410 | - | ||
411 | int cpu_mips_exec(CPUMIPSState *s); | 243 | int cpu_mips_exec(CPUMIPSState *s); |
412 | CPUMIPSState *cpu_mips_init(void); | 244 | CPUMIPSState *cpu_mips_init(void); |
413 | uint32_t cpu_mips_get_clock (void); | 245 | uint32_t cpu_mips_get_clock (void); |
target-mips/exec.h
@@ -19,27 +19,15 @@ typedef uint32_t host_uint_t; | @@ -19,27 +19,15 @@ typedef uint32_t host_uint_t; | ||
19 | register host_uint_t T0 asm(AREG1); | 19 | register host_uint_t T0 asm(AREG1); |
20 | register host_uint_t T1 asm(AREG2); | 20 | register host_uint_t T1 asm(AREG2); |
21 | register host_uint_t T2 asm(AREG3); | 21 | register host_uint_t T2 asm(AREG3); |
22 | -register host_int_t Ts0 asm(AREG1); | ||
23 | -register host_int_t Ts1 asm(AREG2); | ||
24 | -register host_int_t Ts2 asm(AREG3); | ||
25 | - | ||
26 | -#define PARAM(n) ((uint32_t)PARAM##n) | ||
27 | -#define SPARAM(n) ((int32_t)PARAM##n) | ||
28 | 22 | ||
29 | #if defined (USE_HOST_FLOAT_REGS) | 23 | #if defined (USE_HOST_FLOAT_REGS) |
30 | register double FT0 asm(FREG0); | 24 | register double FT0 asm(FREG0); |
31 | register double FT1 asm(FREG1); | 25 | register double FT1 asm(FREG1); |
32 | register double FT2 asm(FREG2); | 26 | register double FT2 asm(FREG2); |
33 | -register float FTS0 asm(FREG0); | ||
34 | -register float FTS1 asm(FREG1); | ||
35 | -register float FTS2 asm(FREG2); | ||
36 | #else | 27 | #else |
37 | #define FT0 (env->ft0.d) | 28 | #define FT0 (env->ft0.d) |
38 | #define FT1 (env->ft1.d) | 29 | #define FT1 (env->ft1.d) |
39 | #define FT2 (env->ft2.d) | 30 | #define FT2 (env->ft2.d) |
40 | -#define FTS0 (env->ft0.f) | ||
41 | -#define FTS1 (env->ft1.f) | ||
42 | -#define FTS2 (env->ft2.f) | ||
43 | #endif | 31 | #endif |
44 | 32 | ||
45 | #if defined (DEBUG_OP) | 33 | #if defined (DEBUG_OP) |
target-mips/helper.c
@@ -17,7 +17,16 @@ | @@ -17,7 +17,16 @@ | ||
17 | * License along with this library; if not, write to the Free Software | 17 | * License along with this library; if not, write to the Free Software |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ | 19 | */ |
20 | -#include "exec.h" | 20 | +#include <stdarg.h> |
21 | +#include <stdlib.h> | ||
22 | +#include <stdio.h> | ||
23 | +#include <string.h> | ||
24 | +#include <inttypes.h> | ||
25 | +#include <signal.h> | ||
26 | +#include <assert.h> | ||
27 | + | ||
28 | +#include "cpu.h" | ||
29 | +#include "exec-all.h" | ||
21 | 30 | ||
22 | /* MIPS32 4K MMU emulation */ | 31 | /* MIPS32 4K MMU emulation */ |
23 | #ifdef MIPS_USES_R4K_TLB | 32 | #ifdef MIPS_USES_R4K_TLB |
@@ -142,57 +151,10 @@ target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr) | @@ -142,57 +151,10 @@ target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr) | ||
142 | return -1; | 151 | return -1; |
143 | return phys_addr; | 152 | return phys_addr; |
144 | } | 153 | } |
145 | -#endif | ||
146 | - | ||
147 | -#if !defined(CONFIG_USER_ONLY) | ||
148 | - | ||
149 | -#define MMUSUFFIX _mmu | ||
150 | -#define GETPC() (__builtin_return_address(0)) | ||
151 | - | ||
152 | -#define SHIFT 0 | ||
153 | -#include "softmmu_template.h" | ||
154 | - | ||
155 | -#define SHIFT 1 | ||
156 | -#include "softmmu_template.h" | ||
157 | - | ||
158 | -#define SHIFT 2 | ||
159 | -#include "softmmu_template.h" | ||
160 | - | ||
161 | -#define SHIFT 3 | ||
162 | -#include "softmmu_template.h" | ||
163 | - | ||
164 | -void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr) | ||
165 | -{ | ||
166 | - TranslationBlock *tb; | ||
167 | - CPUState *saved_env; | ||
168 | - unsigned long pc; | ||
169 | - int ret; | ||
170 | - | ||
171 | - /* XXX: hack to restore env in all cases, even if not called from | ||
172 | - generated code */ | ||
173 | - saved_env = env; | ||
174 | - env = cpu_single_env; | ||
175 | - ret = cpu_mips_handle_mmu_fault(env, addr, is_write, is_user, 1); | ||
176 | - if (ret) { | ||
177 | - if (retaddr) { | ||
178 | - /* now we have a real cpu fault */ | ||
179 | - pc = (unsigned long)retaddr; | ||
180 | - tb = tb_find_pc(pc); | ||
181 | - if (tb) { | ||
182 | - /* the PC is inside the translated code. It means that we have | ||
183 | - a virtual CPU fault */ | ||
184 | - cpu_restore_state(tb, env, pc, NULL); | ||
185 | - } | ||
186 | - } | ||
187 | - do_raise_exception_err(env->exception_index, env->error_code); | ||
188 | - } | ||
189 | - env = saved_env; | ||
190 | -} | ||
191 | 154 | ||
192 | void cpu_mips_init_mmu (CPUState *env) | 155 | void cpu_mips_init_mmu (CPUState *env) |
193 | { | 156 | { |
194 | } | 157 | } |
195 | - | ||
196 | #endif /* !defined(CONFIG_USER_ONLY) */ | 158 | #endif /* !defined(CONFIG_USER_ONLY) */ |
197 | 159 | ||
198 | int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | 160 | int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw, |
target-mips/op_helper.c
@@ -29,7 +29,6 @@ void cpu_loop_exit(void) | @@ -29,7 +29,6 @@ void cpu_loop_exit(void) | ||
29 | longjmp(env->jmp_env, 1); | 29 | longjmp(env->jmp_env, 1); |
30 | } | 30 | } |
31 | 31 | ||
32 | -__attribute__ (( regparm(2) )) | ||
33 | void do_raise_exception_err (uint32_t exception, int error_code) | 32 | void do_raise_exception_err (uint32_t exception, int error_code) |
34 | { | 33 | { |
35 | #if 1 | 34 | #if 1 |
@@ -42,7 +41,6 @@ void do_raise_exception_err (uint32_t exception, int error_code) | @@ -42,7 +41,6 @@ void do_raise_exception_err (uint32_t exception, int error_code) | ||
42 | cpu_loop_exit(); | 41 | cpu_loop_exit(); |
43 | } | 42 | } |
44 | 43 | ||
45 | -__attribute__ (( regparm(1) )) | ||
46 | void do_raise_exception (uint32_t exception) | 44 | void do_raise_exception (uint32_t exception) |
47 | { | 45 | { |
48 | do_raise_exception_err(exception, 0); | 46 | do_raise_exception_err(exception, 0); |
@@ -117,7 +115,6 @@ void do_msubu (void) | @@ -117,7 +115,6 @@ void do_msubu (void) | ||
117 | #endif | 115 | #endif |
118 | 116 | ||
119 | /* CP0 helpers */ | 117 | /* CP0 helpers */ |
120 | -__attribute__ (( regparm(2) )) | ||
121 | void do_mfc0 (int reg, int sel) | 118 | void do_mfc0 (int reg, int sel) |
122 | { | 119 | { |
123 | const unsigned char *rn; | 120 | const unsigned char *rn; |
@@ -267,12 +264,10 @@ void do_mfc0 (int reg, int sel) | @@ -267,12 +264,10 @@ void do_mfc0 (int reg, int sel) | ||
267 | return; | 264 | return; |
268 | } | 265 | } |
269 | 266 | ||
270 | -__attribute__ (( regparm(2) )) | ||
271 | void do_mtc0 (int reg, int sel) | 267 | void do_mtc0 (int reg, int sel) |
272 | { | 268 | { |
273 | const unsigned char *rn; | 269 | const unsigned char *rn; |
274 | uint32_t val, old, mask; | 270 | uint32_t val, old, mask; |
275 | - int i, raise; | ||
276 | 271 | ||
277 | if (sel != 0 && reg != 16 && reg != 28) { | 272 | if (sel != 0 && reg != 16 && reg != 28) { |
278 | val = -1; | 273 | val = -1; |
@@ -379,11 +374,14 @@ void do_mtc0 (int reg, int sel) | @@ -379,11 +374,14 @@ void do_mtc0 (int reg, int sel) | ||
379 | old = env->CP0_Cause; | 374 | old = env->CP0_Cause; |
380 | env->CP0_Cause = val; | 375 | env->CP0_Cause = val; |
381 | #if 0 | 376 | #if 0 |
382 | - /* Check if we ever asserted a software IRQ */ | ||
383 | - for (i = 0; i < 2; i++) { | ||
384 | - mask = 0x100 << i; | ||
385 | - if ((val & mask) & !(old & mask)) | ||
386 | - mips_set_irq(i); | 377 | + { |
378 | + int i; | ||
379 | + /* Check if we ever asserted a software IRQ */ | ||
380 | + for (i = 0; i < 2; i++) { | ||
381 | + mask = 0x100 << i; | ||
382 | + if ((val & mask) & !(old & mask)) | ||
383 | + mips_set_irq(i); | ||
384 | + } | ||
387 | } | 385 | } |
388 | #endif | 386 | #endif |
389 | rn = "Cause"; | 387 | rn = "Cause"; |
@@ -486,7 +484,6 @@ void do_mtc0 (int reg, int sel) | @@ -486,7 +484,6 @@ void do_mtc0 (int reg, int sel) | ||
486 | 484 | ||
487 | /* TLB management */ | 485 | /* TLB management */ |
488 | #if defined(MIPS_USES_R4K_TLB) | 486 | #if defined(MIPS_USES_R4K_TLB) |
489 | -__attribute__ (( regparm(1) )) | ||
490 | static void invalidate_tb (int idx) | 487 | static void invalidate_tb (int idx) |
491 | { | 488 | { |
492 | tlb_t *tlb; | 489 | tlb_t *tlb; |
@@ -505,7 +502,6 @@ static void invalidate_tb (int idx) | @@ -505,7 +502,6 @@ static void invalidate_tb (int idx) | ||
505 | } | 502 | } |
506 | } | 503 | } |
507 | 504 | ||
508 | -__attribute__ (( regparm(1) )) | ||
509 | static void fill_tb (int idx) | 505 | static void fill_tb (int idx) |
510 | { | 506 | { |
511 | tlb_t *tlb; | 507 | tlb_t *tlb; |
@@ -584,7 +580,6 @@ void do_tlbr (void) | @@ -584,7 +580,6 @@ void do_tlbr (void) | ||
584 | } | 580 | } |
585 | #endif | 581 | #endif |
586 | 582 | ||
587 | -__attribute__ (( regparm(1) )) | ||
588 | void op_dump_ldst (const unsigned char *func) | 583 | void op_dump_ldst (const unsigned char *func) |
589 | { | 584 | { |
590 | if (loglevel) | 585 | if (loglevel) |
@@ -608,7 +603,6 @@ void debug_eret (void) | @@ -608,7 +603,6 @@ void debug_eret (void) | ||
608 | } | 603 | } |
609 | } | 604 | } |
610 | 605 | ||
611 | -__attribute__ (( regparm(1) )) | ||
612 | void do_pmon (int function) | 606 | void do_pmon (int function) |
613 | { | 607 | { |
614 | function /= 2; | 608 | function /= 2; |
@@ -634,3 +628,50 @@ void do_pmon (int function) | @@ -634,3 +628,50 @@ void do_pmon (int function) | ||
634 | break; | 628 | break; |
635 | } | 629 | } |
636 | } | 630 | } |
631 | + | ||
632 | +#if !defined(CONFIG_USER_ONLY) | ||
633 | + | ||
634 | +#define MMUSUFFIX _mmu | ||
635 | +#define GETPC() (__builtin_return_address(0)) | ||
636 | + | ||
637 | +#define SHIFT 0 | ||
638 | +#include "softmmu_template.h" | ||
639 | + | ||
640 | +#define SHIFT 1 | ||
641 | +#include "softmmu_template.h" | ||
642 | + | ||
643 | +#define SHIFT 2 | ||
644 | +#include "softmmu_template.h" | ||
645 | + | ||
646 | +#define SHIFT 3 | ||
647 | +#include "softmmu_template.h" | ||
648 | + | ||
649 | +void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr) | ||
650 | +{ | ||
651 | + TranslationBlock *tb; | ||
652 | + CPUState *saved_env; | ||
653 | + unsigned long pc; | ||
654 | + int ret; | ||
655 | + | ||
656 | + /* XXX: hack to restore env in all cases, even if not called from | ||
657 | + generated code */ | ||
658 | + saved_env = env; | ||
659 | + env = cpu_single_env; | ||
660 | + ret = cpu_mips_handle_mmu_fault(env, addr, is_write, is_user, 1); | ||
661 | + if (ret) { | ||
662 | + if (retaddr) { | ||
663 | + /* now we have a real cpu fault */ | ||
664 | + pc = (unsigned long)retaddr; | ||
665 | + tb = tb_find_pc(pc); | ||
666 | + if (tb) { | ||
667 | + /* the PC is inside the translated code. It means that we have | ||
668 | + a virtual CPU fault */ | ||
669 | + cpu_restore_state(tb, env, pc, NULL); | ||
670 | + } | ||
671 | + } | ||
672 | + do_raise_exception_err(env->exception_index, env->error_code); | ||
673 | + } | ||
674 | + env = saved_env; | ||
675 | +} | ||
676 | + | ||
677 | +#endif |
target-mips/translate.c
@@ -43,6 +43,174 @@ static uint32_t *gen_opparam_ptr; | @@ -43,6 +43,174 @@ static uint32_t *gen_opparam_ptr; | ||
43 | 43 | ||
44 | #include "gen-op.h" | 44 | #include "gen-op.h" |
45 | 45 | ||
46 | +/* MIPS opcodes */ | ||
47 | +#define EXT_SPECIAL 0x100 | ||
48 | +#define EXT_SPECIAL2 0x200 | ||
49 | +#define EXT_REGIMM 0x300 | ||
50 | +#define EXT_CP0 0x400 | ||
51 | +#define EXT_CP1 0x500 | ||
52 | +#define EXT_CP2 0x600 | ||
53 | +#define EXT_CP3 0x700 | ||
54 | + | ||
55 | +enum { | ||
56 | + /* indirect opcode tables */ | ||
57 | + OPC_SPECIAL = 0x00, | ||
58 | + OPC_BREGIMM = 0x01, | ||
59 | + OPC_CP0 = 0x10, | ||
60 | + OPC_CP1 = 0x11, | ||
61 | + OPC_CP2 = 0x12, | ||
62 | + OPC_CP3 = 0x13, | ||
63 | + OPC_SPECIAL2 = 0x1C, | ||
64 | + /* arithmetic with immediate */ | ||
65 | + OPC_ADDI = 0x08, | ||
66 | + OPC_ADDIU = 0x09, | ||
67 | + OPC_SLTI = 0x0A, | ||
68 | + OPC_SLTIU = 0x0B, | ||
69 | + OPC_ANDI = 0x0C, | ||
70 | + OPC_ORI = 0x0D, | ||
71 | + OPC_XORI = 0x0E, | ||
72 | + OPC_LUI = 0x0F, | ||
73 | + /* Jump and branches */ | ||
74 | + OPC_J = 0x02, | ||
75 | + OPC_JAL = 0x03, | ||
76 | + OPC_BEQ = 0x04, /* Unconditional if rs = rt = 0 (B) */ | ||
77 | + OPC_BEQL = 0x14, | ||
78 | + OPC_BNE = 0x05, | ||
79 | + OPC_BNEL = 0x15, | ||
80 | + OPC_BLEZ = 0x06, | ||
81 | + OPC_BLEZL = 0x16, | ||
82 | + OPC_BGTZ = 0x07, | ||
83 | + OPC_BGTZL = 0x17, | ||
84 | + OPC_JALX = 0x1D, /* MIPS 16 only */ | ||
85 | + /* Load and stores */ | ||
86 | + OPC_LB = 0x20, | ||
87 | + OPC_LH = 0x21, | ||
88 | + OPC_LWL = 0x22, | ||
89 | + OPC_LW = 0x23, | ||
90 | + OPC_LBU = 0x24, | ||
91 | + OPC_LHU = 0x25, | ||
92 | + OPC_LWR = 0x26, | ||
93 | + OPC_SB = 0x28, | ||
94 | + OPC_SH = 0x29, | ||
95 | + OPC_SWL = 0x2A, | ||
96 | + OPC_SW = 0x2B, | ||
97 | + OPC_SWR = 0x2E, | ||
98 | + OPC_LL = 0x30, | ||
99 | + OPC_SC = 0x38, | ||
100 | + /* Floating point load/store */ | ||
101 | + OPC_LWC1 = 0x31, | ||
102 | + OPC_LWC2 = 0x32, | ||
103 | + OPC_LDC1 = 0x35, | ||
104 | + OPC_LDC2 = 0x36, | ||
105 | + OPC_SWC1 = 0x39, | ||
106 | + OPC_SWC2 = 0x3A, | ||
107 | + OPC_SDC1 = 0x3D, | ||
108 | + OPC_SDC2 = 0x3E, | ||
109 | + /* Cache and prefetch */ | ||
110 | + OPC_CACHE = 0x2F, | ||
111 | + OPC_PREF = 0x33, | ||
112 | +}; | ||
113 | + | ||
114 | +/* MIPS special opcodes */ | ||
115 | +enum { | ||
116 | + /* Shifts */ | ||
117 | + OPC_SLL = 0x00 | EXT_SPECIAL, | ||
118 | + /* NOP is SLL r0, r0, 0 */ | ||
119 | + /* SSNOP is SLL r0, r0, 1 */ | ||
120 | + OPC_SRL = 0x02 | EXT_SPECIAL, | ||
121 | + OPC_SRA = 0x03 | EXT_SPECIAL, | ||
122 | + OPC_SLLV = 0x04 | EXT_SPECIAL, | ||
123 | + OPC_SRLV = 0x06 | EXT_SPECIAL, | ||
124 | + OPC_SRAV = 0x07 | EXT_SPECIAL, | ||
125 | + /* Multiplication / division */ | ||
126 | + OPC_MULT = 0x18 | EXT_SPECIAL, | ||
127 | + OPC_MULTU = 0x19 | EXT_SPECIAL, | ||
128 | + OPC_DIV = 0x1A | EXT_SPECIAL, | ||
129 | + OPC_DIVU = 0x1B | EXT_SPECIAL, | ||
130 | + /* 2 registers arithmetic / logic */ | ||
131 | + OPC_ADD = 0x20 | EXT_SPECIAL, | ||
132 | + OPC_ADDU = 0x21 | EXT_SPECIAL, | ||
133 | + OPC_SUB = 0x22 | EXT_SPECIAL, | ||
134 | + OPC_SUBU = 0x23 | EXT_SPECIAL, | ||
135 | + OPC_AND = 0x24 | EXT_SPECIAL, | ||
136 | + OPC_OR = 0x25 | EXT_SPECIAL, | ||
137 | + OPC_XOR = 0x26 | EXT_SPECIAL, | ||
138 | + OPC_NOR = 0x27 | EXT_SPECIAL, | ||
139 | + OPC_SLT = 0x2A | EXT_SPECIAL, | ||
140 | + OPC_SLTU = 0x2B | EXT_SPECIAL, | ||
141 | + /* Jumps */ | ||
142 | + OPC_JR = 0x08 | EXT_SPECIAL, | ||
143 | + OPC_JALR = 0x09 | EXT_SPECIAL, | ||
144 | + /* Traps */ | ||
145 | + OPC_TGE = 0x30 | EXT_SPECIAL, | ||
146 | + OPC_TGEU = 0x31 | EXT_SPECIAL, | ||
147 | + OPC_TLT = 0x32 | EXT_SPECIAL, | ||
148 | + OPC_TLTU = 0x33 | EXT_SPECIAL, | ||
149 | + OPC_TEQ = 0x34 | EXT_SPECIAL, | ||
150 | + OPC_TNE = 0x36 | EXT_SPECIAL, | ||
151 | + /* HI / LO registers load & stores */ | ||
152 | + OPC_MFHI = 0x10 | EXT_SPECIAL, | ||
153 | + OPC_MTHI = 0x11 | EXT_SPECIAL, | ||
154 | + OPC_MFLO = 0x12 | EXT_SPECIAL, | ||
155 | + OPC_MTLO = 0x13 | EXT_SPECIAL, | ||
156 | + /* Conditional moves */ | ||
157 | + OPC_MOVZ = 0x0A | EXT_SPECIAL, | ||
158 | + OPC_MOVN = 0x0B | EXT_SPECIAL, | ||
159 | + | ||
160 | + OPC_MOVCI = 0x01 | EXT_SPECIAL, | ||
161 | + | ||
162 | + /* Special */ | ||
163 | + OPC_PMON = 0x05 | EXT_SPECIAL, | ||
164 | + OPC_SYSCALL = 0x0C | EXT_SPECIAL, | ||
165 | + OPC_BREAK = 0x0D | EXT_SPECIAL, | ||
166 | + OPC_SYNC = 0x0F | EXT_SPECIAL, | ||
167 | +}; | ||
168 | + | ||
169 | +enum { | ||
170 | + /* Mutiply & xxx operations */ | ||
171 | + OPC_MADD = 0x00 | EXT_SPECIAL2, | ||
172 | + OPC_MADDU = 0x01 | EXT_SPECIAL2, | ||
173 | + OPC_MUL = 0x02 | EXT_SPECIAL2, | ||
174 | + OPC_MSUB = 0x04 | EXT_SPECIAL2, | ||
175 | + OPC_MSUBU = 0x05 | EXT_SPECIAL2, | ||
176 | + /* Misc */ | ||
177 | + OPC_CLZ = 0x20 | EXT_SPECIAL2, | ||
178 | + OPC_CLO = 0x21 | EXT_SPECIAL2, | ||
179 | + /* Special */ | ||
180 | + OPC_SDBBP = 0x3F | EXT_SPECIAL2, | ||
181 | +}; | ||
182 | + | ||
183 | +/* Branch REGIMM */ | ||
184 | +enum { | ||
185 | + OPC_BLTZ = 0x00 | EXT_REGIMM, | ||
186 | + OPC_BLTZL = 0x02 | EXT_REGIMM, | ||
187 | + OPC_BGEZ = 0x01 | EXT_REGIMM, | ||
188 | + OPC_BGEZL = 0x03 | EXT_REGIMM, | ||
189 | + OPC_BLTZAL = 0x10 | EXT_REGIMM, | ||
190 | + OPC_BLTZALL = 0x12 | EXT_REGIMM, | ||
191 | + OPC_BGEZAL = 0x11 | EXT_REGIMM, | ||
192 | + OPC_BGEZALL = 0x13 | EXT_REGIMM, | ||
193 | + OPC_TGEI = 0x08 | EXT_REGIMM, | ||
194 | + OPC_TGEIU = 0x09 | EXT_REGIMM, | ||
195 | + OPC_TLTI = 0x0A | EXT_REGIMM, | ||
196 | + OPC_TLTIU = 0x0B | EXT_REGIMM, | ||
197 | + OPC_TEQI = 0x0C | EXT_REGIMM, | ||
198 | + OPC_TNEI = 0x0E | EXT_REGIMM, | ||
199 | +}; | ||
200 | + | ||
201 | +enum { | ||
202 | + /* Coprocessor 0 (MMU) */ | ||
203 | + OPC_MFC0 = 0x00 | EXT_CP0, | ||
204 | + OPC_MTC0 = 0x04 | EXT_CP0, | ||
205 | + OPC_TLBR = 0x01 | EXT_CP0, | ||
206 | + OPC_TLBWI = 0x02 | EXT_CP0, | ||
207 | + OPC_TLBWR = 0x06 | EXT_CP0, | ||
208 | + OPC_TLBP = 0x08 | EXT_CP0, | ||
209 | + OPC_ERET = 0x18 | EXT_CP0, | ||
210 | + OPC_DERET = 0x1F | EXT_CP0, | ||
211 | + OPC_WAIT = 0x20 | EXT_CP0, | ||
212 | +}; | ||
213 | + | ||
46 | const unsigned char *regnames[] = | 214 | const unsigned char *regnames[] = |
47 | { "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3", | 215 | { "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3", |
48 | "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", | 216 | "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", |