--- /dev/null 2006-07-28 20:41:40.430451000 +0800 +++ frysk-core/frysk/proc/IsaPPC.java 2006-07-31 16:55:18.000000000 +0800 @@ -0,0 +1,94 @@ +// This file is part of the program FRYSK. + +package frysk.proc; + +import java.util.Iterator; +import java.util.LinkedHashMap; + +import inua.eio.ByteOrder; + +class IsaPPC + implements Isa +{ + static class PPCRegister + extends Register + { + PPCRegister (String name, int wordOffset) + { + super (0, wordOffset * 4, 4, name); + } + } + + private static PPCRegister[] gprs () + { + PPCRegister[] gprs = new PPCRegister[32]; + for (int i = 0; i < gprs.length; i++) + { + gprs[i] = new PPCRegister ("gpr" + i, i); + } + return gprs; + } + + private static final PPCRegister[] gpr = gprs(); + + private static final PPCRegister nip = new PPCRegister("nip", 32); + private static final PPCRegister msr = new PPCRegister("msr", 33); + private static final PPCRegister orig_r3 = new PPCRegister("orig_r3", 34); + private static final PPCRegister ctr = new PPCRegister("ctr", 35); + private static final PPCRegister lnk = new PPCRegister("lnk", 36); + private static final PPCRegister xer = new PPCRegister("xer", 37); + private static final PPCRegister ccr = new PPCRegister("ccr", 38); + private static final PPCRegister mq = new PPCRegister("mq", 39); + private static final PPCRegister trap = new PPCRegister("trap", 40); + private static final PPCRegister dar = new PPCRegister("dar", 41); + private static final PPCRegister dsisr = new PPCRegister("dsisr", 42); + private static final PPCRegister result = new PPCRegister("result", 43); + + private LinkedHashMap registerMap = new LinkedHashMap (); + + IsaPPC () + { + for (int i = 0; i < gpr.length; i++) + { + registerMap.put (gpr[i].name, gpr[i]); + } + + registerMap.put(nip.name, nip); + registerMap.put(msr.name, msr); + registerMap.put(orig_r3.name, orig_r3); + registerMap.put(ctr.name, ctr); + registerMap.put(lnk.name, lnk); + registerMap.put(xer.name, xer); + registerMap.put(ccr.name, ccr); + registerMap.put(mq.name, mq); + registerMap.put(trap.name, trap); + registerMap.put(dar.name, dar); + registerMap.put(dsisr.name, dsisr); + registerMap.put(result.name, result); + } + + public Iterator RegisterIterator () + { + return registerMap.values().iterator(); + } + + public Register getRegisterByName (String name) + { + return (Register)registerMap.get(name); + } + + public long pc (Task task) + { + return getRegisterByName("nip").get(task); + } + + public int getWordSize () + { + return 4; + } + + public ByteOrder getByteOrder () + { + return ByteOrder.BIG_ENDIAN; + } +} --- /dev/null 2006-07-28 20:41:40.430451000 +0800 +++ frysk-core/frysk/proc/IsaPPC64.java 2006-07-31 16:35:18.000000000 +0800 @@ -0,0 +1,94 @@ +// This file is part of the program FRYSK. + +package frysk.proc; + +import java.util.Iterator; +import java.util.LinkedHashMap; + +import inua.eio.ByteOrder; + +class IsaPPC64 + implements Isa +{ + static class PPC64Register + extends Register + { + PPC64Register(String name, int wordOffset) + { + super (0, wordOffset * 8, 8, name); + } + } + + private static PPC64Register[] gprs() + { + PPC64Register[] gprs = new PPC64Register[32]; + for (int i = 0; i < gprs.length; i++) + { + gprs[i] = new PPC64Register ("gpr" + i, i); + } + return gprs; + } + + private static final PPC64Register[] gpr = gprs(); + + private static final PPC64Register nip = new PPC64Register("nip", 32); + private static final PPC64Register msr = new PPC64Register("msr", 33); + private static final PPC64Register orig_r3 = new PPC64Register("orig_r3", 34); + private static final PPC64Register ctr = new PPC64Register("ctr", 35); + private static final PPC64Register lnk = new PPC64Register("lnk", 36); + private static final PPC64Register xer = new PPC64Register("xer", 37); + private static final PPC64Register ccr = new PPC64Register("ccr", 38); + private static final PPC64Register mq = new PPC64Register("mq", 39); + private static final PPC64Register trap = new PPC64Register("trap", 40); + private static final PPC64Register dar = new PPC64Register("dar", 41); + private static final PPC64Register dsisr = new PPC64Register("dsisr", 42); + private static final PPC64Register result = new PPC64Register("result", 43); + + private LinkedHashMap registerMap = new LinkedHashMap(); + + IsaPPC64() + { + for (int i = 0; i < gpr.length; i++) + { + registerMap.put (gpr[i].name, gpr[i]); + } + + registerMap.put(nip.name, nip); + registerMap.put(msr.name, msr); + registerMap.put(orig_r3.name, orig_r3); + registerMap.put(ctr.name, ctr); + registerMap.put(lnk.name, lnk); + registerMap.put(xer.name, xer); + registerMap.put(ccr.name, ccr); + registerMap.put(mq.name, mq); + registerMap.put(trap.name, trap); + registerMap.put(dar.name, dar); + registerMap.put(dsisr.name, dsisr); + registerMap.put(result.name, result); + } + + public Iterator RegisterIterator () + { + return registerMap.values().iterator(); + } + + public Register getRegisterByName (String name) + { + return (Register)registerMap.get(name); + } + + public long pc (Task task) + { + return getRegisterByName("nip").get(task); + } + + public int getWordSize () + { + return 4; + } + + public ByteOrder getByteOrder () + { + return ByteOrder.BIG_ENDIAN; + } +} --- /dev/null 2006-07-28 20:41:40.430451000 +0800 +++ frysk-core/frysk/proc/LinuxPpc.java 2006-07-31 16:51:50.000000000 +0800 @@ -0,0 +1,64 @@ +// This file is part of the program FRYSK. + +package frysk.proc; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import frysk.Config; + +class LinuxPpc + extends IsaPPC implements SyscallEventDecoder +{ + private static Logger logger = Logger.getLogger(Config.FRYSK_LOG_ID); + private static LinuxPpc isa; + + static LinuxPpc isaSingleton () + { + if (isa == null) + isa = new LinuxPpc (); + return isa; + } + + private SyscallEventInfo info; + + public SyscallEventInfo getSyscallEventInfo () + { + if (info == null) + info = new SyscallEventInfo () + { + public int number (Task task) + { + logger.log (Level.FINE, "Get GPR0 {0}\n", getRegisterByName("gpr0")); + return (int)getRegisterByName("gpr0").get(task); + } + public long returnCode (Task task) + { + return getRegisterByName("gpr3").get(task); + } + public long arg (Task task, int n) + { + switch (n) + { + case 0: + return (long)number(task); + case 1: + return getRegisterByName("orig_r3").get(task); + case 2: + return getRegisterByName("gpr4").get(task); + case 3: + return getRegisterByName("gpr5").get(task); + case 4: + return getRegisterByName("gpr6").get(task); + case 5: + return getRegisterByName("gpr7").get(task); + case 6: + return getRegisterByName("gpr8").get(task); + default: + throw new RuntimeException ("unknown syscall arg"); + } + } + }; + return info; + } +} \ No newline at end of file --- /dev/null 2006-07-28 20:41:40.430451000 +0800 +++ frysk-core/frysk/proc/LinuxPpc64.java 2006-07-31 16:43:08.000000000 +0800 @@ -0,0 +1,63 @@ +// This file is part of the program FRYSK. + +package frysk.proc; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import frysk.Config; + +class LinuxPpc64 + extends IsaPPC64 implements SyscallEventDecoder +{ + private static Logger logger = Logger.getLogger(Config.FRYSK_LOG_ID); + private static LinuxPpc64 isa; + + static LinuxPpc64 isaSingleton () + { + if (isa == null) + isa = new LinuxPpc64 (); + return isa; + } + + private SyscallEventInfo info; + public SyscallEventInfo getSyscallEventInfo () + { + if (info == null) + info = new SyscallEventInfo () + { + public int number (Task task) + { + logger.log (Level.FINE, "Get GPR0 {0}\n",getRegisterByName("gpr0")); + return (int)getRegisterByName("gpr0").get(task); + } + public long returnCode (Task task) + { + return getRegisterByName("gpr3").get(task); + } + public long arg (Task task, int n) + { + switch (n) + { + case 0: + return (long)number (task); + case 1: + return getRegisterByName("orig_r3").get(task); + case 2: + return getRegisterByName("gpr4").get(task); + case 3: + return getRegisterByName("gpr5").get(task); + case 4: + return getRegisterByName("gpr6").get(task); + case 5: + return getRegisterByName("gpr7").get(task); + case 6: + return getRegisterByName("gpr8").get(task); + default: + throw new RuntimeException ("unknown syscall arg"); + } + } + }; + return info; + } +}