public inbox for frysk-cvs@sourceware.org help / color / mirror / Atom feed
From: pmuldoon@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Complete move to constructing GPR notes as byte buffers, not BigIntegers. Date: Thu, 29 Nov 2007 09:40:00 -0000 [thread overview] Message-ID: <20071129094059.24823.qmail@sourceware.org> (raw) 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 <pmuldoon@redhat.com> 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 <pmuldoon@redhat.com> * 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 <pmuldoon@redhat.com> * 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 <pmuldoon@redhat.com> + + * 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 <timoore@redhat.com> * 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-<ISA>/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-<ISA>/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 <pmuldoon@redhat.com> + + * 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 <scox@redhat.com> * 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
reply other threads:[~2007-11-29 9:40 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20071129094059.24823.qmail@sourceware.org \ --to=pmuldoon@sourceware.org \ --cc=frysk-cvs@sourceware.org \ --cc=frysk@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).