* Initial core file notes extraction for elf
@ 2007-02-12 23:12 Phil Muldoon
2007-02-12 23:19 ` Roland McGrath
0 siblings, 1 reply; 5+ messages in thread
From: Phil Muldoon @ 2007-02-12 23:12 UTC (permalink / raw)
To: Frysk Hackers
[-- Attachment #1: Type: text/plain, Size: 212 bytes --]
Patch included is an initial implementation. Exposes .note information
found in core files via the Java libelf bindings. This work is needed so
that core files can be modeled in the frysk-core.
Regards
Phil
[-- Attachment #2: notes.patch --]
[-- Type: text/x-patch, Size: 26892 bytes --]
Index: lib/elf/ChangeLog
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/ChangeLog,v
retrieving revision 1.62
diff -i -r1.62 ChangeLog
0a1,27
> 2007-02-12 Phil Muldoon <pmuldoon@redhat.com>
>
> * Elf.java (getRawData): New. Return raw elf data.
> * cni/Elf.cxx (elf_get_raw_data): Return raw byte data.
>
> * tests/TestElf.java (testElfCorePrpsNotes): New.Test Prpsinfo notes.
> (testElfCorePrstatusNotes): New. Test Prstatus notes.
> (testElfCorePrAuxvNotes): New. Test Auxv notes.
>
> * cni/ElfPrpsinfo.cxx (getNoteData): New. Parse raw note
> data and find relevant note section.
> * cni/ElfPrAuxv.cxx (getNoteData): Ditto
> * cni/ElfPrstatus.cxx (getNoteData): Ditto
> * cni/ElfData.cxx (elf_data_create_native): New. Create underlying
> native data structures.
>
> * ElfPrstatus.java (ElfPrstatus): New Constructor.
> (getRawCoreRegisters): New.
> (getThreadData): New.
> (getPrCurSig): Rename.
> * ElfPrpsinfo.java (ElfPrpsinfo): New Constructor.
> * ElfPrAuxv.java (ElfPrAuxv): New Constructor.
> (getAuxvBuffer): Return auxv data in raw form.
> * ElfData.java (ElfData): New constructor to take raw byte[] data
> and package into an ElfData class.
> (setBuffer): Take a size argument.
>
Index: lib/elf/Elf.java
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/Elf.java,v
retrieving revision 1.22
diff -i -r1.22 Elf.java
3c3
< // Copyright 2005, Red Hat Inc.
---
> // Copyright 2005, 2006, 2007 Red Hat Inc.
441a442,453
> /**
> * @return Elf data packaged in ElfData class from
> * given offset and size.
> *
> */
> public ElfData getRawData(long offset, long size)
> {
>
> return elf_get_raw_data(offset,size);
> }
>
>
514a527,528
> protected native ElfData elf_get_raw_data(long offset, long size);
>
Index: lib/elf/ElfData.java
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/ElfData.java,v
retrieving revision 1.9
diff -i -r1.9 ElfData.java
3c3
< // Copyright 2005, Red Hat Inc.
---
> // Copyright 2005,2007 Red Hat Inc.
41d40
<
51a51,63
>
> /**
> *
> * Package buffer in an ElfData object.
> *
> */
> public ElfData(byte[] buffer, Elf parent)
> {
> this.parent = parent;
> this.pointer = elf_data_create_native();
> setBuffer(buffer);
> }
>
65c77
< elf_data_set_buff();
---
> elf_data_set_buff(e_buffer.length);
190a203
> native protected long elf_data_create_native();
192c205
< native protected void elf_data_set_buff();
---
> native protected void elf_data_set_buff(long length);
Index: lib/elf/ElfPrAuxv.java
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/ElfPrAuxv.java,v
retrieving revision 1.1
diff -i -r1.1 ElfPrAuxv.java
3c3
< // Copyright 2006, Red Hat Inc.
---
> // Copyright 2006, 2007 Red Hat Inc.
50a51,62
>
> /**
> *
> * Extract note information from a section
> * containing note data
> *
> */
> public ElfPrAuxv(ElfData noteData)
> {
> getNoteData(noteData);
> }
>
69a82,94
> /**
> *
> * Return auxv data, in raw form
> *
> * @return: buffer - byte[] array containing buffer
> *
> */
> public byte[] getAuxvBuffer()
> {
> return this.auxBuffer;
> }
>
>
71a97
> public native long getNoteData(ElfData data);
Index: lib/elf/ElfPrpsinfo.java
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/ElfPrpsinfo.java,v
retrieving revision 1.4
diff -i -r1.4 ElfPrpsinfo.java
3a4
> // Copyright 2007, Red Hat, Inc.
78c79,90
<
---
>
> /**
> *
> * Extract note information from a section
> * containing note data
> *
> */
> public ElfPrpsinfo(ElfData noteData)
> {
> getNoteData(noteData);
> }
>
223c235,236
<
---
>
> public native long getNoteData(ElfData data);
Index: lib/elf/ElfPrstatus.java
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/ElfPrstatus.java,v
retrieving revision 1.1
diff -i -r1.1 ElfPrstatus.java
3c3
< // Copyright 2006, Red Hat Inc.
---
> // Copyright 2006,2007, Red Hat Inc.
42a43
> import java.util.Iterator;
47c48
< * Java Representation of the the PRSTATUS notes seciont
---
> * Java Representation of the the PRSTATUS notes secion
59a61,65
> private long pr_info_si_signo;
> private long pr_info_si_code;
> private long pr_info_si_errno;
> private int pr_fpvalid;
>
61a68
> private byte raw_core_registers[];
63a71
> ArrayList internalThreads = new ArrayList();
66a75,99
>
> /**
> *
> * Extract note information from a section
> * containing note data
> *
> */
> public ElfPrstatus(ElfData noteData)
> {
> getNoteData(noteData);
> }
>
> /**
> * Returns the raw byte[] data
> * representing the register data.
> */
> public byte[] getRawCoreRegisters()
> {
> return raw_core_registers;
> }
>
> public ArrayList getThreadData()
> {
> return internalThreads;
> }
203c236
< public long getPrCurSigd()
---
> public long getPrCurSig()
221c254,300
< /**
---
> public Iterator getPrGPRegIterator()
> {
> return pr_reg.iterator();
> }
>
> public void setPrInfoSiSigno(long pr_info_si_signo)
> {
> this.pr_info_si_signo = pr_info_si_signo;
> }
>
> public long getPrInfoSiSigno()
> {
> return this.pr_info_si_signo;
> }
>
> public void setPrInfoSiCode(long pr_info_si_code)
> {
> this.pr_info_si_code = pr_info_si_code;
> }
>
> public long getPrInfoSiCode()
> {
> return this.pr_info_si_code;
> }
>
> public void setPrInfoSiErrno(long pr_info_si_errno)
> {
> this.pr_info_si_errno = pr_info_si_errno;
> }
>
> public long getPrInfoSiErrno()
> {
> return this.pr_info_si_errno;
> }
>
> public void setPrFPValid(int pr_fpvalid)
> {
> this.pr_fpvalid = pr_fpvalid;
> }
>
> public long getPrFPValid()
> {
> return this.pr_fpvalid;
> }
>
>
> /**
234a314
> public native long getNoteData(ElfData data);
Index: lib/elf/cni/Elf.cxx
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/cni/Elf.cxx,v
retrieving revision 1.26
diff -i -r1.26 Elf.cxx
55a56
> #include "lib/elf/ElfData.h"
401a403,412
> lib::elf::ElfData* lib::elf::Elf::elf_get_raw_data (jlong offset, jlong size)
> {
> char *mem = gelf_rawchunk((::Elf*) this->pointer,offset,size);
> jbyteArray bytes = JvNewByteArray(size);
> memcpy(elements(bytes),mem,size);
> lib::elf::ElfData *data = new lib::elf::ElfData(bytes,this);
> gelf_freechunk((::Elf*) this->pointer,mem);
> return data;
> }
>
Index: lib/elf/cni/ElfData.cxx
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/cni/ElfData.cxx,v
retrieving revision 1.7
diff -i -r1.7 ElfData.cxx
3c3
< // Copyright 2005, Red Hat Inc.
---
> // Copyright 2005,2007 Red Hat Inc.
51a52,53
> Elf_Data *native = NULL;
>
54a57,66
> JvFree(native);
> }
>
>
> jlong
> lib::elf::ElfData::elf_data_create_native ()
> {
> native = (Elf_Data*)JvMalloc(sizeof(Elf_Data));
> native->d_type = ELF_T_BYTE;
> return (jlong) native;
72c84
< lib::elf::ElfData::elf_data_set_buff (){
---
> lib::elf::ElfData::elf_data_set_buff (jlong size){
75a88
> ((Elf_Data*) this->pointer)->d_size = size;
Index: lib/elf/cni/ElfPrAuxv.cxx
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/cni/ElfPrAuxv.cxx,v
retrieving revision 1.1
diff -i -r1.1 ElfPrAuxv.cxx
3c3
< // Copyright 2006, Red Hat Inc.
---
> // Copyright 2006,2007 Red Hat Inc.
46a47,51
> #include "lib/elf/ElfData.h"
> #include "lib/elf/ElfException.h"
> #include "libelf.h"
> #include "elf.h"
> #include "gelf.h"
71a77
> extern jbyteArray auxBuffer;
73c79,117
<
---
> jlong
> lib::elf::ElfPrAuxv::getNoteData(ElfData *data)
> {
> void *elf_data = ((Elf_Data*)data->getPointer())->d_buf;
> GElf_Nhdr *nhdr = (GElf_Nhdr *)elf_data;
> long note_loc =0;
> long note_data_loc = 0;
>
> // Find auxv note data. If the first note header is not auxv
> // loop through, adding up header + align + data till we find the
> // next header. Continue until section end to find correct header.
> while ((nhdr->n_type != NT_AUXV) && (note_loc <= data->getSize()))
> {
> note_loc += (sizeof (GElf_Nhdr) + ((nhdr->n_namesz + 0x03) & ~0x3)) + nhdr->n_descsz;
> if (note_loc >= data->getSize())
> break;
> nhdr = (GElf_Nhdr *) (((unsigned char *)elf_data) + note_loc);
> }
>
> // If loop through entire note section, and header not found, return
> // here with abnormal return code.
> if (nhdr->n_type != NT_AUXV)
> return 1;
>
> // Find data at current header + alignment
> note_data_loc = (note_loc + sizeof(GElf_Nhdr) + ((nhdr->n_namesz + 0x03) & ~0x3));
>
> // Run some sanity checks, as we will be doing void pointer -> cast math.
> if ((nhdr->n_descsz > data->getSize()) || (nhdr->n_descsz > (data->getSize()-note_data_loc)))
> {
> throw new lib::elf::ElfException(JvNewStringUTF("note size and elf_data size mismatch"));
> }
>
> auxBuffer = JvNewByteArray(nhdr->n_descsz);
>
> memcpy(elements(this->auxBuffer),((unsigned char *)elf_data)+note_data_loc, nhdr->n_descsz);
>
> return 0;
> }
Index: lib/elf/cni/ElfPrpsinfo.cxx
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/cni/ElfPrpsinfo.cxx,v
retrieving revision 1.3
diff -i -r1.3 ElfPrpsinfo.cxx
3a4
> // Copyright 2007, Red Hat Inc.
44a46,48
> #include <gelf.h>
> #include <errno.h>
>
46a51,52
> #include "lib/elf/ElfData.h"
> #include "lib/elf/ElfException.h"
129a136,192
>
> jlong
> lib::elf::ElfPrpsinfo::getNoteData(ElfData *data)
> {
> void *elf_data = ((Elf_Data*)data->getPointer())->d_buf;
> GElf_Nhdr *nhdr = (GElf_Nhdr *)elf_data;
> elf_prpsinfo *prpsinfo;
> long note_loc =0;
> long note_data_loc = 0;
>
> // Find Prpsinfo note data. If the first note header is not prpsinfo
> // loop through, adding up header + align + data till we find the
> // next header. Continue until section end to find correct header.
> while ((nhdr->n_type != NT_PRPSINFO) && (note_loc <= data->getSize()))
> {
> note_loc += (sizeof (GElf_Nhdr) + ((nhdr->n_namesz + 0x03) & ~0x3)) + nhdr->n_descsz;
> if (note_loc >= data->getSize())
> break;
> nhdr = (GElf_Nhdr *) (((unsigned char *)elf_data) + note_loc);
> }
>
> // If loop through entire note section, and header not found, return
> // here with abnormal return code.
> if (nhdr->n_type != NT_PRPSINFO)
> return 1;
>
> // Find data at current header + alignment
> note_data_loc = (note_loc + sizeof(GElf_Nhdr) + ((nhdr->n_namesz + 0x03) & ~0x3));
>
> // Run some sanity checks, as we will be doing void pointer -> cast math.
> if ((nhdr->n_descsz > sizeof(struct elf_prpsinfo)) || (nhdr->n_descsz > data->getSize())
> || (nhdr->n_descsz > (data->getSize()-note_data_loc)))
> {
> throw new lib::elf::ElfException(JvNewStringUTF("note size and elf_data size mismatch"));
> }
>
> // Point to the data, and cast.
> prpsinfo = (elf_prpsinfo *) (((unsigned char *) elf_data) + note_data_loc);
>
> // Fill Java class structures
> this->pr_state = prpsinfo->pr_state;
> this->pr_sname = prpsinfo->pr_sname;
> this->pr_zomb = prpsinfo->pr_zomb;
> this->pr_nice = prpsinfo->pr_nice;
> this->pr_flag = prpsinfo->pr_flag;
> this->pr_uid = prpsinfo->pr_uid;
> this->pr_gid = prpsinfo->pr_gid;
> this->pr_pid = prpsinfo->pr_pid;
> this->pr_ppid = prpsinfo->pr_ppid;
> this->pr_pgrp = prpsinfo->pr_pgrp;
> this->pr_sid = prpsinfo->pr_sid;
> this->pr_fname = JvNewStringLatin1(prpsinfo->pr_fname);
> this->pr_psargs = JvNewStringLatin1(prpsinfo->pr_psargs);
>
> return 0;
> }
>
Index: lib/elf/cni/ElfPrstatus.cxx
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/cni/ElfPrstatus.cxx,v
retrieving revision 1.3
diff -i -r1.3 ElfPrstatus.cxx
3c3
< // Copyright 2006, Red Hat, Inc.
---
> // Copyright 2006,2007 Red Hat, Inc.
52c52,55
< #include "lib/elf/ElfPrstatus.h"
---
> #include "elf.h"
> #include "libelf.h"
> #include "gelf.h"
>
53a57,61
> #include "lib/elf/ElfPrstatus.h"
> #include "lib/elf/ElfData.h"
> #include "lib/elf/ElfException.h"
> #include <java/util/ArrayList.h>
> #include <java/math/BigInteger.h>
173a182,255
>
> extern ArrayList internalThreads;
> jlong
> lib::elf::ElfPrstatus::getNoteData(ElfData *data)
> {
> void *elf_data = ((Elf_Data*)data->getPointer())->d_buf;
> GElf_Nhdr *nhdr = (GElf_Nhdr *)elf_data;
> elf_prstatus *prstatus;
> long note_loc =0;
> long note_data_loc = 0;
>
>
> // Can have more that on Prstatus note per core file. Collect all of them.
> while (note_loc <= data->getSize())
> {
> // Find Prstatus note data. If the first note header is not prstatus
> // loop through, adding up header + align + data till we find the
> // next header. Continue until section end to find correct header.
>
> while ((nhdr->n_type != NT_PRSTATUS) && (note_loc <= data->getSize()))
> {
> note_loc += (sizeof (GElf_Nhdr) + ((nhdr->n_namesz + 0x03) & ~0x3)) + nhdr->n_descsz;
> if (note_loc >= data->getSize())
> break;
> nhdr = (GElf_Nhdr *) (((unsigned char *)elf_data) + note_loc);
> }
>
> // If loop through entire note section, and header not found, return
> // here with abnormal return code.
> if (nhdr->n_type != NT_PRSTATUS)
> return -1;
>
> // Find data at current header + alignment
> note_data_loc = (note_loc + sizeof(GElf_Nhdr) + ((nhdr->n_namesz + 0x03) & ~0x3));
>
> // Run some sanity checks, as we will be doing void pointer -> cast math.
> if ((nhdr->n_descsz > sizeof(struct elf_prstatus)) || (nhdr->n_descsz > data->getSize())
> || (nhdr->n_descsz > (data->getSize()-note_data_loc)))
> {
> throw new lib::elf::ElfException(JvNewStringUTF("note size and elf_data size mismatch"));
> }
>
> // Point to the data, and cast.
> prstatus = (elf_prstatus *) (((unsigned char *) elf_data) + note_data_loc);
>
> // Fill Java class structures
>
> this->pr_info_si_signo = prstatus->pr_info.si_signo;
> this->pr_info_si_code = prstatus->pr_info.si_code;
> this->pr_info_si_errno = prstatus->pr_info.si_errno;
>
> this->pr_cursig = prstatus->pr_cursig;
> this->pr_sigpend = prstatus->pr_sigpend;
> this->pr_sighold = prstatus->pr_sighold;
>
> this->pr_pid = prstatus->pr_pid;
> this->pr_ppid = prstatus->pr_ppid;
> this->pr_pgrp = prstatus->pr_pgrp;
> this->pr_sid = prstatus->pr_sid;
> this->pr_fpvalid = prstatus->pr_fpvalid;
>
> raw_core_registers = JvNewByteArray(sizeof (prstatus->pr_reg));
>
> memcpy(elements(raw_core_registers),prstatus->pr_reg,sizeof(prstatus->pr_reg));
>
> internalThreads->add(this);
>
> // Move pointer along, now we have processed the first thread
> note_loc += (sizeof (GElf_Nhdr) + ((nhdr->n_namesz + 0x03) & ~0x3)) + nhdr->n_descsz;
> nhdr = (GElf_Nhdr *) (((unsigned char *)elf_data) + note_loc);
> }
>
> return 0;
> }
Index: lib/elf/tests/TestElf.java
===================================================================
RCS file: /cvs/frysk/frysk-imports/lib/elf/tests/TestElf.java,v
retrieving revision 1.15
diff -i -r1.15 TestElf.java
46a47,48
> import java.nio.ByteBuffer;
> import java.nio.ByteOrder;
52d53
< import lib.elf.ElfPHeader;
54a56
> import lib.elf.ElfPHeader;
57a60,64
> import lib.elf.ElfPrpsinfo;
> import lib.elf.ElfPrAuxv;
> import lib.elf.ElfPrstatus;
>
> import frysk.sys.proc.AuxvBuilder;
128a136,344
>
>
> }
>
> /**
> * Test Prpsinfo note info. Read the note data segment, pass it to
> * ElfPrpsinfo to find the relative pstatus data, and parse.
> *
> */
> public void testElfCorePrpsNotes () throws ElfException, ElfFileException
> {
>
> Elf testElf = new Elf (new File (Config.getPkgDataDir (), "test-core")
> .getAbsolutePath (), ElfCommand.ELF_C_READ);
> assertEquals(testElf.getKind(), ElfKind.ELF_K_ELF);
> assertEquals(testElf.getBase(), 0);
>
> ElfData noteData = findNoteSegment(testElf);
>
> assertNotNull("Cannot find notes section", noteData);
>
> ElfPrpsinfo elfPrpsinfo = new ElfPrpsinfo(noteData);
> //assertEquals("note: state", 'R', elfPrpsinfo.getPrState());
> assertEquals("note zombie", 0, elfPrpsinfo.getPrZomb());
> assertEquals("note: nice", 0, elfPrpsinfo.getPrNice());
> assertEquals("note: flags",8390144, elfPrpsinfo.getPrFlag()); //0x00800600
> assertEquals("note: uid", 500, elfPrpsinfo.getPrUid());
> assertEquals("note: gid", 100, elfPrpsinfo.getPrGid());
> assertEquals("note: pid", 31497, elfPrpsinfo.getPrPid());
> assertEquals("note: ppid", 20765, elfPrpsinfo.getPrPpid());
> assertEquals("note: pgrp", 31497, elfPrpsinfo.getPrPgrp());
> assertEquals("note: sid", 20765, elfPrpsinfo.getPrSid());
> assertEquals("note: fname","a.out", elfPrpsinfo.getPrFname());
> assertEquals("note: args","./a.out ", elfPrpsinfo.getPrPsargs());
>
> }
>
> /**
> * Test Prstatus note info. Read the note data segment, pass it to
> * ElfPrstatus to find the relative pstatus data, and parse.
> *
> */
>
> public void testElfCorePrstatusNotes () throws ElfException, ElfFileException
> {
>
> // Matched against eu-read -n on the core file.
> // XXX: This tests need an x86_64 core file, as well.
>
> // Note segment of 472 bytes at offset 0x1f4:
> // Owner Data size Type
> // CORE 144 PRSTATUS
> // SIGINFO: signo: 6, code = 0, errno = 0
> // signal: 6, pending: 00000000, holding: 0
> // pid: 31497, ppid = 20765, pgrp = 31497, sid = 20765
> // utime: 0.000000s, stime: 0.000000s
> // cutime: 0.000000s, cstime: 0.000000s
> // eax: 00000000 ebx: 00007b09 ecx: 00007b09 edx: 00000006
> // esi: bff0284c edi: 00b2cff4 ebp: bff027ac esp: bff02794
> // eip: 00170410 eflags: 00000246 original eax: 0000010e
> // cs: 0073 ds: 007b es: 007b fs: 0000 gs: 0033 ss: 007b
>
> Elf testElf = new Elf (new File (Config.getPkgDataDir (), "test-core")
> .getAbsolutePath (), ElfCommand.ELF_C_READ);
> assertEquals(testElf.getKind(), ElfKind.ELF_K_ELF);
> assertEquals(testElf.getBase(), 0);
>
> ElfData noteData = findNoteSegment(testElf);
>
> ElfPrstatus threads = new ElfPrstatus(noteData);
>
> // Should only be one thread in this core file.
> assertEquals("Number of threads",1,threads.getThreadData().size());
>
> ElfPrstatus elfPrstatusInfo = (ElfPrstatus) threads.getThreadData().get(0);
>
> assertEquals("note: Sig Info -> Sig No",6,elfPrstatusInfo.getPrInfoSiSigno());
> assertEquals("note: Sig Info -> Sig code",0,elfPrstatusInfo.getPrInfoSiCode());
> assertEquals("note: Sig Info -> Sig errno",0,elfPrstatusInfo.getPrInfoSiErrno());
> assertEquals("note: Current signal",6,elfPrstatusInfo.getPrCurSig());
> assertEquals("note: Pending signal",0,elfPrstatusInfo.getPrSigPending());
> assertEquals("note: Holding signal",0,elfPrstatusInfo.getPrSigHold());
> assertEquals("note: Pid",31497,elfPrstatusInfo.getPrPid());
> assertEquals("note: PPid",20765,elfPrstatusInfo.getPrPpid());
> assertEquals("note: Pgrp",31497,elfPrstatusInfo.getPrPgrp());
> assertEquals("note: Sid",20765,elfPrstatusInfo.getPrSid());
>
> // Order of registers in the raw buffer is defined in
> // usr/include/asm.user.h
> // ebc, ecx, edx, esi, edi and so on.
> //
> // long ebx, ecx, edx, esi, edi, ebp, eax;
> // unsigned short ds, __ds, es, __es;
> // unsigned short fs, __fs, gs, __gs;
> // long orig_eax, eip;
> // unsigned short cs, __cs;
> // long eflags, esp;
> // unsigned short ss, __ss;
>
> // Get raw register buffer.
> byte[] rawRegisterBuffer = elfPrstatusInfo.getRawCoreRegisters();
>
> assertEquals("note: ebx",0x00007b09,
> getRegisterByOffset(rawRegisterBuffer,0,4,ByteOrder.LITTLE_ENDIAN));
> assertEquals("note: ecx",0x00007b09,
> getRegisterByOffset(rawRegisterBuffer,4,4,ByteOrder.LITTLE_ENDIAN));
> assertEquals("note: edx",0x00000006,
> getRegisterByOffset(rawRegisterBuffer,8,4,ByteOrder.LITTLE_ENDIAN));
>
> BigInteger tmp = new BigInteger("3220187212"); //0xbff0284c
> assertEquals("note: esi",tmp.longValue(),
> getRegisterByOffset(rawRegisterBuffer,12,4,ByteOrder.LITTLE_ENDIAN));
> assertEquals("note: edi",0x00b2cff4,
> getRegisterByOffset(rawRegisterBuffer,16,4,ByteOrder.LITTLE_ENDIAN));
>
> tmp = new BigInteger("3220187052"); //0xbff027ac
> assertEquals("note: ebp",tmp.longValue(),
> getRegisterByOffset(rawRegisterBuffer,20,4,ByteOrder.LITTLE_ENDIAN));
> assertEquals("note: eax",0x00000000,
> getRegisterByOffset(rawRegisterBuffer,24,4,ByteOrder.LITTLE_ENDIAN));
>
> assertEquals("note: ds",0x0000007b,
> getRegisterByOffset(rawRegisterBuffer,28,2,ByteOrder.LITTLE_ENDIAN));
> assertEquals("note: es",0x0000007b,
> getRegisterByOffset(rawRegisterBuffer,32,2,ByteOrder.LITTLE_ENDIAN));
> assertEquals("note: fs",0x00000000,
> getRegisterByOffset(rawRegisterBuffer,36,2,ByteOrder.LITTLE_ENDIAN));
> assertEquals("note: gs",0x00000033,
> getRegisterByOffset(rawRegisterBuffer,40,2,ByteOrder.LITTLE_ENDIAN));
> assertEquals("note: oeax",0x0000010e,
> getRegisterByOffset(rawRegisterBuffer,44,4,ByteOrder.LITTLE_ENDIAN));
> assertEquals("note: eip",0x00170410,
> getRegisterByOffset(rawRegisterBuffer,48,4,ByteOrder.LITTLE_ENDIAN));
> assertEquals("note: cs",0x00000073,
> getRegisterByOffset(rawRegisterBuffer,52,4,ByteOrder.LITTLE_ENDIAN));
> assertEquals("note: eflags",0x00000246,
> getRegisterByOffset(rawRegisterBuffer,56,4,ByteOrder.LITTLE_ENDIAN));
>
> tmp = new BigInteger("3220187028");
> assertEquals("note: esp",tmp.longValue(),
> getRegisterByOffset(rawRegisterBuffer,60,4,ByteOrder.LITTLE_ENDIAN));
>
> }
>
> /**
> * Test PrAuxv note info. Read the note data segment, pass it to
> * ElfPrAuxv to find the relative pstatus data, and parse.
> *
> */
>
> public void testElfCorePrAuxvNotes () throws ElfException,
> ElfFileException
> {
>
> Elf testElf = new Elf (new File (Config.getPkgDataDir (), "test-core")
> .getAbsolutePath (), ElfCommand.ELF_C_READ);
> assertEquals(testElf.getKind(), ElfKind.ELF_K_ELF);
> assertEquals(testElf.getBase(), 0);
>
> ElfData noteData = findNoteSegment(testElf);
>
> final ElfPrAuxv prAuxv = new ElfPrAuxv(noteData);
> final int[] expectedIndex = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
> final int[] expectedType = {32,33,16,6,17,3,4,5,7,8,9,11,12,13,14,23,15,0};
> final BigInteger[] expectedVal = {new BigInteger("1508352",10),
> new BigInteger("1507328",10),
> new BigInteger("3219782655",10),
> new BigInteger("4096",10),
> new BigInteger("100",10),
> new BigInteger("134512692",10),
> new BigInteger("32",10),
> new BigInteger("7",10),
> new BigInteger("0",10),
> new BigInteger("0",10),
> new BigInteger("134513376",10),
> new BigInteger("500",10),
> new BigInteger("500",10),
> new BigInteger("100",10),
> new BigInteger("100",10),
> new BigInteger("0",10),
> new BigInteger("3220187851",10),
> new BigInteger("0",10)};
>
>
> AuxvBuilder builder = new AuxvBuilder()
> {
>
> int auxvIndex=0;
> public void buildBuffer (byte[] auxv)
> {
> }
>
> public void buildDimensions (int wordSize, boolean bigEndian, int length)
> {
> }
>
> public void buildAuxiliary (int index, int type, long val)
> {
> // Test the entries in the core file against the entries
> // stored in the arrays
> assertEquals("AuxV Index "+auxvIndex,expectedIndex[auxvIndex],index);
> assertEquals("AuxV Type "+auxvIndex,expectedType[auxvIndex],type);
> assertEquals("AuxV Val "+auxvIndex,expectedVal[auxvIndex],new BigInteger("" + val, 10));
> auxvIndex++;
> }
> };
> builder.construct(prAuxv.getAuxvBuffer());
>
>
205a422,486
> // Copied from frysk-core/Register.java and reused here.
> // Does this really not exist somewhere else?
> private static void reverseArray(byte[] array)
> {
> for (int left = 0, right = array.length - 1; left < right; left++, right--)
> {
> byte temp = array[right];
> array[right] = array[left];
> array[left] = temp;
> }
> }
>
> /**
> * Helper routine that given a buffer, offset and length returns a
> * register value as a long
> */
> private long getRegisterByOffset(byte[] buffer, int offset, int length, ByteOrder endian)
> {
> // Wrap buffer.
> ByteBuffer regBuffer = ByteBuffer.wrap(buffer);
> regBuffer.order(endian);
> long val = 0;
> byte[] regBytes = new byte[length];
>
> // Get the bytes at the offset and length, and
> // reverse if necessary.
>
> regBuffer.position(offset);
> regBuffer.get(regBytes, 0,length);
> if (regBuffer.order() == ByteOrder.LITTLE_ENDIAN)
> reverseArray(regBytes);
>
> // Convert byte array to long value.
> for (int i = 0; i < length; i++)
> val = val << 8 | (regBytes[i] & 0xff);
>
> return val;
> }
>
> /**
> * Helper routine that give an Elf object, find the
> * note segment and returns the contents in ElfData
> */
> private ElfData findNoteSegment(Elf testElf) throws ElfException, ElfFileException
> {
> // Get Elf Header.
> ElfEHeader eHeader = testElf.getEHeader();
> ElfData noteData = null;
>
> // Get number of program header entries.
> long phSize = eHeader.phnum;
> for (int i=0; i<phSize; i++)
> {
> // Test if pheader is of types notes..
> ElfPHeader pHeader = testElf.getPHeader(i);
> if (pHeader.type == ElfPHeader.PTYPE_NOTE)
> {
> // if so, copy, break an leave.
> noteData = testElf.getRawData(pHeader.offset,pHeader.filesz);
> break;
> }
> }
>
> return noteData;
> }
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Initial core file notes extraction for elf
2007-02-12 23:12 Initial core file notes extraction for elf Phil Muldoon
@ 2007-02-12 23:19 ` Roland McGrath
2007-02-12 23:23 ` Phil Muldoon
0 siblings, 1 reply; 5+ messages in thread
From: Roland McGrath @ 2007-02-12 23:19 UTC (permalink / raw)
To: Phil Muldoon; +Cc: Frysk Hackers
Never, ever, ever, run diff without -u.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Initial core file notes extraction for elf
2007-02-12 23:19 ` Roland McGrath
@ 2007-02-12 23:23 ` Phil Muldoon
2007-02-13 10:58 ` Mark Wielaard
0 siblings, 1 reply; 5+ messages in thread
From: Phil Muldoon @ 2007-02-12 23:23 UTC (permalink / raw)
To: Roland McGrath; +Cc: Frysk Hackers
Roland McGrath wrote:
> Never, ever, ever, run diff without -u.
>
Apologies. I run
cvs diff -i lib/elf/ >~/notes.patch
-i got transposed with -u. You'd think -u would be the default (maybe it
is ;)
Regards
Phil
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Initial core file notes extraction for elf
2007-02-12 23:23 ` Phil Muldoon
@ 2007-02-13 10:58 ` Mark Wielaard
2007-02-13 15:48 ` Phil Muldoon
0 siblings, 1 reply; 5+ messages in thread
From: Mark Wielaard @ 2007-02-13 10:58 UTC (permalink / raw)
To: Phil Muldoon; +Cc: Roland McGrath, Frysk Hackers
[-- Attachment #1: Type: text/plain, Size: 266 bytes --]
On Mon, 2007-02-12 at 17:22 -0600, Phil Muldoon wrote:
> You'd think -u would be the default (maybe it is ;)
No it isn't :( CVS defaults are not really sane imho.
Attached is my ~/.cvsrc that sets up the cvs defaults as I personally
would like them.
Cheers,
Mark
[-- Attachment #2: .cvsrc --]
[-- Type: text/plain, Size: 30 bytes --]
cvs -q -z3
diff -u
update -dP
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Initial core file notes extraction for elf
2007-02-13 10:58 ` Mark Wielaard
@ 2007-02-13 15:48 ` Phil Muldoon
0 siblings, 0 replies; 5+ messages in thread
From: Phil Muldoon @ 2007-02-13 15:48 UTC (permalink / raw)
To: Mark Wielaard; +Cc: Roland McGrath, Frysk Hackers
Mark Wielaard wrote:
> On Mon, 2007-02-12 at 17:22 -0600, Phil Muldoon wrote:
>
>> You'd think -u would be the default (maybe it is ;)
>>
>
> No it isn't :( CVS defaults are not really sane imho.
> Attached is my ~/.cvsrc that sets up the cvs defaults as I personally
> would like them.
>
>
Thanks for that. Apart from the -z3 our .cvsrc are the same. The problem
was, I created the diff/checked in the results from my sane fc5 box, not
my laptop, after the tests has passed. No .cvsrc there, but that has now
been corrected ;)
Regards
Phil
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2007-02-13 15:48 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-12 23:12 Initial core file notes extraction for elf Phil Muldoon
2007-02-12 23:19 ` Roland McGrath
2007-02-12 23:23 ` Phil Muldoon
2007-02-13 10:58 ` Mark Wielaard
2007-02-13 15:48 ` Phil Muldoon
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).