- ELF.PHeader[] pheaders = elf.pheaders;
-
- int[][] readPages = new int[TOTAL_PAGES][];
- int[][] writePages = new int[TOTAL_PAGES][];
- for(int i=0; i<STACK_PAGES; i++)
- readPages[TOTAL_PAGES-1-i] = writePages[TOTAL_PAGES-1-i] = emptyPage;
-
- // FIXME: what is this?
- int brk = 0;
- for(int i=0;i<pheaders.length;i++) {
- ELF.PHeader ph = pheaders[i];
- if(ph.type != ELF.PHeader.PT_LOAD) continue;
- int memsize = ph.memsz;
- int filesize = ph.filesz;
- if(memsize == 0) continue;
- if(memsize < 0) throw new IOException("pheader size too large");
- int addr = ph.vaddr;
- if(addr == 0x0) throw new IOException("pheader vaddr == 0x0");
- if(addr+memsize >= (brk<<PAGE_SHIFT)) brk = (addr+memsize+PAGE_SIZE-1) >> PAGE_SHIFT;
- // FIXME: set memsize, serialize readPages/writePages
- for(int j=0;j<memsize+PAGE_SIZE-1;j+=PAGE_SIZE) {
- int page = (j+addr) >>> PAGE_SHIFT;
- if(readPages[page] == null) readPages[page] = new int[PAGE_WORDS];
- if(ph.writable()) writePages[page] = readPages[page];
+ p("// This file was generated by MipsToJava");
+ if (packageName != null) p("package " + packageName + ";");
+ p("public class " + className + " extends Runtime {");
+ p("");
+ p(" // program counter");
+ p(" private int pc = 0;");
+ if(debugCompiler)
+ p(" private int lastPC = 0;");
+ p("");
+ p(" // General Purpose registers");
+ p(" private final static int r0 = 0;");
+ p(" int r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0, r7 = 0,");
+ p(" r8 = 0, r9 = 0, r10 = 0, r11 = 0, r12 = 0, r13 = 0, r14 = 0, r15 = 0,");
+ p(" r16 = 0, r17 = 0, r18 = 0, r19 = 0, r20 = 0, r21 = 0, r22 = 0, r23 = 0,");
+ p(" r24 = 0, r25 = 0, r26 = 0, r27 = 0, r28 = 0, r29 = 0, r30 = 0, r31 = 0,");
+ p(" hi = 0, lo = 0;");
+ p(" // FP registers");
+ p(" private int f0 = 0, f1 = 0, f2 = 0, f3 = 0, f4 = 0, f5 = 0, f6 = 0, f7 = 0,");
+ p(" f8 = 0, f9 = 0, f10 = 0, f11 = 0, f12 = 0, f13 = 0, f14 = 0, f15 = 0,");
+ p(" f16 = 0, f17 = 0, f18 = 0, f19 = 0, f20 = 0, f21 = 0, f22 = 0, f23 = 0,");
+ p(" f24 = 0, f25 = 0, f26 = 0, f27 = 0, f28 = 0, f29 = 0, f30 = 0, f31 = 0;");
+ p(" // FP Control Register");
+ p(" private int fcsr = 0;");
+ p("");
+ indent++;
+ // These should all be inlind by javac
+ p("private final void setFC(boolean b) { fcsr = (fcsr&~0x800000) | (b ? 0x800000 : 0x000000); }");
+ p("private final int roundingMode() { return fcsr & 3; /* bits 0-1 */ }");
+ indent--;
+
+ Set jumpableAddresses = null;
+ if(pruneCases) {
+ // Find all possible branches
+ jumpableAddresses = new HashSet();
+
+ jumpableAddresses.add(new Integer(elf.header.entry));
+
+ ELF.SHeader text = elf.sectionWithName(".text");
+ if(text == null) throw new Error("No .text segment");
+ findBranchesInText(text.addr,new DataInputStream(text.getInputStream()),text.size,jumpableAddresses);
+
+ findBranchesInSymtab(elf.getSymtab(),jumpableAddresses);
+
+ for(int i=0;i<elf.sheaders.length;i++) {
+ ELF.SHeader sheader = elf.sheaders[i];
+ String name = sheader.name;
+ // if this section doesn't get loaded into our address space don't worry about it
+ if(sheader.addr == 0x0) continue;
+ if(name.equals(".data") || name.equals(".sdata") || name.equals(".rodata") || name.equals(".ctors") || name.equals(".dtors"))
+ findBranchesInData(new DataInputStream(sheader.getInputStream()),sheader.size,jumpableAddresses,text.addr,text.addr+text.size);