summaryrefslogtreecommitdiff
path: root/arch/sparc/isa/decoder.isa
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc/isa/decoder.isa')
-rw-r--r--arch/sparc/isa/decoder.isa18
1 files changed, 16 insertions, 2 deletions
diff --git a/arch/sparc/isa/decoder.isa b/arch/sparc/isa/decoder.isa
index eaf3aab3b..716653d84 100644
--- a/arch/sparc/isa/decoder.isa
+++ b/arch/sparc/isa/decoder.isa
@@ -532,12 +532,26 @@ decode OP default Trap::unknown({{IllegalInstruction}}) {
case 1: case 3:
throw illegal_instruction;
case 0:
+#if FULL_SYSTEM
+ throw trap_instruction;
+#else
if(passesCondition(xc->regs.MiscRegs.ccrFields.icc, machInst<25:28>))
- throw trap_instruction;
+ // At least glibc only uses trap 0,
+ // solaris/sunos may use others
+ assert((I ? Rs1 + Rs2 : Rs1 + SW_TRAP) == 0);
+ xc->syscall();
+#endif
break;
case 2:
+#if FULL_SYSTEM
+ throw trap_instruction;
+#else
if(passesCondition(xc->regs.MiscRegs.ccrFields.xcc, machInst<25:28>))
- throw trap_instruction;
+ // At least glibc only uses trap 0,
+ // solaris/sunos may use others
+ assert((I ? Rs1 + Rs2 : Rs1 + SW_TRAP) == 0);
+ xc->syscall();
+#endif
break;
}
}}); //Tcc