From: <cap...@us...> - 2007-04-20 22:15:51
|
Revision: 77 http://svn.sourceforge.net/pearcolator/?rev=77&view=rev Author: captain5050 Date: 2007-04-20 15:15:52 -0700 (Fri, 20 Apr 2007) Log Message: ----------- Some x86 improvements and GDB stub support Modified Paths: -------------- src/org/binarytranslator/arch/x86/decoder/X86_InstructionDecoder.java src/org/binarytranslator/arch/x86/os/process/X86_ProcessSpace.java src/org/binarytranslator/generic/execution/GdbController.java src/org/binarytranslator/generic/memory/ByteAddressedMemory.java Modified: src/org/binarytranslator/arch/x86/decoder/X86_InstructionDecoder.java =================================================================== --- src/org/binarytranslator/arch/x86/decoder/X86_InstructionDecoder.java 2007-04-20 18:51:50 UTC (rev 76) +++ src/org/binarytranslator/arch/x86/decoder/X86_InstructionDecoder.java 2007-04-20 22:15:52 UTC (rev 77) @@ -759,8 +759,10 @@ * instruction and instruction address * @return the next instruction interpreter */ - public InstructionDecoder interpret(ProcessSpace ps) + public InstructionDecoder interpret(ProcessSpace ps, int pc) throws BadInstructionException { + X86_InstructionDecoder decoder = getDecoder(ps, pc); + System.err.println("Attempt to interpret " + decoder.disassemble(ps, pc)); TODO(); return null; } @@ -1144,12 +1146,12 @@ X86_Registers.ECX, 32); translationHelper.appendInstructionToCurrentBlock( - Binary.create(INT_ADD, ecx.copyRO(), ecx.copyRO(), new OPT_IntConstantOperand(-1))); + Binary.create(INT_ADD, ecx, ecx.copyRO(), new OPT_IntConstantOperand(-1))); OPT_RegisterOperand guardResult = translationHelper.getTempValidation(0); translationHelper.appendInstructionToCurrentBlock( IfCmp.create(INT_IFCMP, guardResult, ecx.copyRO(), new OPT_IntConstantOperand(0), - OPT_ConditionOperand.EQUAL(), instructionBlock.makeJumpTarget(), + OPT_ConditionOperand.NOT_EQUAL(), instructionBlock.makeJumpTarget(), OPT_BranchProfileOperand.likely())); instructionBlock.insertOut(instructionBlock); @@ -2539,7 +2541,7 @@ // Perform copy OPT_RegisterOperand temp = translationHelper.getTempInt(0); source.readToRegister(translationHelper, lazy, temp); - destination.writeValue(translationHelper, lazy, temp); + destination.writeValue(translationHelper, lazy, temp.copyRO()); // Do update OPT_RegisterOperand esi = translationHelper.getGPRegister(lazy, @@ -2614,11 +2616,11 @@ // TODO: apply segment override switch (operandSize) { case 8: - return "movsb ds:" + addressPrefix + "si, " + addressPrefix + "di"; + return "movsb es:" + addressPrefix + "di, ds:" + addressPrefix + "si"; case 16: - return "movsw ds:" + addressPrefix + "si, " + addressPrefix + "di"; + return "movsw es:" + addressPrefix + "di, ds:" + addressPrefix + "si"; case 32: - return "movsd ds:" + addressPrefix + "si, " + addressPrefix + "di"; + return "movsd es:" + addressPrefix + "di, ds:" + addressPrefix + "si"; default: DBT_OptimizingCompilerException.UNREACHABLE(); return "error"; Modified: src/org/binarytranslator/arch/x86/os/process/X86_ProcessSpace.java =================================================================== --- src/org/binarytranslator/arch/x86/os/process/X86_ProcessSpace.java 2007-04-20 18:51:50 UTC (rev 76) +++ src/org/binarytranslator/arch/x86/os/process/X86_ProcessSpace.java 2007-04-20 22:15:52 UTC (rev 77) @@ -9,6 +9,7 @@ package org.binarytranslator.arch.x86.os.process; import java.io.*; +import java.util.Hashtable; import org.jikesrvm.compilers.opt.ir.OPT_GenerationContext; import org.jikesrvm.compilers.opt.ir.OPT_HIRGenerator; @@ -18,12 +19,15 @@ import org.binarytranslator.generic.memory.ByteAddressedMemory; import org.binarytranslator.generic.execution.GdbController.GdbTarget; import org.binarytranslator.generic.fault.BadInstructionException; -import org.binarytranslator.arch.ppc.os.process.linux.PPC_LinuxProcessSpace; +import org.binarytranslator.arch.ppc.decoder.PPC_InstructionDecoder; import org.binarytranslator.arch.x86.os.process.linux.X86_LinuxProcessSpace; import org.binarytranslator.arch.x86.decoder.X862IR; import org.binarytranslator.arch.x86.decoder.X86_InstructionDecoder; import org.binarytranslator.generic.os.loader.Loader; +import org.binarytranslator.vmInterface.DBT_Trace; +import org.binarytranslator.vmInterface.DynamicCodeRunner; import org.vmmagic.pragma.Uninterruptible; +import org.jikesrvm.ArchitectureSpecific.VM_CodeArray; /** * Encapsulate the parts of an X86 process that are common across operating systems @@ -157,23 +161,39 @@ */ public static ProcessSpace createProcessSpaceFromBinary (Loader loader) throws IOException { Loader.ABI abi = loader.getABI(); - + switch (abi) { - case Linux: - case SystemV: - report("Linux/SysV ABI"); - return new PPC_LinuxProcessSpace(loader); - - default: - throw new IOException("Binary of " + abi + " ABI is unsupported for the PowerPC architecture"); + case Linux: + case SystemV: + report("Linux/SysV ABI"); + return new X86_LinuxProcessSpace(loader); + default: + throw new IOException("Binary of " + abi + " ABI is unsupported for the X86 architecture"); } } + Hashtable<Integer, DBT_Trace> singleInstrCodeHash = new Hashtable<Integer, DBT_Trace>(); /** * Run a single instruction */ public void runOneInstruction() throws BadInstructionException { - throw new UnsupportedOperationException("To be implemented"); + try { + // X86_InstructionDecoder.getDecoder(this,registers.eip).interpret(this, registers.eip); + DBT_Trace trace = singleInstrCodeHash.get(registers.eip); + if (trace == null) { + trace = new DBT_Trace(this, registers.eip); + if (DBT_Options.debugRuntime) { + report("Translating code for 0x" + Integer.toHexString(trace.pc)); + } + DBT_Options.singleInstrTranslation = true; + trace.compile(); + singleInstrCodeHash.put(registers.eip, trace); + } + VM_CodeArray code = trace.getCurrentCompiledMethod().getEntryCodeArray(); + registers.eip = DynamicCodeRunner.invokeCode(code, this); + } catch (NullPointerException e) { + throw new BadInstructionException(registers.eip, this); + } } /** Modified: src/org/binarytranslator/generic/execution/GdbController.java =================================================================== --- src/org/binarytranslator/generic/execution/GdbController.java 2007-04-20 18:51:50 UTC (rev 76) +++ src/org/binarytranslator/generic/execution/GdbController.java 2007-04-20 22:15:52 UTC (rev 77) @@ -506,7 +506,7 @@ */ private void handle_getMemValue(int dataEnd) throws IOException { String data = bufferToString(2, dataEnd); - int address = Integer.parseInt(data.substring(0, data.indexOf(',')), 16); + int address = (int)Long.parseLong(data.substring(0, data.indexOf(',')), 16); int count = Integer.parseInt(data.substring(data.indexOf(',') + 1), 16); try { byte value[] = new byte[count * 2]; Modified: src/org/binarytranslator/generic/memory/ByteAddressedMemory.java =================================================================== --- src/org/binarytranslator/generic/memory/ByteAddressedMemory.java 2007-04-20 18:51:50 UTC (rev 76) +++ src/org/binarytranslator/generic/memory/ByteAddressedMemory.java 2007-04-20 22:15:52 UTC (rev 77) @@ -509,9 +509,13 @@ * the address of where to store */ public void store32(int addr, int value) { - store8(addr + 3, value >> 24); - store8(addr + 2, value >> 16); - store8(addr + 1, value >> 8); - store8(addr, value); + try { + store8(addr + 3, value >> 24); + store8(addr + 2, value >> 16); + store8(addr + 1, value >> 8); + store8(addr, value); + } catch (Exception e) { + throw new SegmentationFault(addr); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |