From b0705e54abd8620ad5f82370e4daef2245a73ac5 Mon Sep 17 00:00:00 2001 From: Serge Vakulenko Date: Thu, 15 May 2014 10:48:33 -0700 Subject: [PATCH] Virtualmips modified to allow access to SRSCtl register. When only one GPR set supported, opcodes RDPGPR and WRPGPR behave like MOVE instruction. --- tools/virtualmips/mips_codetable.c | 6 ++++-- tools/virtualmips/mips_cp0.c | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/virtualmips/mips_codetable.c b/tools/virtualmips/mips_codetable.c index e3599af..e9d6077 100644 --- a/tools/virtualmips/mips_codetable.c +++ b/tools/virtualmips/mips_codetable.c @@ -1684,7 +1684,8 @@ static int rdpgpr_op (cpu_mips_t * cpu, mips_insn_t insn) int rt = bits (insn, 16, 20); int rd = bits (insn, 11, 15); - printf ("%08x: unsupported RDPGPR $%u,$%u instruction.\n", cpu->pc, rd, rt); + /* Only one GPR set supported: RDPGPR works as move. */ + cpu->reg_set (cpu, rd, cpu->gpr[rt]); return (0); } @@ -1693,7 +1694,8 @@ static int wrpgpr_op (cpu_mips_t * cpu, mips_insn_t insn) int rt = bits (insn, 16, 20); int rd = bits (insn, 11, 15); - printf ("%08x: unsupported WRPGPR $%u,$%u instruction.\n", cpu->pc, rd, rt); + /* Only one GPR set supported: WRPGPR works as move. */ + cpu->reg_set (cpu, rd, cpu->gpr[rt]); return (0); } diff --git a/tools/virtualmips/mips_cp0.c b/tools/virtualmips/mips_cp0.c index 4b0f1c5..81eb04c 100644 --- a/tools/virtualmips/mips_cp0.c +++ b/tools/virtualmips/mips_cp0.c @@ -93,6 +93,8 @@ unimpl: fprintf (stderr, return cp0->reg[cp0_reg]; case 1: /* IntCtl */ return cp0->intctl_reg; + case 2: /* SRSCtl */ + return 0; } goto unimpl; @@ -172,6 +174,8 @@ void mips_cp0_set_reg (cpu_mips_t * cpu, u_int cp0_reg, u_int sel, case 1: /* IntCtl */ cp0->intctl_reg = val; break; + case 2: /* SRSCtl */ + break; default: goto unimpl; }