* [Qemu-devel] [PATCH][SPARC] RDASR and WRASR instructions on SPARCv8
@ 2007-04-01 0:14 Aurelien Jarno
0 siblings, 0 replies; only message in thread
From: Aurelien Jarno @ 2007-04-01 0:14 UTC (permalink / raw)
To: qemu-devel
Hi all,
The SPARCv8 RDASR and WRASR instructions currently generate an
illegal_instruction trap for rs1 != 0, whereas the SPARCv8
manual explicitely says that an rs1 value of 1...14 in an RDASR
instruction produces undefined results, but does not cause an
illegal_instruction trap. The same applies for WRASR.
The patch below fixes the current implementation by doing the
same thing as the microSPARC II CPU, ie reading the y register
in all cases for the RDASR instruction, and doing a NOP when
rs1 != 0 for the WRASR instruction.
Bye,
Aurelien
Index: target-sparc/translate.c
===================================================================
RCS file: /sources/qemu/qemu/target-sparc/translate.c,v
retrieving revision 1.38
diff -u -d -p -r1.38 translate.c
--- target-sparc/translate.c 25 Mar 2007 07:55:52 -0000 1.38
+++ target-sparc/translate.c 31 Mar 2007 23:52:18 -0000
@@ -1130,11 +1130,14 @@ static void disas_sparc_insn(DisasContex
rs1 = GET_FIELD(insn, 13, 17);
switch(rs1) {
case 0: /* rdy */
+#ifndef TARGET_SPARC64
+ case 0x01 ... 0x0e: /* undefined in the SPARCv8 manual, rdy on the microSPARC II */
+ case 0x0f: /* stbar in the SPARCv8 manual, rdy on the microSPARC II */
+ case 0x10 ... 0x1f: /* implementation-dependent in the SPARCv8 manual, rdy on the microSPARC II */
+#endif
gen_op_movtl_T0_env(offsetof(CPUSPARCState, y));
gen_movl_T0_reg(rd);
break;
- case 15: /* stbar / V9 membar */
- break; /* no effect? */
#ifdef TARGET_SPARC64
case 0x2: /* V9 rdccr */
gen_op_rdccr();
@@ -1160,6 +1163,8 @@ static void disas_sparc_insn(DisasContex
gen_op_movl_T0_env(offsetof(CPUSPARCState, fprs));
gen_movl_T0_reg(rd);
break;
+ case 0xf: /* V9 membar */
+ break; /* no effect */
case 0x13: /* Graphics Status */
if (gen_trap_ifnofpu(dc))
goto jmp_insn;
@@ -1879,7 +1887,11 @@ static void disas_sparc_insn(DisasContex
gen_op_xor_T1_T0();
gen_op_movtl_env_T0(offsetof(CPUSPARCState, y));
break;
-#ifdef TARGET_SPARC64
+#ifndef TARGET_SPARC64
+ case 0x01 ... 0x0f: /* undefined in the SPARCv8 manual, nop on the microSPARC II */
+ case 0x10 ... 0x1f: /* implementation-dependent in the SPARCv8 manual, nop on the microSPARC II */
+ break;
+#else
case 0x2: /* V9 wrccr */
gen_op_wrccr();
break;
--
.''`. Aurelien Jarno | GPG: 1024D/F1BCDB73
: :' : Debian developer | Electrical Engineer
`. `' aurel32@debian.org | aurelien@aurel32.net
`- people.debian.org/~aurel32 | www.aurel32.net
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-04-01 0:17 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-01 0:14 [Qemu-devel] [PATCH][SPARC] RDASR and WRASR instructions on SPARCv8 Aurelien Jarno
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).