public static void RunTests(StreamWriter log) { log.WriteLine("Test: Starting RAM unit tests"); ramSim tram = new ramSim(32768); log.WriteLine("Test: Read/Write Byte"); byte byteRes = tram.ReadByte(0); Debug.Assert(byteRes == 0); tram.WriteByte(0, 0xee); byteRes = tram.ReadByte(0); Debug.Assert(byteRes == 0xee); tram.CLEAR(); log.WriteLine("Test: Read/Write HalfWord"); short shortRes = tram.ReadHalfWord(0); Debug.Assert(shortRes == 0); tram.WriteHalfWord(0, 0xeef); shortRes = tram.ReadHalfWord(0); Debug.Assert(shortRes == 0xeef); tram.CLEAR(); log.WriteLine("Test: Read/Write Word"); int intRes = tram.ReadWord(0); Debug.Assert(intRes == 0); tram.WriteWord(0, 0xabcdef); intRes = tram.ReadWord(0); Debug.Assert(intRes == 0xabcdef); tram.CLEAR(); log.WriteLine("Test: Set/Test Flag"); bool flagRes = tram.TestFlag(0, 4); Debug.Assert(flagRes == false); tram.SetFlag(0, 4, true); flagRes = tram.TestFlag(0, 4); Debug.Assert(flagRes == true); flagRes = tram.TestFlag(0, 3); Debug.Assert(flagRes == false); log.WriteLine("Test: All Ram Tests passed\n"); tram.CLEAR(); }
public static void RunTests(StreamWriter log) { log.WriteLine("Test: Starting ArmSim unit tests"); ELFReader e = new ELFReader(); log.WriteLine("Test: Testing Hash of test1.exe"); byte[] elfArray = File.ReadAllBytes("test1.exe"); e.ReadHeader(elfArray); ramSim ram = new ramSim(32768); armsim.writeElfToRam(e, elfArray, ref ram); string resultHash = ram.getHash(); string hash = "3500a8bef72dfed358b25b61b7602cf1"; Debug.Assert(hash.ToUpper() == resultHash); ram.CLEAR(); log.WriteLine("Test: Testing Hash of test2.exe"); elfArray = File.ReadAllBytes("test2.exe"); e.ReadHeader(elfArray); armsim.writeElfToRam(e, elfArray, ref ram); resultHash = ram.getHash(); hash = "0a81d8b63d44a192e5f9f52980f2792e"; Debug.Assert(hash.ToUpper() == resultHash); ram.CLEAR(); log.WriteLine("Test: Testing Hash of test3.exe"); elfArray = File.ReadAllBytes("test3.exe"); e.ReadHeader(elfArray); armsim.writeElfToRam(e, elfArray, ref ram); resultHash = ram.getHash(); hash = "977159b662ac4e450ed62063fba27029"; Debug.Assert(hash.ToUpper() == resultHash); log.WriteLine("Test: All Hashes correct\n"); }
/* * * Unused might be good in the future public static byte[] stringToByteArray(string input){ byte[] bA = new byte[input.Length * sizeof(char)]; char[] inputArray = input.ToCharArray (); System.Buffer.BlockCopy(inputArray, 0, bA, 0, bA.Length); return bA; } */ public static int run(OptionParser options) { try { log = new StreamWriter("log.txt"); log.WriteLine("Log: Start"); if (options.getTest()) { TestRam.RunTests(log); TestArmSim.RunTests(log); } log.WriteLine("Log: MemSize " + options.getMemSize()); log.WriteLine("Log: File " + options.getFile()); log.WriteLine("Log: Little Endian " + BitConverter.IsLittleEndian); ELFReader e = new ELFReader(); byte[] elfArray = File.ReadAllBytes(options.getFile()); e.ReadHeader(elfArray); log.WriteLine("ELF: Header Position " + e.elfHeader.e_phoff); log.WriteLine("ELF: Header Size " + e.elfHeader.e_ehsize); log.WriteLine("ELF: Entry Position " + e.elfHeader.e_entry.ToString("X4")); log.WriteLine("ELF: Number of program headers " + e.elfHeader.e_phnum); for (int i = 1; i <= e.elfHeader.e_phnum; i++) { log.WriteLine("ELF: Program Header {0}, Offset = {1}, Size = {2}", i, e.elfHeader.e_phoff, e.elfHeader.e_phentsize); } //ignore the entry point for a loader //its for (executing)going into the ram after it's loaded ramSim ram = new ramSim(options.getMemSize()); writeElfToRam(e, elfArray, ref ram); log.WriteLine("Log: Ram Hash " + ram.getHash()); printArray(ram.getArray()); } catch { log.WriteLine("Log: Something went wrong"); log.Close(); return -1; } //all is good in the world,the sky is blue, the tank is clean...THE TANK IS CLEAN!! log.WriteLine("Log: Program Finished"); log.WriteLine("-----------------------------"); log.Close(); return 0; }
public static void writeElfToRam(ELFReader e, byte[] elfArray, ref ramSim ram) { log.WriteLine("RAM: Size {0}", ram.getSize()); for (int prog = 0; prog < e.elfHeader.e_phnum; prog++) { int ramAddress = e.elfphs[prog].p_vaddr; log.WriteLine("RAM: Writing to {0} ", ramAddress); int elfOffSet = (int)e.elfphs[prog].p_offset; log.WriteLine("ELF: Reading from {0}", e.elfphs[prog].p_offset); log.WriteLine("ELF: Size of Segment {0}", e.elfphs[prog].p_filesz); int ii = ramAddress; int j = elfOffSet; for (; j < elfArray.Length && ii < e.elfphs[prog].p_filesz + ramAddress; ii++, j++) { ram.WriteByte(ii, elfArray[j]); } } }