From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24863 invoked by alias); 29 Nov 2007 09:40:59 -0000 Received: (qmail 24838 invoked by uid 9514); 29 Nov 2007 09:40:59 -0000 Date: Thu, 29 Nov 2007 09:40:00 -0000 Message-ID: <20071129094059.24823.qmail@sourceware.org> From: pmuldoon@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Complete move to constructing GPR notes as byte buffers, not BigIntegers. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 2db907516bfc9f5f893e64b795ec2ffed349d6f8 X-Git-Newrev: ad3897b147d7d155b38ee9bb666c953b782a7fdd Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2007-q4/txt/msg00488.txt.bz2 The branch, master has been updated via ad3897b147d7d155b38ee9bb666c953b782a7fdd (commit) from 2db907516bfc9f5f893e64b795ec2ffed349d6f8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit ad3897b147d7d155b38ee9bb666c953b782a7fdd Author: Phil Muldoon Date: Thu Nov 29 09:40:51 2007 +0000 Complete move to constructing GPR notes as byte buffers, not BigIntegers. 2007-11-29 Phil Muldoon * IA32LinuxElfCorefile.java(writeNotePrstatus): Construct byte-ordered buffer for GP Registers. Do not use BigIntegers. Account for wordSize with Registers < wordSize. (bytesToBigInteger) Delete. * X8664LinuxElfCorefile.java: Ditto. * PPC32LinuxElfCorefile.java: Ditto. * PPC64LinuxElfCorefile.java: Ditto. 2007-11-29 Phil Muldoon * cni/ElfPrstatus.cxx (ElfPrstatus::fillMemRegion): Copy buffer to structure, do not build buffer. * ElfPrstatus.java (setPrGPRegisterBuffer): New. (setPrGPReg): Delete. (convertToLong): Delete. (getPrGPRegIterator): Delete. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/util/ChangeLog | 10 +++ frysk-core/frysk/util/IA32LinuxElfCorefile.java | 83 +++++++++++---------- frysk-core/frysk/util/PPC32LinuxElfCorefile.java | 77 ++++++++------------ frysk-core/frysk/util/PPC64LinuxElfCorefile.java | 85 +++++++++------------- frysk-core/frysk/util/X8664LinuxElfCorefile.java | 62 ++++++++-------- frysk-sys/lib/dwfl/ChangeLog | 9 +++ frysk-sys/lib/dwfl/ElfPrstatus.java | 36 +--------- frysk-sys/lib/dwfl/cni/ElfPrstatus.cxx | 16 +---- 8 files changed, 165 insertions(+), 213 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/util/ChangeLog b/frysk-core/frysk/util/ChangeLog index d8feb8e..8e69317 100644 --- a/frysk-core/frysk/util/ChangeLog +++ b/frysk-core/frysk/util/ChangeLog @@ -1,3 +1,13 @@ +2007-11-29 Phil Muldoon + + * IA32LinuxElfCorefile.java(writeNotePrstatus): Construct + byte-ordered buffer for GP Registers. Do not use BigIntegers. + Account for wordSize with Registers < wordSize. + (bytesToBigInteger) Delete. + * X8664LinuxElfCorefile.java: Ditto. + * PPC32LinuxElfCorefile.java: Ditto. + * PPC64LinuxElfCorefile.java: Ditto. + 2007-11-28 Tim Moore * TestCountDownLatch.java (testTimeout): wrap time out await in diff --git a/frysk-core/frysk/util/IA32LinuxElfCorefile.java b/frysk-core/frysk/util/IA32LinuxElfCorefile.java index 7e6f17a..be6bdfc 100644 --- a/frysk-core/frysk/util/IA32LinuxElfCorefile.java +++ b/frysk-core/frysk/util/IA32LinuxElfCorefile.java @@ -42,7 +42,6 @@ package frysk.util; import frysk.proc.Proc; import frysk.proc.Task; import inua.eio.ByteBuffer; -import inua.eio.ByteOrder; import lib.dwfl.ElfNhdr; import lib.dwfl.ElfNhdrType; @@ -59,7 +58,7 @@ import frysk.sys.proc.Stat; import frysk.sys.proc.Status; import frysk.isa.IA32Registers; import frysk.isa.Register; -import java.math.BigInteger; + /** * LinuxElfCorefilex86. Extends LinuxCorefile. Fill in @@ -181,32 +180,52 @@ public class IA32LinuxElfCorefile extends LinuxElfCorefile { // are the names are the same. Create a string[] map to bridge // gap between frysk and core file register order. - Register[] ptraceRegisterMap = {IA32Registers.EBX, - IA32Registers.ECX, - IA32Registers.EDX, - IA32Registers.ESI, - IA32Registers.EDI, - IA32Registers.EBP, - IA32Registers.EAX, - IA32Registers.DS, - IA32Registers.ES, - IA32Registers.FS, - IA32Registers.GS, - IA32Registers.ORIG_EAX, - IA32Registers.EIP, - IA32Registers.CS, - IA32Registers.EFLAGS, - IA32Registers.ESP, - IA32Registers.SS}; + Register[] ptraceRegisterMap = { + IA32Registers.EBX, + IA32Registers.ECX, + IA32Registers.EDX, + IA32Registers.ESI, + IA32Registers.EDI, + IA32Registers.EBP, + IA32Registers.EAX, + IA32Registers.DS, + IA32Registers.ES, + IA32Registers.FS, + IA32Registers.GS, + IA32Registers.ORIG_EAX, + IA32Registers.EIP, + IA32Registers.CS, + IA32Registers.EFLAGS, + IA32Registers.ESP, + IA32Registers.SS + }; // Set GP register info + int index = 0; + int arraySize = 0; + int regSize; + int wordSize = task.getISA().wordSize(); + + // Allocate space in array. Even though there are some registers < wordSize, they still have + // to sit in a wordSize area + for (int l = 0; l < ptraceRegisterMap.length; l++) + if (ptraceRegisterMap[l].getType().getSize() < wordSize) + arraySize +=wordSize; + else + arraySize +=ptraceRegisterMap[l].getType().getSize(); + + byte[] byteOrderedRegister= new byte[arraySize]; + + // Populate array, using wordSize as minimum size for (int i = 0; i < ptraceRegisterMap.length; i++) { - int registerSize = ptraceRegisterMap[i].getType().getSize(); - byte[] byteOrderedRegister = new byte[registerSize]; - task.access(ptraceRegisterMap[i], 0, registerSize, byteOrderedRegister, 0, false); - prStatus.setPrGPReg(i,bytesToBigInteger(byteOrderedRegister)); + regSize = ptraceRegisterMap[i].getType().getSize(); + if (regSize < wordSize) + regSize = wordSize; + task.access(ptraceRegisterMap[i], 0, regSize, byteOrderedRegister, index, false); + index += regSize; } - + + prStatus.setPrGPRegisterBuffer(byteOrderedRegister); // Write it nhdrEntry.setNhdrDesc(ElfNhdrType.NT_PRSTATUS, prStatus); @@ -292,20 +311,4 @@ public class IA32LinuxElfCorefile extends LinuxElfCorefile { return ElfEHeader.PHEADER_ELFCLASS32; } - // XXX: Function to convert bytes[] to BigInteger. - // Will disappear when all BankRegisters are present on all - // all architectures, and we can call task.access() on all - // registers, and not convert to BigInteger. - private BigInteger bytesToBigInteger(byte[] bytes) - { - if (this.process.getMainTask().getISA().order() == ByteOrder.LITTLE_ENDIAN) { - for (int left = 0; left < bytes.length / 2; left++) { - int right = bytes.length - 1 - left; - byte temp = bytes[left]; - bytes[left] = bytes[right]; - bytes[right] = temp; - } - } - return new BigInteger(bytes); - } } diff --git a/frysk-core/frysk/util/PPC32LinuxElfCorefile.java b/frysk-core/frysk/util/PPC32LinuxElfCorefile.java index 8180acf..fec155f 100644 --- a/frysk-core/frysk/util/PPC32LinuxElfCorefile.java +++ b/frysk-core/frysk/util/PPC32LinuxElfCorefile.java @@ -43,23 +43,19 @@ package frysk.util; -import java.math.BigInteger; - -import frysk.proc.Proc; -import frysk.proc.Task; import inua.eio.ByteBuffer; -import inua.eio.ByteOrder; - +import lib.dwfl.ElfEHeader; +import lib.dwfl.ElfEMachine; import lib.dwfl.ElfNhdr; import lib.dwfl.ElfNhdrType; -import lib.dwfl.ElfEMachine; -import lib.dwfl.ElfEHeader; import lib.dwfl.ElfPrAuxv; +import lib.dwfl.ElfPrFPRegSet; import lib.dwfl.ElfPrpsinfo; import lib.dwfl.ElfPrstatus; -import lib.dwfl.ElfPrFPRegSet; import frysk.isa.PPC32Registers; import frysk.isa.Register; +import frysk.proc.Proc; +import frysk.proc.Task; import frysk.sys.proc.AuxvBuilder; import frysk.sys.proc.CmdLineBuilder; import frysk.sys.proc.Stat; @@ -188,11 +184,6 @@ public class PPC32LinuxElfCorefile extends LinuxElfCorefile { // The number of total common registers in PPC/PPC64 including nip, msr, // etc. Defined in the asm-ppc/elf.h. - int elfNGREG = 48; - int blankRegisterIndex = elfNGREG; - - byte[] zeroVal = new byte[] { 0 }; - Register[] ptracePpcRegMap = { PPC32Registers.NIP, PPC32Registers.MSR, PPC32Registers.ORIGR3, PPC32Registers.CTR, PPC32Registers.LR, PPC32Registers.XER, @@ -210,23 +201,37 @@ public class PPC32LinuxElfCorefile extends LinuxElfCorefile { PPC32Registers.GPR27, PPC32Registers.GPR28, PPC32Registers.GPR29, PPC32Registers.GPR30, PPC32Registers.GPR31}; - for (int i = 0; i < ptracePpcRegMap.length; i++) { - int registerSize = ptracePpcRegMap[i].getType().getSize(); - byte[] byteOrderedRegister = new byte[registerSize]; - task.access(ptracePpcRegMap[i], 0, registerSize, byteOrderedRegister, 0, false); - prStatus.setPrGPReg(i,bytesToBigInteger(byteOrderedRegister)); - } + + // Set GP register info + int index = 0; + int arraySize = 0; + int regSize; + int wordSize = task.getISA().wordSize(); + int elfNGREG = 48; + // Allocate space in array. Even though there are some registers < wordSize, they still have + // to sit in a wordSize area + for (int l = 0; l < ptracePpcRegMap.length; l++) + if (ptracePpcRegMap[l].getType().getSize() < wordSize) + arraySize +=wordSize; + else + arraySize +=ptracePpcRegMap[l].getType().getSize(); - blankRegisterIndex = ptracePpcRegMap.length; + int blankRegisterIndex = (elfNGREG - ptracePpcRegMap.length) * wordSize; - BigInteger bigInt = new BigInteger(zeroVal); + byte[] byteOrderedRegister= new byte[arraySize+blankRegisterIndex]; + + // Populate array, using wordSize as minimum size + for (int i = 0; i < ptracePpcRegMap.length; i++) { + regSize = ptracePpcRegMap[i].getType().getSize(); + if (regSize < wordSize) + regSize = wordSize; + task.access(ptracePpcRegMap[i], 0, regSize, byteOrderedRegister, index, false); + index += regSize; + } + + prStatus.setPrGPRegisterBuffer(byteOrderedRegister); - // On ppc, some register indexes are not defined in - // asm-/ptrace.h. - for (int index = blankRegisterIndex; index < elfNGREG; index++) - prStatus.setPrGPReg(index, bigInt); - // Write it nhdrEntry.setNhdrDesc(ElfNhdrType.NT_PRSTATUS, prStatus); } @@ -295,22 +300,4 @@ public class PPC32LinuxElfCorefile extends LinuxElfCorefile { protected byte getElfMachineClass() { return ElfEHeader.PHEADER_ELFCLASS32; } - - // XXX: Function to convert bytes[] to BigInteger. - // Will disappear when all BankRegisters are present on all - // all architectures, and we can call task.access() on all - // registers, and not convert to BigInteger. - private BigInteger bytesToBigInteger(byte[] bytes) - { - if (this.process.getMainTask().getISA().order() == ByteOrder.LITTLE_ENDIAN) { - for (int left = 0; left < bytes.length / 2; left++) { - int right = bytes.length - 1 - left; - byte temp = bytes[left]; - bytes[left] = bytes[right]; - bytes[right] = temp; - } - } - return new BigInteger(bytes); - } - } diff --git a/frysk-core/frysk/util/PPC64LinuxElfCorefile.java b/frysk-core/frysk/util/PPC64LinuxElfCorefile.java index 58553c7..df6b20b 100644 --- a/frysk-core/frysk/util/PPC64LinuxElfCorefile.java +++ b/frysk-core/frysk/util/PPC64LinuxElfCorefile.java @@ -43,25 +43,20 @@ package frysk.util; -import java.math.BigInteger; - -import frysk.proc.Proc; -import frysk.proc.Task; -import inua.eio.ByteOrder; - +import lib.dwfl.ElfEHeader; +import lib.dwfl.ElfEMachine; import lib.dwfl.ElfNhdr; import lib.dwfl.ElfNhdrType; -import lib.dwfl.ElfEMachine; -import lib.dwfl.ElfEHeader; import lib.dwfl.ElfPrAuxv; +import lib.dwfl.ElfPrFPRegSet; import lib.dwfl.ElfPrpsinfo; import lib.dwfl.ElfPrstatus; -import lib.dwfl.ElfPrFPRegSet; - -import frysk.sys.proc.AuxvBuilder; -import frysk.sys.proc.CmdLineBuilder; import frysk.isa.PPC64Registers; import frysk.isa.Register; +import frysk.proc.Proc; +import frysk.proc.Task; +import frysk.sys.proc.AuxvBuilder; +import frysk.sys.proc.CmdLineBuilder; import frysk.sys.proc.Stat; import frysk.sys.proc.Status; @@ -188,11 +183,6 @@ public class PPC64LinuxElfCorefile extends LinuxElfCorefile { // The number of total common registers in PPC/PPC64 including nip, msr, // etc. Defined in the asm-ppc64/elf.h. - int elfNGREG = 48; - int blankRegisterIndex = elfNGREG; - - byte[] zeroVal = new byte[] { 0 }; - // XXX: if one register's offset is not defined in asm-ppc/ptrace.h or // asm-ppc64/ptrace.h,we did not dump it out and fill give the null Name. Register[] ptracePpc64RegMap = { @@ -212,23 +202,36 @@ public class PPC64LinuxElfCorefile extends LinuxElfCorefile { PPC64Registers.GPR27, PPC64Registers.GPR28, PPC64Registers.GPR29, PPC64Registers.GPR30, PPC64Registers.GPR31}; - for (int i = 0; i < ptracePpc64RegMap.length; i++) { - int registerSize = ptracePpc64RegMap[i].getType().getSize(); - byte[] byteOrderedRegister = new byte[registerSize]; - task.access(ptracePpc64RegMap[i], 0, registerSize, byteOrderedRegister, 0, false); - prStatus.setPrGPReg(i, bytesToBigInteger(byteOrderedRegister)); - } - - - blankRegisterIndex = ptracePpc64RegMap.length; - - BigInteger bigInt = new BigInteger(zeroVal); + // Set GP register info + int index = 0; + int arraySize = 0; + int regSize; + int wordSize = task.getISA().wordSize(); + int elfNGREG = 48; + + // Allocate space in array. Even though there are some registers < wordSize, they still have + // to sit in a wordSize area + for (int l = 0; l < ptracePpc64RegMap.length; l++) + if (ptracePpc64RegMap[l].getType().getSize() < wordSize) + arraySize +=wordSize; + else + arraySize +=ptracePpc64RegMap[l].getType().getSize(); + + int blankRegisterIndex = (elfNGREG - ptracePpc64RegMap.length) * wordSize; + + byte[] byteOrderedRegister= new byte[arraySize+blankRegisterIndex]; + + // Populate array, using wordSize as minimum size + for (int i = 0; i < ptracePpc64RegMap.length; i++) { + regSize = ptracePpc64RegMap[i].getType().getSize(); + if (regSize < wordSize) + regSize = wordSize; + task.access(ptracePpc64RegMap[i], 0, regSize, byteOrderedRegister, index, false); + index += regSize; + } + + prStatus.setPrGPRegisterBuffer(byteOrderedRegister); - // On ppc, some register indexes are not defined in - // asm-/ptrace.h. - for (int index = blankRegisterIndex; index < elfNGREG; index++) - prStatus.setPrGPReg(index, bigInt); - // Write it nhdrEntry.setNhdrDesc(ElfNhdrType.NT_PRSTATUS, prStatus); } @@ -330,20 +333,4 @@ public class PPC64LinuxElfCorefile extends LinuxElfCorefile { return ElfEHeader.PHEADER_ELFCLASS64; } - // XXX: Function to convert bytes[] to BigInteger. - // Will disappear when all BankRegisters are present on all - // all architectures, and we can call task.access() on all - // registers, and not convert to BigInteger. - private BigInteger bytesToBigInteger(byte[] bytes) - { - if (this.process.getMainTask().getISA().order() == ByteOrder.LITTLE_ENDIAN) { - for (int left = 0; left < bytes.length / 2; left++) { - int right = bytes.length - 1 - left; - byte temp = bytes[left]; - bytes[left] = bytes[right]; - bytes[right] = temp; - } - } - return new BigInteger(bytes); - } } diff --git a/frysk-core/frysk/util/X8664LinuxElfCorefile.java b/frysk-core/frysk/util/X8664LinuxElfCorefile.java index c2dab9d..7d4fb1c 100644 --- a/frysk-core/frysk/util/X8664LinuxElfCorefile.java +++ b/frysk-core/frysk/util/X8664LinuxElfCorefile.java @@ -39,23 +39,19 @@ package frysk.util; -import java.math.BigInteger; - -import frysk.isa.Register; -import frysk.isa.X8664Registers; -import frysk.proc.Proc; -import frysk.proc.Task; import inua.eio.ByteBuffer; -import inua.eio.ByteOrder; - +import lib.dwfl.ElfEHeader; +import lib.dwfl.ElfEMachine; import lib.dwfl.ElfNhdr; import lib.dwfl.ElfNhdrType; -import lib.dwfl.ElfEMachine; -import lib.dwfl.ElfEHeader; import lib.dwfl.ElfPrAuxv; +import lib.dwfl.ElfPrFPRegSet; import lib.dwfl.ElfPrpsinfo; import lib.dwfl.ElfPrstatus; -import lib.dwfl.ElfPrFPRegSet; +import frysk.isa.Register; +import frysk.isa.X8664Registers; +import frysk.proc.Proc; +import frysk.proc.Task; import frysk.sys.proc.AuxvBuilder; import frysk.sys.proc.CmdLineBuilder; import frysk.sys.proc.Stat; @@ -212,12 +208,31 @@ public class X8664LinuxElfCorefile extends LinuxElfCorefile { X8664Registers.GS}; // Set GP register info + int index = 0; + int arraySize = 0; + int regSize; + int wordSize = task.getISA().wordSize(); + + // Allocate space in array. Even though there are some registers < wordSize, they still have + // to sit in a wordSize area + for (int l = 0; l < ptraceRegisterMap.length; l++) + if (ptraceRegisterMap[l].getType().getSize() < wordSize) + arraySize +=wordSize; + else + arraySize +=ptraceRegisterMap[l].getType().getSize(); + + byte[] byteOrderedRegister= new byte[arraySize]; + + // Populate array, using wordSize as minimum size for (int i = 0; i < ptraceRegisterMap.length; i++) { - int registerSize = ptraceRegisterMap[i].getType().getSize(); - byte[] byteOrderedRegister = new byte[registerSize]; - task.access(ptraceRegisterMap[i], 0, registerSize, byteOrderedRegister, 0, false); - prStatus.setPrGPReg(i,bytesToBigInteger(byteOrderedRegister)); + regSize = ptraceRegisterMap[i].getType().getSize(); + if (regSize < wordSize) + regSize = wordSize; + task.access(ptraceRegisterMap[i], 0, regSize, byteOrderedRegister, index, false); + index += regSize; } + + prStatus.setPrGPRegisterBuffer(byteOrderedRegister); // Write it nhdrEntry.setNhdrDesc(ElfNhdrType.NT_PRSTATUS, prStatus); @@ -285,21 +300,4 @@ public class X8664LinuxElfCorefile extends LinuxElfCorefile { return ElfEHeader.PHEADER_ELFCLASS64; } - // XXX: Function to convert bytes[] to BigInteger. - // Will disappear when all BankRegisters are present on all - // all architectures, and we can call task.access() on all - // registers, and not convert to BigInteger. - private BigInteger bytesToBigInteger(byte[] bytes) - { - if (this.process.getMainTask().getISA().order() == ByteOrder.LITTLE_ENDIAN) { - for (int left = 0; left < bytes.length / 2; left++) { - int right = bytes.length - 1 - left; - byte temp = bytes[left]; - bytes[left] = bytes[right]; - bytes[right] = temp; - } - } - return new BigInteger(bytes); - } - } diff --git a/frysk-sys/lib/dwfl/ChangeLog b/frysk-sys/lib/dwfl/ChangeLog index 7debe8b..4e0117e 100644 --- a/frysk-sys/lib/dwfl/ChangeLog +++ b/frysk-sys/lib/dwfl/ChangeLog @@ -1,3 +1,12 @@ +2007-11-29 Phil Muldoon + + * cni/ElfPrstatus.cxx (ElfPrstatus::fillMemRegion): Copy + buffer to structure, do not build buffer. + * ElfPrstatus.java (setPrGPRegisterBuffer): New. + (setPrGPReg): Delete. + (convertToLong): Delete. + (getPrGPRegIterator): Delete. + 2007-11-20 Stan Cox * BaseTypes.java: Remove. diff --git a/frysk-sys/lib/dwfl/ElfPrstatus.java b/frysk-sys/lib/dwfl/ElfPrstatus.java index 6c2e999..0539521 100644 --- a/frysk-sys/lib/dwfl/ElfPrstatus.java +++ b/frysk-sys/lib/dwfl/ElfPrstatus.java @@ -41,7 +41,6 @@ package lib.dwfl; import java.util.ArrayList; import java.util.Iterator; -import java.math.BigInteger; import inua.eio.ArrayByteBuffer; import inua.eio.ByteBuffer; import inua.eio.ByteOrder; @@ -77,10 +76,7 @@ public class ElfPrstatus extends ElfNhdr.ElfNoteSectionEntry hooks/post-receive -- frysk system monitor/debugger