Commit b48cfdffd9f15432355c8e4ed9d2781eab9e4358
1 parent
2423f660
Throw RI for invalid MFMC0-class instructions. Introduce optional
MIPS_STRICT_STANDARD define to adhere more to the spec than it makes sense in normal operation. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2650 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
18 additions
and
3 deletions
target-mips/mips-defs.h
| ... | ... | @@ -19,4 +19,9 @@ |
| 19 | 19 | #define TARGET_LONG_BITS 32 |
| 20 | 20 | #endif |
| 21 | 21 | |
| 22 | +/* Strictly follow the architecture standard: Disallow "special" | |
| 23 | + instruction handling for PMON/SPIM, force cycle-dependent | |
| 24 | + Count/Compare maintenance. */ | |
| 25 | +//#define MIPS_STRICT_STANDARD 1 | |
| 26 | + | |
| 22 | 27 | #endif /* !defined (__QEMU_MIPS_DEFS_H__) */ | ... | ... |
target-mips/translate.c
| ... | ... | @@ -305,7 +305,7 @@ enum { |
| 305 | 305 | }; |
| 306 | 306 | |
| 307 | 307 | /* MFMC0 opcodes */ |
| 308 | -#define MASK_MFMC0(op) MASK_CP0(op) | (op & ((0x0C << 11) | (1 << 5))) | |
| 308 | +#define MASK_MFMC0(op) MASK_CP0(op) | (op & 0xFFFF) | |
| 309 | 309 | |
| 310 | 310 | enum { |
| 311 | 311 | OPC_DI = (0 << 5) | (0x0C << 11) | OPC_MFMC0, |
| ... | ... | @@ -4715,8 +4715,13 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
| 4715 | 4715 | case OPC_MTLO: /* Move to HI/LO */ |
| 4716 | 4716 | gen_HILO(ctx, op1, rs); |
| 4717 | 4717 | break; |
| 4718 | - case OPC_PMON: /* Pmon entry point */ | |
| 4718 | + case OPC_PMON: /* Pmon entry point, also R4010 selsl */ | |
| 4719 | +#ifdef MIPS_STRICT_STANDARD | |
| 4720 | + MIPS_INVAL("PMON / selsl"); | |
| 4721 | + generate_exception(ctx, EXCP_RI); | |
| 4722 | +#else | |
| 4719 | 4723 | gen_op_pmon(sa); |
| 4724 | +#endif | |
| 4720 | 4725 | break; |
| 4721 | 4726 | case OPC_SYSCALL: |
| 4722 | 4727 | generate_exception(ctx, EXCP_SYSCALL); |
| ... | ... | @@ -4724,10 +4729,15 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
| 4724 | 4729 | case OPC_BREAK: |
| 4725 | 4730 | generate_exception(ctx, EXCP_BREAK); |
| 4726 | 4731 | break; |
| 4727 | - case OPC_SPIM: /* SPIM ? */ | |
| 4732 | + case OPC_SPIM: | |
| 4733 | +#ifdef MIPS_STRICT_STANDARD | |
| 4734 | + MIPS_INVAL("SPIM"); | |
| 4735 | + generate_exception(ctx, EXCP_RI); | |
| 4736 | +#else | |
| 4728 | 4737 | /* Implemented as RI exception for now. */ |
| 4729 | 4738 | MIPS_INVAL("spim (unofficial)"); |
| 4730 | 4739 | generate_exception(ctx, EXCP_RI); |
| 4740 | +#endif | |
| 4731 | 4741 | break; |
| 4732 | 4742 | case OPC_SYNC: |
| 4733 | 4743 | /* Treat as a noop. */ | ... | ... |