X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FInterpreter.java;h=2e8252f640a79397b6dee2abdd93686c04630eb0;hp=1fcdc4badcaaefb516a6fdc225067ee82db05664;hb=b11e7c6c29f2b5f7b0828bf93eb741c4a30ec411;hpb=3efa407f6606052b91cec5c98fab3f0a0a733b37 diff --git a/src/org/ibex/nestedvm/Interpreter.java b/src/org/ibex/nestedvm/Interpreter.java index 1fcdc4b..2e8252f 100644 --- a/src/org/ibex/nestedvm/Interpreter.java +++ b/src/org/ibex/nestedvm/Interpreter.java @@ -1,3 +1,7 @@ +// Copyright 2000-2005 the Contributors, as shown in the revision logs. +// Licensed under the Apache License 2.0 ("the License"). +// You may not use this file except in compliance with the License. + // Copyright 2003 Brian Alliet // Based on org.xwt.imp.MIPS by Adam Megacz // Portions Copyright 2003 Adam Megacz @@ -7,7 +11,7 @@ package org.ibex.nestedvm; import org.ibex.nestedvm.util.*; import java.io.*; -public class Interpreter extends UnixRuntime { +public class Interpreter extends UnixRuntime implements Cloneable { // Registers private int[] registers = new int[32]; private int hi,lo; @@ -51,6 +55,13 @@ public class Interpreter extends UnixRuntime { } } + protected Object clone() throws CloneNotSupportedException { + Interpreter r = (Interpreter) super.clone(); + r.registers = (int[]) registers.clone(); + r.fpregs = (int[]) fpregs.clone(); + return r; + } + // Main interpretor // the return value is meaningless, its just to catch people typing "return" by accident private final int runSome() throws FaultException,ExecutionException { @@ -87,7 +98,7 @@ public class Interpreter extends UnixRuntime { int tmp, addr; // temporaries r[ZERO] = 0; - + switch(op) { case 0: { switch(subcode) { @@ -118,7 +129,7 @@ public class Interpreter extends UnixRuntime { continue OUTER; case 12: // SYSCALL this.pc = pc; - r[V0] = syscall(r[V0],r[A0],r[A1],r[A2],r[A3]); + r[V0] = syscall(r[V0],r[A0],r[A1],r[A2],r[A3],r[T0],r[T1]); if(state != RUNNING) { this.pc = nextPC; break OUTER; } break; case 13: // BREAK @@ -136,7 +147,7 @@ public class Interpreter extends UnixRuntime { lo = r[rs]; break; case 24: { // MULT - long hilo = (long)(r[rs]) * ((long)r[rt]); + long hilo = ((long)r[rs]) * ((long)r[rt]); hi = (int) (hilo >>> 32); lo = (int) hilo; break; @@ -356,6 +367,9 @@ public class Interpreter extends UnixRuntime { case 60: // C.LT.S setFC(getFloat(fs) < getFloat(ft)); break; + case 62: // C.LE.S + setFC(getFloat(fs) <= getFloat(ft)); + break; default: throw new ExecutionException("Invalid Instruction 17/" + rs + "/" + subcode + " at " + sourceLine(pc)); } break; @@ -415,6 +429,9 @@ public class Interpreter extends UnixRuntime { } case 20: { // Integer switch(subcode) { + case 32: // CVT.S.W + setFloat(fd,f[fs]); + break; case 33: // CVT.D.W setDouble(fd,f[fs]); break; @@ -453,9 +470,10 @@ public class Interpreter extends UnixRuntime { } catch(RuntimeException e) { tmp = memRead(addr&~3); } - switch(addr&2) { + switch(addr&3) { case 0: tmp = (tmp>>>16)&0xffff; break; case 2: tmp = (tmp>>> 0)&0xffff; break; + default: throw new ReadFaultException(addr); } if((tmp&0x8000)!=0) tmp |= 0xffff0000; // sign extend r[rt] = tmp; @@ -506,9 +524,10 @@ public class Interpreter extends UnixRuntime { } catch(RuntimeException e) { tmp = memRead(addr&~3); } - switch(addr&2) { + switch(addr&3) { case 0: r[rt] = (tmp>>>16)&0xffff; break; case 2: r[rt] = (tmp>>> 0)&0xffff; break; + default: throw new ReadFaultException(addr); } break; } @@ -554,9 +573,10 @@ public class Interpreter extends UnixRuntime { } catch(RuntimeException e) { tmp = memRead(addr&~3); } - switch(addr&2) { + switch(addr&3) { case 0: tmp = (tmp&0x0000ffff) | ((r[rt]&0xffff)<<16); break; case 2: tmp = (tmp&0xffff0000) | ((r[rt]&0xffff)<< 0); break; + default: throw new WriteFaultException(addr); } try { writePages[addr>>>pageShift][(addr>>>2)&(PAGE_WORDS-1)] = tmp; @@ -652,9 +672,9 @@ public class Interpreter extends UnixRuntime { ELF elf = new ELF(data); symtab = elf.getSymtab(); - if(elf.header.type != ELF.ELFHeader.ET_EXEC) throw new IOException("Binary is not an executable"); - if(elf.header.machine != ELF.ELFHeader.EM_MIPS) throw new IOException("Binary is not for the MIPS I Architecture"); - if(elf.ident.data != ELF.ELFIdent.ELFDATA2MSB) throw new IOException("Binary is not big endian"); + if(elf.header.type != ELF.ET_EXEC) throw new IOException("Binary is not an executable"); + if(elf.header.machine != ELF.EM_MIPS) throw new IOException("Binary is not for the MIPS I Architecture"); + if(elf.ident.data != ELF.ELFDATA2MSB) throw new IOException("Binary is not big endian"); entryPoint = elf.header.entry; @@ -674,7 +694,7 @@ public class Interpreter extends UnixRuntime { int pageWords = (1<> 2; for(int i=0;i