X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FRuntime.java;h=d6db76d7b4e39f73b70dffb3e9c58f3773019aa7;hp=c501d0dc82246492e50131adf4796838cc2e5cb2;hb=56fb6d1d8da7faf3cc7e73130b11961af7529d13;hpb=7ee9c4231f8e74adfde9679bc60783a715f69c2a diff --git a/src/org/ibex/nestedvm/Runtime.java b/src/org/ibex/nestedvm/Runtime.java index c501d0d..d6db76d 100644 --- a/src/org/ibex/nestedvm/Runtime.java +++ b/src/org/ibex/nestedvm/Runtime.java @@ -9,6 +9,8 @@ import java.io.*; import java.util.Arrays; public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { + public static final String VERSION = "1.0"; + /** True to write useful diagnostic information to stderr when things go wrong */ final static boolean STDERR_DIAG = true; @@ -357,7 +359,8 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { if(page == null) throw new WriteFaultException(a<<2); int index = a&pageWordMask; int n = min(c,pageWords-index); - Arrays.fill(page,index,index+n,fourBytes); + /* Arrays.fill(page,index,index+n,fourBytes);*/ + for(int i=index;isyscall should be the contents of V0 and a, b, c, and d should be the contenst of A0, A1, A2, and A3. The call MAY change the state @see Runtime#state state */ - protected final int syscall(int syscall, int a, int b, int c, int d) { + protected final int syscall(int syscall, int a, int b, int c, int d, int e, int f) { try { - return _syscall(syscall,a,b,c,d); - } catch(ErrnoException e) { - return -e.errno; - } catch(FaultException e) { + int n = _syscall(syscall,a,b,c,d,e,f); + //if(n < 0) System.err.println("syscall: " + syscall + " returned " + n); + return n; + } catch(ErrnoException ex) { + //ex.printStackTrace(); + return -ex.errno; + } catch(FaultException ex) { return -EFAULT; - } catch(RuntimeException e) { - e.printStackTrace(); + } catch(RuntimeException ex) { + ex.printStackTrace(); throw new Error("Internal Error in _syscall()"); } } - int _syscall(int syscall, int a, int b, int c, int d) throws ErrnoException, FaultException { + int _syscall(int syscall, int a, int b, int c, int d, int e, int f) throws ErrnoException, FaultException { switch(syscall) { case SYS_null: return 0; case SYS_exit: return sys_exit(a); @@ -1194,8 +1204,8 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { } public void _close() { - try {is.close(); } catch(IOException e) { /*ignore*/ } - try {os.close(); } catch(IOException e) { /*ignore*/ } + if(is != null) try { is.close(); } catch(IOException e) { /*ignore*/ } + if(os != null) try { os.close(); } catch(IOException e) { /*ignore*/ } } public int read(byte[] a, int off, int length) throws ErrnoException { @@ -1419,6 +1429,13 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { } } + static byte[] getNullTerminatedBytes(String s) { + byte[] buf1 = getBytes(s); + byte[] buf2 = new byte[buf1.length+1]; + System.arraycopy(buf1,0,buf2,0,buf1.length); + return buf2; + } + final static String toHex(int n) { return "0x" + Long.toString(n & 0xffffffffL, 16); } final static int min(int a, int b) { return a < b ? a : b; } final static int max(int a, int b) { return a > b ? a : b; }