X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FRuntime.java;h=bfe1aaba8c3393f582dcd97da78ce458781d1a6c;hp=50b5162a03c3acf679d6a0667c1b97e77e7d2189;hb=ab9be117467f7459965c61e49749b333678b6e4c;hpb=b6be9bcc91cf8e995a0e616a480813cdbef09dc2 diff --git a/src/org/ibex/nestedvm/Runtime.java b/src/org/ibex/nestedvm/Runtime.java index 50b5162..bfe1aab 100644 --- a/src/org/ibex/nestedvm/Runtime.java +++ b/src/org/ibex/nestedvm/Runtime.java @@ -2,13 +2,17 @@ // Based on org.xwt.imp.MIPS by Adam Megacz // Portions Copyright 2003 Adam Megacz +// FEATURE: Add a patch to gcc that enabled -Wall -Werror by default +// FIXME: Get a hotel for IVME :) + package org.ibex.nestedvm; import org.ibex.nestedvm.util.*; 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; @@ -45,10 +49,10 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { /** When the process started */ private long startTime; - /** Text/Data loaded in memory */ - public final static int STOPPED = 0; /** Program is executing instructions */ - public final static int RUNNING = 1; + public final static int RUNNING = 0; // Horrible things will happen if this isn't 0 + /** Text/Data loaded in memory */ + public final static int STOPPED = 1; /** Prgram has been started but is paused */ public final static int PAUSED = 2; /** Program is executing a callJava() method */ @@ -357,7 +361,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;i= 0) throw new ErrnoException(EACCES); return null; @@ -752,8 +755,13 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { /** The open syscall */ private int sys_open(int addr, int flags, int mode) throws ErrnoException, FaultException { + String name = cstring(addr); + + // HACK: TeX, or GPC, or something really sucks + if(name.length() == 1024 && getClass().getName().equals("tests.TeX")) name = name.trim(); + flags &= ~O_NOCTTY; // this is meaningless under nestedvm - FD fd = _open(cstring(addr),flags,mode); + FD fd = _open(name,flags,mode); if(fd == null) return -ENOENT; int fdn = addFD(fd); if(fdn == -1) { fd.close(); return -ENFILE; } @@ -803,12 +811,11 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { } /** The stat/fstat syscall helper */ - // FIXME: Populate uid/gid/nlink int stat(FStat fs, int addr) throws FaultException { memWrite(addr+0,(fs.dev()<<16)|(fs.inode()&0xffff)); // st_dev (top 16), // st_ino (bottom 16) memWrite(addr+4,((fs.type()&0xf000))|(fs.mode()&0xfff)); // st_mode - memWrite(addr+8,1<<16); // st_nlink (top 16) // st_uid (bottom 16) - memWrite(addr+12,0); // st_gid (top 16) // st_rdev (bottom 16) + memWrite(addr+8,fs.nlink()<<16|fs.uid()&0xffff); // st_nlink (top 16) // st_uid (bottom 16) + memWrite(addr+12,fs.gid()<<16|0); // st_gid (top 16) // st_rdev (bottom 16) memWrite(addr+16,fs.size()); // st_size memWrite(addr+20,fs.atime()); // st_atime // memWrite(addr+24,0) // st_spare1 @@ -935,7 +942,7 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { ret = callJavaCB.call(a,b,c,d); } catch(RuntimeException e) { System.err.println("Error while executing callJavaCB"); - e.printStackTrace(); + e.printStackTrace(); ret = 0; } state = RUNNING; @@ -977,7 +984,7 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { for(i=arg;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); @@ -1226,10 +1236,10 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { public TerminalFD(OutputStream os) { this(null,os); } public TerminalFD(InputStream is, OutputStream os) { super(is,os); } public void _close() { /* noop */ } - public FStat _fstat() { return new FStat() { public int type() { return S_IFCHR; } }; } + public FStat _fstat() { return new FStat() { public int type() { return S_IFCHR; } public int mode() { return 0600; } }; } } - // FEATURE: TextInputStream: This is pretty inefficient but it is only used for reading from the console on win32 + // This is pretty inefficient but it is only used for reading from the console on win32 static class TextInputStream extends InputStream { private int pushedBack = -1; private final InputStream parent; @@ -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; }