X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FRuntime.java;h=0c40bc9a21259ff16e7447d69039ed21b5c092ec;hp=a54fbc20e785ee8ce45955888ed57f085499a468;hb=7a9bc0ba0fd215bd5b9a2e370937d81870aadba5;hpb=095d6d46361db8b4b69790305c0310ea114d3813
diff --git a/src/org/ibex/nestedvm/Runtime.java b/src/org/ibex/nestedvm/Runtime.java
index a54fbc2..0c40bc9 100644
--- a/src/org/ibex/nestedvm/Runtime.java
+++ b/src/org/ibex/nestedvm/Runtime.java
@@ -70,8 +70,8 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
public ExecutionException exitException;
/** Table containing all open file descriptors. (Entries are null if the fd is not in use */
- FD[] fds = new FD[OPEN_MAX]; // package-private for UnixRuntime
- boolean closeOnExec[] = new boolean[OPEN_MAX];
+ FD[] fds; // package-private for UnixRuntime
+ boolean closeOnExec[];
/** Pointer to a SecurityManager for this process */
SecurityManager sm;
@@ -102,6 +102,16 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
/** Subclasses should set the CPUState to the state held in state */
protected abstract void setCPUState(CPUState state);
+ /** True to enabled a few hacks to better support the win32 console */
+ final static boolean win32Hacks;
+
+ static {
+ String os = Platform.getProperty("os.name");
+ String prop = Platform.getProperty("nestedvm.win32hacks");
+ if(prop != null) { win32Hacks = Boolean.valueOf(prop).booleanValue(); }
+ else { win32Hacks = os != null && os.toLowerCase().indexOf("windows") != -1; }
+ }
+
protected Object clone() throws CloneNotSupportedException {
Runtime r = (Runtime) super.clone();
r._byteBuf = null;
@@ -119,7 +129,8 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
return r;
}
- protected Runtime(int pageSize, int totalPages) {
+ protected Runtime(int pageSize, int totalPages) { this(pageSize, totalPages,false); }
+ protected Runtime(int pageSize, int totalPages, boolean exec) {
if(pageSize <= 0) throw new IllegalArgumentException("pageSize <= 0");
if(totalPages <= 0) throw new IllegalArgumentException("totalPages <= 0");
if((pageSize&(pageSize-1)) != 0) throw new IllegalArgumentException("pageSize not a power of two");
@@ -157,11 +168,16 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
readPages[i] = writePages[i] = new int[pageSize>>2];
}
}
-
- InputStream stdin = Boolean.valueOf(Platform.getProperty("nestedvm.textstdin")).booleanValue() ? new TextInputStream(System.in) : System.in;
- addFD(new TerminalFD(stdin));
- addFD(new TerminalFD(System.out));
- addFD(new TerminalFD(System.err));
+
+ if(!exec) {
+ fds = new FD[OPEN_MAX];
+ closeOnExec = new boolean[OPEN_MAX];
+
+ InputStream stdin = win32Hacks ? new Win32ConsoleIS(System.in) : System.in;
+ addFD(new TerminalFD(stdin));
+ addFD(new TerminalFD(System.out));
+ addFD(new TerminalFD(System.err));
+ }
}
/** Copy everything from src to addr initializing uninitialized pages if required.
@@ -481,17 +497,16 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
}
/** Calls _execute() (subclass's execute()) and catches exceptions */
- // FEATURE: Have these call kill() so we get a pretty message to stdout
private void __execute() {
try {
_execute();
} catch(FaultException e) {
if(STDERR_DIAG) e.printStackTrace();
- sys_exit(128+11); // SIGSEGV
+ exit(128+11,true); // SIGSEGV
exitException = e;
} catch(ExecutionException e) {
if(STDERR_DIAG) e.printStackTrace();
- sys_exit(128+4); // SIGILL
+ exit(128+4,true); // SIGILL
exitException = e;
}
}
@@ -960,11 +975,21 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
/** Hook for subclasses to do something when the process exits */
void _exited() { }
- private int sys_exit(int status) {
+ void exit(int status, boolean fromSignal) {
+ if(fromSignal && fds[2] != null) {
+ try {
+ byte[] msg = getBytes("Process exited on signal " + (status - 128));
+ fds[2].write(msg,0,msg.length);
+ } catch(ErrnoException e) { }
+ }
exitStatus = status;
for(int i=0;i