X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FClassFileCompiler.java;h=0c4dd67a25f78fd1b25f509510fc671181e11ace;hp=0d48aba70bd8e05c535ce793a0cabeca584b3f13;hb=034a42fa65955289442614ef9914e5474fac62aa;hpb=40de2c62cb907622ff6f5fcdbeccc8773a1d7b2d diff --git a/src/org/ibex/nestedvm/ClassFileCompiler.java b/src/org/ibex/nestedvm/ClassFileCompiler.java index 0d48aba..0c4dd67 100644 --- a/src/org/ibex/nestedvm/ClassFileCompiler.java +++ b/src/org/ibex/nestedvm/ClassFileCompiler.java @@ -79,7 +79,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const if(!pruneCases) throw new Exn("-o prunecases MUST be enabled for ClassFileCompiler"); // Class - cl = new ClassGen(fullClassName,runtimeClass,source,ACC_SUPER|ACC_PUBLIC,null); + cl = new ClassGen(fullClassName,runtimeClass,source,ACC_SUPER|ACC_PUBLIC|ACC_FINAL,null); cp = cl.getConstantPool(); fac = new InstructionFactory(cl,cp); @@ -193,43 +193,33 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const throw new Exn("Generation of the trampoline method failed. Try increasing maxInsnPerMethod"); } + addConstReturnMethod("gp",gp.addr); + addConstReturnMethod("entryPoint",elf.header.entry); + addConstReturnMethod("heapStart",highestAddr); + + if(userInfo != null) { + addConstReturnMethod("userInfoBase",userInfo.addr); + addConstReturnMethod("userInfoSize",userInfo.size); + } + + // FEATURE: Allow specification of memory size at runtime (numpages) + // Constructor MethodGen init = newMethod(ACC_PUBLIC,Type.VOID, Type.NO_ARGS, ""); selectMethod(init); - // Constructor a(InstructionConstants.ALOAD_0); pushConst(pageSize); pushConst(totalPages); - pushConst(fastMem ? 0 : 1); - a(fac.createInvoke(runtimeClass,"",Type.VOID,new Type[]{Type.INT,Type.INT,Type.BOOLEAN},INVOKESPECIAL)); - a(InstructionConstants.ALOAD_0); - pushConst(gp.addr); - a(fac.createFieldAccess(fullClassName,"gp",Type.INT, PUTFIELD)); + a(fac.createInvoke(runtimeClass,"",Type.VOID,new Type[]{Type.INT,Type.INT},INVOKESPECIAL)); - a(InstructionConstants.ALOAD_0); - pushConst(elf.header.entry); - a(fac.createFieldAccess(fullClassName,"entryPoint",Type.INT, PUTFIELD)); - - a(InstructionConstants.ALOAD_0); - pushConst(onePage ? ((highestAddr+4095)&~4095) : ((highestAddr+pageSize-1)&~(pageSize-1))); - a(fac.createFieldAccess(fullClassName,"brkAddr",Type.INT, PUTFIELD)); - - if(userInfo != null) { - a(InstructionConstants.ALOAD_0); - pushConst(userInfo.addr); - a(fac.createFieldAccess(fullClassName,"userInfoBase",Type.INT, PUTFIELD)); - a(InstructionConstants.ALOAD_0); - pushConst(userInfo.size); - a(fac.createFieldAccess(fullClassName,"userInfoSize",Type.INT, PUTFIELD)); - } a(initExtras); - a(InstructionConstants.ALOAD_0); - pushConst(Runtime.INITIALIZED); - a(fac.createFieldAccess(fullClassName,"state",Type.INT, PUTFIELD)); + a(InstructionConstants.RETURN); + init.setMaxLocals(); init.setMaxStack(); cl.addMethod(init.getMethod()); + MethodGen clinit = newMethod(ACC_PRIVATE|ACC_STATIC,Type.VOID, Type.NO_ARGS, ""); selectMethod(clinit); a(clinitExtras); @@ -318,18 +308,14 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const a(InstructionConstants.ALOAD_1); a(fac.createFieldAccess("org.ibex.nestedvm.Runtime$CPUState","pc",Type.INT,GETFIELD)); a(fac.createFieldAccess(fullClassName,"pc",Type.INT, PUTFIELD)); + a(InstructionConstants.RETURN); setCPUState.setMaxLocals(); setCPUState.setMaxStack(); cl.addMethod(setCPUState.getMethod()); - MethodGen getCPUState = newMethod(ACC_PROTECTED,Type.getType("Lorg/ibex/nestedvm/Runtime$CPUState;"),Type.NO_ARGS,"getCPUState"); + MethodGen getCPUState = newMethod(ACC_PROTECTED,Type.VOID,new Type[]{Type.getType("Lorg/ibex/nestedvm/Runtime$CPUState;")},"getCPUState"); selectMethod(getCPUState); - a(fac.createNew("org.ibex.nestedvm.Runtime$CPUState")); - a(InstructionConstants.DUP); - a(fac.createInvoke("org.ibex.nestedvm.Runtime$CPUState","",Type.VOID,Type.NO_ARGS,INVOKESPECIAL)); - a(InstructionConstants.ASTORE_1); - a(InstructionConstants.ALOAD_1); a(fac.createFieldAccess("org.ibex.nestedvm.Runtime$CPUState","r",new ArrayType(Type.INT,1),GETFIELD)); a(InstructionConstants.ASTORE_2); @@ -368,13 +354,13 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const a(fac.createFieldAccess(fullClassName,"pc",Type.INT, GETFIELD)); a(fac.createFieldAccess("org.ibex.nestedvm.Runtime$CPUState","pc",Type.INT,PUTFIELD)); - a(InstructionConstants.ALOAD_1); - a(InstructionConstants.ARETURN); + a(InstructionConstants.RETURN); getCPUState.setMaxLocals(); getCPUState.setMaxStack(); cl.addMethod(getCPUState.getMethod()); + // FEATURE: Catch RuntimeException and turn it into a fault exception MethodGen execute = newMethod(ACC_PROTECTED,Type.VOID,Type.NO_ARGS,"_execute"); selectMethod(execute); a(InstructionConstants.ALOAD_0); @@ -392,7 +378,12 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const a(fac.createInvoke(fullClassName,"",Type.VOID,Type.NO_ARGS,INVOKESPECIAL)); a(new PUSH(cp,fullClassName)); a(InstructionConstants.ALOAD_0); - a(fac.createInvoke(fullClassName,"run",Type.INT,new Type[]{Type.STRING,new ArrayType(Type.STRING,1)},INVOKEVIRTUAL)); + if(unixRuntime) + a(fac.createInvoke("org.ibex.nestedvm.UnixRuntime","runAndExec",Type.INT, + new Type[]{Type.getType("Lorg/ibex/nestedvm/UnixRuntime;"),Type.STRING,new ArrayType(Type.STRING,1)}, + INVOKESTATIC)); + else + a(fac.createInvoke(fullClassName,"run",Type.INT,new Type[]{Type.STRING,new ArrayType(Type.STRING,1)},INVOKEVIRTUAL)); a(fac.createInvoke("java.lang.System","exit",Type.VOID,new Type[]{Type.INT},INVOKESTATIC)); a(InstructionConstants.RETURN); main.setMaxLocals(); @@ -401,6 +392,16 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const cl.getJavaClass().dump(os); } + + private void addConstReturnMethod(String name, int val) { + MethodGen method = newMethod(ACC_PROTECTED,Type.INT, Type.NO_ARGS,name); + selectMethod(method); + pushConst(val); + a(InstructionConstants.IRETURN); + method.setMaxLocals(); + method.setMaxStack(); + cl.addMethod(method.getMethod()); + } private static int initDataCount; private void emitData(int addr, DataInputStream dis, int size, boolean readOnly) throws Exn,IOException {