From: <cap...@us...> - 2007-04-23 09:23:23
|
Revision: 82 http://svn.sourceforge.net/pearcolator/?rev=82&view=rev Author: captain5050 Date: 2007-04-23 02:23:22 -0700 (Mon, 23 Apr 2007) Log Message: ----------- Support for GDB auxv packet Modified Paths: -------------- src/org/binarytranslator/arch/arm/os/process/linux/ARM_LinuxProcessSpace.java src/org/binarytranslator/arch/ppc/os/process/linux/PPC_LinuxProcessSpace.java src/org/binarytranslator/arch/x86/os/process/linux/X86_LinuxProcessSpace.java src/org/binarytranslator/generic/execution/GdbController.java tests/gcc_simple/x86/helloworld Modified: src/org/binarytranslator/arch/arm/os/process/linux/ARM_LinuxProcessSpace.java =================================================================== --- src/org/binarytranslator/arch/arm/os/process/linux/ARM_LinuxProcessSpace.java 2007-04-22 17:03:27 UTC (rev 81) +++ src/org/binarytranslator/arch/arm/os/process/linux/ARM_LinuxProcessSpace.java 2007-04-23 09:23:22 UTC (rev 82) @@ -32,6 +32,11 @@ */ private int brk; + /** + * Auxiliary vector + */ + private int[] auxVector; + public ARM_LinuxProcessSpace() { sysCallGenerator = new Legacy(this); sysCalls = new ARM_LinuxSystemCalls(sysCallGenerator); @@ -52,7 +57,7 @@ this.brk = brk; // initialize the stack - int[] auxVector = {//LinuxStackInitializer.AuxiliaryVectorType.AT_SYSINFO, 0xffffe400, + auxVector = new int[]{//LinuxStackInitializer.AuxiliaryVectorType.AT_SYSINFO, 0xffffe400, //LinuxStackInitializer.AuxiliaryVectorType.AT_SYSINFO_EHDR, 0xffffe000, LinuxStackInitializer.AuxiliaryVectorType.AT_HWCAP, 0x78bfbff, LinuxStackInitializer.AuxiliaryVectorType.AT_PAGESZ, 0x1000, @@ -80,4 +85,7 @@ return null; } + public int[] getAuxVector() { + return auxVector; + } } Modified: src/org/binarytranslator/arch/ppc/os/process/linux/PPC_LinuxProcessSpace.java =================================================================== --- src/org/binarytranslator/arch/ppc/os/process/linux/PPC_LinuxProcessSpace.java 2007-04-22 17:03:27 UTC (rev 81) +++ src/org/binarytranslator/arch/ppc/os/process/linux/PPC_LinuxProcessSpace.java 2007-04-23 09:23:22 UTC (rev 82) @@ -50,6 +50,11 @@ private static final int STACK_TOP = 0x80000000; /** + * Auxiliary vector + */ + private int[] auxVector; + + /** * Constructor */ public PPC_LinuxProcessSpace(Loader loader) { @@ -77,7 +82,7 @@ * Initialise the stack */ private int initialiseStack(Loader loader, int pc) { - int[] auxVector = { + auxVector = new int[]{ LinuxStackInitializer.AuxiliaryVectorType.AT_IGNOREPPC, LinuxStackInitializer.AuxiliaryVectorType.AT_IGNOREPPC, LinuxStackInitializer.AuxiliaryVectorType.AT_IGNOREPPC, @@ -198,6 +203,10 @@ return this; } + public int[] getAuxVector() { + return auxVector; + } + public int getGDBFrameBaseRegister() { return -1; } Modified: src/org/binarytranslator/arch/x86/os/process/linux/X86_LinuxProcessSpace.java =================================================================== --- src/org/binarytranslator/arch/x86/os/process/linux/X86_LinuxProcessSpace.java 2007-04-22 17:03:27 UTC (rev 81) +++ src/org/binarytranslator/arch/x86/os/process/linux/X86_LinuxProcessSpace.java 2007-04-23 09:23:22 UTC (rev 82) @@ -30,6 +30,11 @@ final LinuxSystemCalls syscalls; /** + * Experimental support for the Linux sysinfo page (use to present sysenter and sysexit system call entry) + */ + private static final boolean useSysInfoPage = false; + + /** * Allows uniform access to the arguments of a system call. We cache this object for reuse. */ private final X86_LinuxSyscallArgumentIterator syscallArgs; @@ -45,6 +50,11 @@ private static final int STACK_TOP = 0xC0000000; /** + * Auxiliary vector + */ + private int[] auxVector; + + /** * Constructor */ public X86_LinuxProcessSpace(Loader loader) { @@ -63,40 +73,46 @@ registers.eip = pc; this.brk = brk; registers.writeGP32(X86_Registers.ESP, initialiseStack(loader, pc)); - try { - memory.map(0xffffe000, 8192, true, true, true); - } catch (MemoryMapException e) { - throw new Error ("Error creating VDSO page"); + if (useSysInfoPage) { + try { + memory.map(0xffffe000, 8192, true, true, true); + } catch (MemoryMapException e) { + throw new Error ("Error creating VDSO page"); + } + memory.store8(0xffffe400, 0xCD); // INT + memory.store8(0xffffe400, 0x80); // 80h + memory.store8(0xffffe400, 0xC3); // RET } - memory.store8(0xffffe400, 0xCD); // INT - memory.store8(0xffffe400, 0x80); // 80h - memory.store8(0xffffe400, 0xC3); // RET } /** * Initialise the stack */ private int initialiseStack(Loader loader, int pc) { - int[] auxVector = {//LinuxStackInitializer.AuxiliaryVectorType.AT_SYSINFO, 0xffffe400, - //LinuxStackInitializer.AuxiliaryVectorType.AT_SYSINFO_EHDR, 0xffffe000, - LinuxStackInitializer.AuxiliaryVectorType.AT_HWCAP, 0x78bfbff, - LinuxStackInitializer.AuxiliaryVectorType.AT_PAGESZ, 0x1000, - LinuxStackInitializer.AuxiliaryVectorType.AT_CLKTCK, 0x64, - LinuxStackInitializer.AuxiliaryVectorType.AT_PHDR, ((ELF_Loader)loader).getProgramHeaderAddress(), - LinuxStackInitializer.AuxiliaryVectorType.AT_PHNUM, ((ELF_Loader)loader).elfHeader.getNumberOfProgramSegmentHeaders(), - LinuxStackInitializer.AuxiliaryVectorType.AT_BASE, 0x0, - LinuxStackInitializer.AuxiliaryVectorType.AT_FLAGS, 0x0, - LinuxStackInitializer.AuxiliaryVectorType.AT_ENTRY, pc, + auxVector = new int[] { + LinuxStackInitializer.AuxiliaryVectorType.AT_HWCAP, 0x078bfbff, + LinuxStackInitializer.AuxiliaryVectorType.AT_PAGESZ, 0x1000, + LinuxStackInitializer.AuxiliaryVectorType.AT_CLKTCK, 0x64, + LinuxStackInitializer.AuxiliaryVectorType.AT_PHDR, ((ELF_Loader)loader).getProgramHeaderAddress(), + LinuxStackInitializer.AuxiliaryVectorType.AT_PHNUM, ((ELF_Loader)loader).elfHeader.getNumberOfProgramSegmentHeaders(), + LinuxStackInitializer.AuxiliaryVectorType.AT_BASE, 0x0, + LinuxStackInitializer.AuxiliaryVectorType.AT_FLAGS, 0x0, + LinuxStackInitializer.AuxiliaryVectorType.AT_ENTRY, pc, - LinuxStackInitializer.AuxiliaryVectorType.AT_UID, DBT_Options.UID, - LinuxStackInitializer.AuxiliaryVectorType.AT_EUID, DBT_Options.UID, - LinuxStackInitializer.AuxiliaryVectorType.AT_GID, DBT_Options.GID, - LinuxStackInitializer.AuxiliaryVectorType.AT_EGID, DBT_Options.GID, + LinuxStackInitializer.AuxiliaryVectorType.AT_UID, DBT_Options.UID, + LinuxStackInitializer.AuxiliaryVectorType.AT_EUID, DBT_Options.UID, + LinuxStackInitializer.AuxiliaryVectorType.AT_GID, DBT_Options.GID, + LinuxStackInitializer.AuxiliaryVectorType.AT_EGID, DBT_Options.GID, - LinuxStackInitializer.AuxiliaryVectorType.AT_SECURE, 0, - //LinuxStackInitializer.AuxiliaryVectorType.AT_PLATFORM, LinuxStackInitializer.AuxiliaryVectorType.STACK_TOP - getPlatformString().length, - LinuxStackInitializer.AuxiliaryVectorType.AT_NULL, 0x0}; + LinuxStackInitializer.AuxiliaryVectorType.AT_SECURE, 0, + //LinuxStackInitializer.AuxiliaryVectorType.AT_PLATFORM, LinuxStackInitializer.AuxiliaryVectorType.STACK_TOP - getPlatformString().length, + LinuxStackInitializer.AuxiliaryVectorType.AT_NULL, 0x0}; + if (useSysInfoPage) { +// LinuxStackInitializer.AuxiliaryVectorType.AT_SYSINFO, 0xffffe400, +// LinuxStackInitializer.AuxiliaryVectorType.AT_SYSINFO_EHDR, 0xffffe000, + } + return LinuxStackInitializer.stackInit(memory, STACK_TOP, getEnvironmentVariables(), auxVector); } @@ -149,29 +165,8 @@ public void setStackPtr(int ptr) {} - public int[] getAuxVector() { //ELF_Header header, ELF_ProgramHeaderTable programHeaders) { - /* - return new int[] { - 32, 0xffffe400, - 33, 0xffffe000, - ELF_Constants.AT_HWCAP, 0x78bfbff, - ELF_Constants.AT_PAGESZ, 0x1000, - ELF_Constants.AT_CLKTCK, 0x64, - ELF_Constants.AT_PHDR, header.e_phoff - programHeaders.getSegment(0).p_offset + programHeaders.getSegment(0).p_vaddr, - ELF_Constants.AT_PHNUM, header.e_phnum, - ELF_Constants.AT_BASE, 0x0, - ELF_Constants.AT_FLAGS, 0x0, - ELF_Constants.AT_ENTRY, header.e_entry, - ELF_Constants.AT_UID, ELF_Constants.UID, - ELF_Constants.AT_EUID, ELF_Constants.UID, - ELF_Constants.AT_GID, ELF_Constants.GID, - ELF_Constants.AT_EGID, ELF_Constants.GID, - ELF_Constants.AT_SECURE, 0, - ELF_Constants.AT_PLATFORM, ELF_Constants.STACK_TOP - getPlatformString().length, - ELF_Constants.AT_NULL, 0x0, - }; - */ - throw new Error("TODO"); + public int[] getAuxVector() { + return auxVector; } public byte[] getPlatformString() { Modified: src/org/binarytranslator/generic/execution/GdbController.java =================================================================== --- src/org/binarytranslator/generic/execution/GdbController.java 2007-04-22 17:03:27 UTC (rev 81) +++ src/org/binarytranslator/generic/execution/GdbController.java 2007-04-23 09:23:22 UTC (rev 82) @@ -13,6 +13,7 @@ import java.net.*; import org.binarytranslator.generic.fault.BadInstructionException; +import org.binarytranslator.generic.fault.SegmentationFault; import org.binarytranslator.generic.os.process.ProcessSpace; /** @@ -63,6 +64,11 @@ * Return the address of the current instruction. */ int getCurrentInstructionAddress(); + + /** + * Get the auxiliary vector + */ + int[] getAuxVector(); } @@ -480,6 +486,32 @@ ':', ':' })) { // GDB is telling us it will handle symbol queries for us - nice :-) replyOK(); + } else if (doesBufferMatch(2, new byte[] { 'P','a','r','t',':','a','u','x','v', + ':','r','e','a','d',':',':'})) { + String data = bufferToString(18, dataEnd); + int offset = Integer.parseInt(data.substring(0, data.indexOf(',')), 16); + int length = Integer.parseInt(data.substring(data.indexOf(',') + 1), 16); + int[] auxv = target.getAuxVector(); + byte[] auxv_asbytes = new byte[auxv.length * 4 * 2]; + for(int i=0; i < auxv.length; i++) { + auxv_asbytes[i*8+1] = intToHex (auxv[i] & 0xF); + auxv_asbytes[i*8+0] = intToHex((auxv[i] >> 4) & 0xF); + auxv_asbytes[i*8+3] = intToHex((auxv[i] >> 8) & 0xF); + auxv_asbytes[i*8+2] = intToHex((auxv[i] >> 12) & 0xF); + auxv_asbytes[i*8+5] = intToHex((auxv[i] >> 16) & 0xF); + auxv_asbytes[i*8+4] = intToHex((auxv[i] >> 20) & 0xF); + auxv_asbytes[i*8+7] = intToHex((auxv[i] >> 24) & 0xF); + auxv_asbytes[i*8+6] = intToHex((auxv[i] >> 28) & 0xF); + } + byte[] command = new byte[Math.min(length*2,auxv_asbytes.length-(offset*2))]; + for (int i=0; i < command.length; i++) { + command[i] = auxv_asbytes[offset*2+i]; + } + if (command.length > 0) { + sendCommand(command); + } else { + replyOK(); + } } else { // unrecognized query sendCommand(null); @@ -609,6 +641,10 @@ // report that a SIGILL halted the debugger byte command[] = { 'S', '0', '4' }; sendCommand(command); + } catch (SegmentationFault e) { + // report that a SIGSEGV halted the debugger + byte command[] = { 'S', '0', 'b' }; + sendCommand(command); } break; case 'c': @@ -634,6 +670,10 @@ // report that a SIGILL halted the debugger byte command[] = { 'S', '0', '4' }; sendCommand(command); + } catch (SegmentationFault e) { + // report that a SIGSEGV halted the debugger + byte command[] = { 'S', '0', 'b' }; + sendCommand(command); } break; case 'S': Modified: tests/gcc_simple/x86/helloworld =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |