From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25999 invoked by alias); 25 Feb 2008 17:17:21 -0000 Received: (qmail 25961 invoked by uid 367); 25 Feb 2008 17:17:19 -0000 Date: Mon, 25 Feb 2008 17:17:00 -0000 Message-ID: <20080225171719.25946.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: frysk-core/frysk/hpd/ChangeLog X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 8ae8b5bbf07d2a0dde2b5db8bcf01199e3ea2ced X-Git-Newrev: cc4b69ddad67f0d3efcb1574f32f37d0ad3e92e6 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: 2008-q1/txt/msg00244.txt.bz2 The branch, master has been updated via cc4b69ddad67f0d3efcb1574f32f37d0ad3e92e6 (commit) from 8ae8b5bbf07d2a0dde2b5db8bcf01199e3ea2ced (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit cc4b69ddad67f0d3efcb1574f32f37d0ad3e92e6 Author: Andrew Cagney Date: Mon Feb 25 12:15:29 2008 -0500 frysk-core/frysk/hpd/ChangeLog 2008-02-25 Andrew Cagney * LoadCommand.java: Use LinuxExeFactory. frysk-core/frysk/proc/dead/ChangeLog 2008-02-25 Andrew Cagney * LinuxExeFactory.java: New. Merge in LinuxExeHost, LinuxExeProc, and LinuxExeTask. * LinuxExeHost.java: Simplify. * LinuxExeProc.java: Simplify. * LinuxExeTask.java: Simplify. * ExeByteBuffer.java (ExeByteBuffer(MemoryMap[])): Replace ExeByteBuffer(ArrayList). * TestLinuxExe.java: Update. frysk-core/frysk/util/ChangeLog 2008-02-25 Andrew Cagney * ProcStopUtil.java: Use LinuxExeFactory. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/hpd/ChangeLog | 4 + frysk-core/frysk/hpd/LoadCommand.java | 11 +-- frysk-core/frysk/proc/dead/ChangeLog | 11 +++ frysk-core/frysk/proc/dead/ExeByteBuffer.java | 53 +++++------- .../{LinuxExeTask.java => LinuxExeFactory.java} | 85 ++++++++---------- frysk-core/frysk/proc/dead/LinuxExeHost.java | 92 ++------------------ frysk-core/frysk/proc/dead/LinuxExeProc.java | 67 ++++----------- frysk-core/frysk/proc/dead/LinuxExeTask.java | 35 ++------ frysk-core/frysk/proc/dead/TestLinuxExe.java | 75 ++-------------- frysk-core/frysk/util/ChangeLog | 4 + frysk-core/frysk/util/ProcStopUtil.java | 7 +- 11 files changed, 128 insertions(+), 316 deletions(-) copy frysk-core/frysk/proc/dead/{LinuxExeTask.java => LinuxExeFactory.java} (61%) First 500 lines of diff: diff --git a/frysk-core/frysk/hpd/ChangeLog b/frysk-core/frysk/hpd/ChangeLog index 7862c42..fc9b4d7 100644 --- a/frysk-core/frysk/hpd/ChangeLog +++ b/frysk-core/frysk/hpd/ChangeLog @@ -1,3 +1,7 @@ +2008-02-25 Andrew Cagney + + * LoadCommand.java: Use LinuxExeFactory. + 2008-02-21 Nurdin Premji * StepCommand.java (StepCommand): Added -instruction parameter. diff --git a/frysk-core/frysk/hpd/LoadCommand.java b/frysk-core/frysk/hpd/LoadCommand.java index bbd9893..4bc03ae 100644 --- a/frysk-core/frysk/hpd/LoadCommand.java +++ b/frysk-core/frysk/hpd/LoadCommand.java @@ -40,16 +40,12 @@ package frysk.hpd; import java.io.File; -//import java.util.HashMap; import java.util.Iterator; -//import java.util.Map; -//import java.util.Set; +import frysk.proc.dead.LinuxExeFactory; import frysk.debuginfo.DebugInfo; import frysk.debuginfo.DebugInfoFrame; import frysk.debuginfo.DebugInfoStackFactory; import frysk.dwfl.DwflCache; -import frysk.proc.Host; -import frysk.proc.dead.LinuxExeHost; import frysk.proc.Manager; import frysk.proc.Proc; import frysk.proc.Task; @@ -112,8 +108,9 @@ public class LoadCommand extends ParameterizedCommand { ("File does not exist or is not readable or is not a file."); } - Host exeHost = new LinuxExeHost(Manager.eventLoop, executableFile); - Proc exeProc = frysk.util.Util.getProcFromExeFile(exeHost); + Proc exeProc = LinuxExeFactory.createProc(Manager.eventLoop, + executableFile, + cmd.stringArrayValue()); int procID; if (cli.taskID < 0) diff --git a/frysk-core/frysk/proc/dead/ChangeLog b/frysk-core/frysk/proc/dead/ChangeLog index a79fb3b..f09f868 100644 --- a/frysk-core/frysk/proc/dead/ChangeLog +++ b/frysk-core/frysk/proc/dead/ChangeLog @@ -1,3 +1,14 @@ +2008-02-25 Andrew Cagney + + * LinuxExeFactory.java: New. Merge in LinuxExeHost, LinuxExeProc, + and LinuxExeTask. + * LinuxExeHost.java: Simplify. + * LinuxExeProc.java: Simplify. + * LinuxExeTask.java: Simplify. + * ExeByteBuffer.java (ExeByteBuffer(MemoryMap[])): Replace + ExeByteBuffer(ArrayList). + * TestLinuxExe.java: Update. + 2008-02-20 Andrew Cagney * LinuxExeProc.java (sendRefresh()): Delete. diff --git a/frysk-core/frysk/proc/dead/ExeByteBuffer.java b/frysk-core/frysk/proc/dead/ExeByteBuffer.java index cde7b8d..59f6d09 100644 --- a/frysk-core/frysk/proc/dead/ExeByteBuffer.java +++ b/frysk-core/frysk/proc/dead/ExeByteBuffer.java @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2007, Red Hat Inc. +// Copyright 2007, 2008, Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -40,52 +40,41 @@ package frysk.proc.dead; import java.io.File; -import java.util.ArrayList; -import java.util.Iterator; - import frysk.sys.StatelessFile; import frysk.proc.MemoryMap; - import inua.eio.ByteBuffer; public class ExeByteBuffer extends ByteBuffer { - ArrayList metaData = new ArrayList(); + private final MemoryMap[] memoryMaps; + private final StatelessFile[] statelessFiles; + private final byte[] buffer = new byte[1]; - protected ExeByteBuffer(long lowWater, long highWater) { - super(lowWater, highWater); - } - - public ExeByteBuffer(ArrayList metaData) - { + public ExeByteBuffer(MemoryMap[] memoryMaps) { super(0,-1); - - this.metaData = metaData; + this.memoryMaps = memoryMaps; + this.statelessFiles = new StatelessFile[memoryMaps.length]; } protected int peek(long caret) { - - Iterator i = metaData.iterator(); - MemoryMap line = null; long offset = -1; - byte[] buffer = new byte[1]; - - while (i.hasNext()) - { - line = ((MemoryMap)i.next()); - if ((caret >= line.addressLow) && (caret<= line.addressHigh)) - { - offset = line.offset + (caret - line.addressLow); - break; - } + int i; + MemoryMap line = null; + for (i = 0; i < memoryMaps.length; i++) { + line = memoryMaps[i]; + if ((caret >= line.addressLow) && (caret<= line.addressHigh)) { + offset = line.offset + (caret - line.addressLow); + break; + } } - - if (offset == -1) + if (i >= memoryMaps.length) throw new RuntimeException("Cannot find memory in exe file"); - - StatelessFile temp = new StatelessFile(new File(line.name)); + StatelessFile temp = statelessFiles[i]; + if (temp == null) { + temp = new StatelessFile(new File(line.name)); + statelessFiles[i] = temp; + } temp.pread(offset, buffer,0,1); - return buffer[0]; } diff --git a/frysk-core/frysk/proc/dead/LinuxExeTask.java b/frysk-core/frysk/proc/dead/LinuxExeFactory.java similarity index 61% copy from frysk-core/frysk/proc/dead/LinuxExeTask.java copy to frysk-core/frysk/proc/dead/LinuxExeFactory.java index 4d90354..28d0082 100644 --- a/frysk-core/frysk/proc/dead/LinuxExeTask.java +++ b/frysk-core/frysk/proc/dead/LinuxExeFactory.java @@ -39,59 +39,50 @@ package frysk.proc.dead; -import inua.eio.ArrayByteBuffer; -import inua.eio.ByteBuffer; -import frysk.isa.banks.RegisterBanks; -import frysk.isa.ISA; +import java.io.File; +import java.util.List; +import java.util.LinkedList; import lib.dwfl.Elf; import lib.dwfl.ElfCommand; import lib.dwfl.ElfEHeader; -import lib.dwfl.ElfException; -import java.io.File; - -public class LinuxExeTask extends DeadTask { - private final long pc; - private final LinuxExeProc proc; +import frysk.proc.MemoryMap; +import frysk.event.EventLoop; - LinuxExeTask(LinuxExeProc proc, ISA isa) { - super(proc, 0, isa, constructRegisterBanks(isa)); - this.proc = proc; - // Compute a Fake PC. XXX should be done in Proc instead of - // creating Elf object in the Task itself. - Elf e = null; - long pc; +public class LinuxExeFactory { + public static LinuxExeProc createProc(EventLoop eventLoop, + final File exeFile, + String[] args) { + Elf exeElf = null; try { - e = new Elf(new File(getProc().getExe()), ElfCommand.ELF_C_READ); - ElfEHeader h = e.getEHeader(); - pc = h.entry; - } catch (ElfException ee) { - // Nice try, just give up. - pc = 0; + exeElf = new Elf(exeFile, ElfCommand.ELF_C_READ); + ElfEHeader eHeader = exeElf.getEHeader(); + class BuildExeMaps extends SOLibMapBuilder { + private final List metaData = new LinkedList(); + public void buildMap(long addrLow, long addrHigh, boolean permRead, + boolean permWrite, boolean permExecute, + long offset, String name, long align) { + metaData.add(new MemoryMap(addrLow, addrHigh, permRead, + permWrite, permExecute, false, + offset, -1, -1, -1, -1, -1, + exeFile.getAbsolutePath())); + } + MemoryMap[] getMemoryMaps() { + MemoryMap[] memoryMaps = new MemoryMap[metaData.size()]; + metaData.toArray(memoryMaps); + return memoryMaps; + } + } + BuildExeMaps SOMaps = new BuildExeMaps(); + // Add in case for executables maps. + SOMaps.construct(exeFile, 0); + + LinuxExeHost host + = new LinuxExeHost(exeFile, eHeader, SOMaps.getMemoryMaps(), + args); + return host.getProc(); } finally { - if (e != null) - e.close(); + if (exeElf != null) + exeElf.close(); } - this.pc = pc; - } - - public long getPC() { - return pc; - } - - public ByteBuffer getMemory() { - return proc.getMemory(); } - - private static RegisterBanks constructRegisterBanks(ISA isa) { - ByteBuffer[] bankBuffers = new ByteBuffer[4]; - // Create an empty page - byte[] emptyBuffer = new byte[4096]; - for (int i = 0; i < emptyBuffer.length; i++) - emptyBuffer[i] = 0; - bankBuffers[0] = new ArrayByteBuffer(emptyBuffer); - bankBuffers[1] = new ArrayByteBuffer(emptyBuffer); - bankBuffers[2] = new ArrayByteBuffer(emptyBuffer); - bankBuffers[3] = new ArrayByteBuffer(emptyBuffer); - return CorefileRegisterBanksFactory.create(isa, bankBuffers); - } } diff --git a/frysk-core/frysk/proc/dead/LinuxExeHost.java b/frysk-core/frysk/proc/dead/LinuxExeHost.java index 7dd7431..a9932e0 100644 --- a/frysk-core/frysk/proc/dead/LinuxExeHost.java +++ b/frysk-core/frysk/proc/dead/LinuxExeHost.java @@ -40,100 +40,24 @@ package frysk.proc.dead; import java.io.File; -import java.util.Iterator; -import java.util.List; -import java.util.LinkedList; - -import lib.dwfl.Elf; -import lib.dwfl.ElfCommand; -import lib.dwfl.ElfData; import lib.dwfl.ElfEHeader; -import lib.dwfl.ElfPHeader; - -import frysk.event.EventLoop; -import frysk.proc.Proc; -import frysk.proc.ProcId; +import frysk.proc.MemoryMap; public class LinuxExeHost extends DeadHost { - - protected File exeFile = null; - EventLoop eventLoop = null; - Elf exeFileElf = null; + private final File exeFile; + private final LinuxExeProc proc; - public LinuxExeHost(EventLoop eventLoop, File exeFile) { + LinuxExeHost(File exeFile, ElfEHeader eHeader, MemoryMap[] memoryMaps, + String[] args) { this.exeFile = exeFile; - this.eventLoop = eventLoop; - this.exeFileElf = new Elf(exeFile, ElfCommand.ELF_C_READ); - // Iterate (build) the /proc tree, passing each found PID to - // procChanges where it can update the /proc tree. - // Changes individual process. - new DeconstructExeFile(this.exeFileElf); - for (Iterator i = procPool.values().iterator(); i.hasNext();) { - LinuxExeProc proc = (LinuxExeProc) i.next(); - proc.sendRefresh(); - } - } - - private class DeconstructExeFile - { - List addedProcs = new LinkedList(); - Elf exeFileElf; - ElfData noteData = null; - - DeconstructExeFile(Elf exeFileElf) - { - this.exeFileElf = exeFileElf; - ElfEHeader eHeader = this.exeFileElf.getEHeader(); - - // Get number of program header entries. - long phSize = eHeader.phnum; - for (int i=0; i