public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: pmuldoon@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Make auxv lookup entry point symbol. Discover auxv platform.
Date: Wed, 09 Jan 2008 21:53:00 -0000	[thread overview]
Message-ID: <20080109215300.7840.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  5b38679c56e39b2360489f692fa78e5469c7a3c1 (commit)
      from  b1e11cbeca590477dd14037e646309ec17ccd8a3 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 5b38679c56e39b2360489f692fa78e5469c7a3c1
Author: Phil Muldoon <pmuldoon@redhat.com>
Date:   Wed Jan 9 21:52:51 2008 +0000

    Make auxv lookup entry point symbol. Discover auxv platform.
    Rewrite fauxv to block processes. Fix Map/Auxv Command to
    print out multiple sets. Delete Info help command.
    
    2008-01-09  Phil Muldoon  <pmuldoon@redhat.com>
    
    	* fauxv.java (parsePids): Pass in proc object.
    	(parseCores): Ditto.
    	(printAuxv): Take proc. Use it to look up symbol.
    	(PrintAuxvEvent): New.
    	(RichAuxvDump): New.
    
    2008-01-09  Phil Muldoon  <pmuldoon@redhat.com>
    
    	* TestAuxvCommand.java (testAuxVCoreCommand): Pass in proc to
    	BuildAuxv.
    	* MapsCommand.java (interpret): With with multiple processes,
    	over multipe sets.
    	* AuxvCommand.java (interpret): Work with multiple processes,
    	over multipe sets.
    	* InfoCommand.java (Help): Delete internal help
    	command.
    
    2008-01-09  Phil Muldoon  <pmuldoon@redhat.com>
    
    	* AuxvStringBuilder.java (construct): Find symbol for
    	AT_ENTRY. Find string in memory for AT_PLATFORM.

-----------------------------------------------------------------------

Summary of changes:
 frysk-core/frysk/bindir/ChangeLog            |    8 ++
 frysk-core/frysk/bindir/fauxv.java           |  151 +++++++++++++++++---------
 frysk-core/frysk/hpd/AuxvCommand.java        |   73 +++++++++----
 frysk-core/frysk/hpd/ChangeLog               |   11 ++
 frysk-core/frysk/hpd/InfoCommand.java        |   22 ----
 frysk-core/frysk/hpd/MapsCommand.java        |   44 ++++++--
 frysk-core/frysk/hpd/TestAuxvCommand.java    |    2 +-
 frysk-core/frysk/util/AuxvStringBuilder.java |   60 ++++++++--
 frysk-core/frysk/util/ChangeLog              |    5 +
 9 files changed, 257 insertions(+), 119 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/bindir/ChangeLog b/frysk-core/frysk/bindir/ChangeLog
index 6bda106..40b172f 100644
--- a/frysk-core/frysk/bindir/ChangeLog
+++ b/frysk-core/frysk/bindir/ChangeLog
@@ -1,3 +1,11 @@
+2008-01-09  Phil Muldoon  <pmuldoon@redhat.com>
+
+	* fauxv.java (parsePids): Pass in proc object.
+	(parseCores): Ditto.
+	(printAuxv): Take proc. Use it to look up symbol.
+	(PrintAuxvEvent): New.
+	(RichAuxvDump): New.
+
 2008-01-07  Andrew Cagney  <cagney@redhat.com>
 
 	* fstep.java: Update; use Host.requestProc(ProcId,FindProc).
diff --git a/frysk-core/frysk/bindir/fauxv.java b/frysk-core/frysk/bindir/fauxv.java
index 8930bb0..d00944f 100644
--- a/frysk-core/frysk/bindir/fauxv.java
+++ b/frysk-core/frysk/bindir/fauxv.java
@@ -39,72 +39,123 @@
 
 package frysk.bindir;
 
-import frysk.util.CommandlineParser;
-import frysk.util.Util;
-import frysk.util.AuxvStringBuilder;
+import java.io.File;
+
+import frysk.event.Event;
+import frysk.proc.Manager;
 import frysk.proc.Proc;
+import frysk.proc.ProcBlockAction;
 import frysk.proc.ProcId;
-import frysk.proc.Auxv;
-import java.io.File;
+import frysk.proc.ProcObserver;
+import frysk.proc.Task;
+import frysk.util.AuxvStringBuilder;
+import frysk.util.CommandlineParser;
 import frysk.util.CoreExePair;
+import frysk.util.Util;
 
 public class fauxv {
-    
+
+    static Proc proc = null;
+
     public static void main (String[] args) {
 	// Parse command line. Check pid provided.
-	
+
 	CommandlineParser parser = new CommandlineParser("fauxv") {
-		
-		public void parseCores (CoreExePair[] corePairs) {
-		    for (int i = 0; i < corePairs.length; i++) {
-			File coreFile = corePairs[i].coreFile;
-			File exeFile = corePairs[i].exeFile;
-			Proc proc;
-			
-			if (exeFile == null)
-			    proc = Util.getProcFromCoreFile(coreFile);
-			else
-			    proc = Util.getProcFromCoreFile(coreFile, exeFile);
-			printAuxv(proc.getAuxv());
-		    }
-		    
+
+	    public void parseCores (CoreExePair[] corePairs) {
+		for (int i = 0; i < corePairs.length; i++) {
+		    File coreFile = corePairs[i].coreFile;
+		    File exeFile = corePairs[i].exeFile;
+		    if (exeFile == null)
+			proc = Util.getProcFromCoreFile(coreFile);
+		    else
+			proc = Util.getProcFromCoreFile(coreFile, exeFile);
+		    PrintAuxvEvent auxvPrint = new PrintAuxvEvent(proc);
+		    auxvPrint.execute();
 		    System.exit(0);
 		}
-		
-		public void parsePids (ProcId[] pids) {
-		    for (int i= 0; i< pids.length; i++) {
-			ProcId id = pids[i];
-			Proc proc = Util.getProcFromPid(id);
-			printAuxv(proc.getAuxv());
-		    }
+	    }
+
+	    public void parsePids (ProcId[] pids) {
+		for (int i= 0; i< pids.length; i++) {
+		    ProcId id = pids[i];
+		    proc = Util.getProcFromPid(id);
+		    new ProcBlockAction(proc, new RichAuxvDump(proc));
+		    Manager.eventLoop.run();
 		    System.exit(0);
 		}
-		
-		private void printAuxv(Auxv[] auxv)
-		{
-		    
-		    class BuildAuxv extends AuxvStringBuilder {
-			
-			public StringBuffer auxvData = new StringBuffer();
-			public void buildLine(String type, String desc, String value) {
-			    auxvData.append(type+" (" + desc+") : " + value+"\n");
-			}
-		    }
-		    
-		    BuildAuxv buildAuxv = new BuildAuxv();
-		    buildAuxv.construct(auxv);
-		    
-		    System.out.println(buildAuxv.auxvData.toString());
-		}
-		
-	    };
-	
-	parser.setHeader("Usage: fauxv <PID>  || fmaps <COREFILE> [<EXEFILE>]");
+	    }
+
+
+	};
+
+
+	parser.setHeader("Usage: fauxv <PID>  || fauxv <COREFILE> [<EXEFILE>]");
 	parser.parse(args);
-	
+
 	//If we got here, we didn't find a pid.
 	System.err.println("Error: No PID or COREFILE.");
 	parser.printHelp();
 	System.exit(1);
+    }   
+
+    private static class PrintAuxvEvent implements Event
+    {
+
+	private Proc proc = null;
+	public PrintAuxvEvent(Proc proc)
+	{
+	    this.proc = proc;
+	}
+	public void execute() {
+	    class BuildAuxv extends AuxvStringBuilder {
+
+		public StringBuffer auxvData = new StringBuffer();
+		public void buildLine(String type, String desc, String value) {
+		    auxvData.append(type+" (" + desc+") : " + value+"\n");
+		}
+	    }	
+
+	    BuildAuxv buildAuxv = new BuildAuxv();
+	    buildAuxv.construct(proc.getAuxv(), proc);
+
+	    System.out.print(buildAuxv.auxvData.toString());
+
+	    System.exit(0);
+	}
+
+
+    }
+
+
+
+    private static class RichAuxvDump implements ProcObserver.ProcAction {
+
+	private Proc proc;
+
+
+	public RichAuxvDump(Proc proc)
+	{
+	    this.proc = proc;
+	}
+
+	public void allExistingTasksCompleted() {
+	    Manager.eventLoop.add(new PrintAuxvEvent(this.proc));
+	}
+
+	public void taskAddFailed(Object task, Throwable w) {
+	}
+
+	public void existingTask(Task task) {
+	}
+
+	public void addFailed(Object observable, Throwable w) {
+	}
+
+	public void addedTo(Object observable) {
+	}
+
+	public void deletedFrom(Object observable) {
+	}
     }
 }
diff --git a/frysk-core/frysk/hpd/AuxvCommand.java b/frysk-core/frysk/hpd/AuxvCommand.java
index 5f59145..5d03b04 100644
--- a/frysk-core/frysk/hpd/AuxvCommand.java
+++ b/frysk-core/frysk/hpd/AuxvCommand.java
@@ -39,8 +39,10 @@
 
 package frysk.hpd;
 
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+
 import frysk.proc.Auxv;
 import frysk.proc.Proc;
 import frysk.util.AuxvStringBuilder;
@@ -63,39 +65,62 @@ public class AuxvCommand extends ParameterizedCommand {
   }
   
   void interpret(CLI cli, Input cmd, Object options) {
+    
+    int processCount = 0;
+    HashMap procList = new HashMap();
     PTSet ptset = cli.getCommandPTSet(cmd);
     Iterator taskDataIterator = ptset.getTaskData();
+
     if (taskDataIterator.hasNext() == false) {
-      cli.addMessage("Cannot find main task. Cannot print out auxv", Message.TYPE_ERROR);
-      return;
+	cli.addMessage("Cannot find main task. Cannot print out auxv", 
+			Message.TYPE_ERROR);
+	return;
     }
-    Proc mainProc = ((TaskData) taskDataIterator.next()).getTask().getProc();
-    Auxv[] liveAux = mainProc.getAuxv();
 
-    if (liveAux == null) {
-	cli.addMessage("No Auxv data to print for this process",
-		       Message.TYPE_WARNING);
-	
-	return;
+    
+    while (taskDataIterator.hasNext()) {
+	Proc proc = ((TaskData) taskDataIterator.next()).getTask().getProc();
+	if (!procList.containsValue(proc)) {
+	    procList.put(proc,proc);
+	    processCount++;
+	}
     }
-    class BuildAuxv extends AuxvStringBuilder {
-      
-      public StringBuffer auxvData = new StringBuffer();
-      public void buildLine(String type, String desc, String value) {
-	if (verbose)
-	  auxvData.append(type+" (" + desc+") : " + value+"\n");
-	else
-	  auxvData.append(type+" : " + value+"\n");	
-      }
+
+    Iterator procIterator = procList.values().iterator();
+
+    while (procIterator.hasNext()) {
+	Proc mainProc = ((Proc)procIterator.next());
+	
+	Auxv[] liveAux = mainProc.getAuxv();
+	
+	if (liveAux == null) {
+	    cli.addMessage("No Auxv data to print for this process",
+		    Message.TYPE_WARNING);
+
+	    continue;
+	}
+	
+	class BuildAuxv extends AuxvStringBuilder {
+
+	    public StringBuffer auxvData = new StringBuffer();
+	    public void buildLine(String type, String desc, String value) {
+		if (verbose)
+		    auxvData.append(type+" (" + desc+") : " + value+"\n");
+		else		    
+		    auxvData.append(type+" : " + value+"\n");	
+	    }
+	}
+
+	BuildAuxv buildAuxv = new BuildAuxv();
+	buildAuxv.construct(liveAux, mainProc);
+	if (processCount > 1)
+	    cli.outWriter.println("For process: " + mainProc.getPid()+"\n");
+	cli.outWriter.print(buildAuxv.auxvData.toString());
     }
-    
-    BuildAuxv buildAuxv = new BuildAuxv();
-    buildAuxv.construct(liveAux);
-    
-    cli.outWriter.println(buildAuxv.auxvData.toString());
   }
   
-  int completer(CLI cli, Input input, int cursor, List completions) {
+
+int completer(CLI cli, Input input, int cursor, List completions) {
     return -1;
   }  
 }
diff --git a/frysk-core/frysk/hpd/ChangeLog b/frysk-core/frysk/hpd/ChangeLog
index d00e10f..7379999 100644
--- a/frysk-core/frysk/hpd/ChangeLog
+++ b/frysk-core/frysk/hpd/ChangeLog
@@ -1,3 +1,14 @@
+2008-01-09  Phil Muldoon  <pmuldoon@redhat.com>
+
+	* TestAuxvCommand.java (testAuxVCoreCommand): Pass in proc to
+	BuildAuxv.
+	* MapsCommand.java (interpret): With with multiple processes,
+	over multipe sets.
+	* AuxvCommand.java (interpret): Work with multiple processes,
+	over multipe sets.
+	* InfoCommand.java (Help): Delete internal help
+	command.
+
 2008-01-08  Andrew Cagney  <cagney@redhat.com>
 
 	* CoreCommand.java (getProc(LinuxCoreHost)): Delete; use
diff --git a/frysk-core/frysk/hpd/InfoCommand.java b/frysk-core/frysk/hpd/InfoCommand.java
index d8529cd..df3b083 100644
--- a/frysk-core/frysk/hpd/InfoCommand.java
+++ b/frysk-core/frysk/hpd/InfoCommand.java
@@ -38,36 +38,14 @@
 // exception.
 package frysk.hpd;
 
-import java.util.List;
 
 public class InfoCommand extends MultiLevelCommand {
     
-    private class Help extends Command {
-    	Help() {
-    	    super("Display this help message.", "help [command]",
-    		  "Display help (possibly for a command.)");
-    	}
-    	
-    	public void interpret(CLI cli, Input cmd) {
-    	    InfoCommand.this.help(cli, cmd);
-    	}
-    	
-    	/**
-    	 * Complete the line, throw problem back at the top level
-    	 * command.
-    	 */
-    	int complete(CLI cli, Input buffer, int cursor, List candidates) {
-    	    return InfoCommand.this.complete(cli, buffer, cursor,
-					     candidates);
-    	}
-    }
-    
     
     InfoCommand() {
 	super("info command", "info <subcommand>", 
 	      "The info command displays useful information about " +
 	      "various system and process level systems.");
-        add(new Help(), "help");
     	add(new RegsCommand(),"regs");
     	add(new DebuginfoCommand(),"debuginfo");
     	add(new MapsCommand(),"maps");
diff --git a/frysk-core/frysk/hpd/MapsCommand.java b/frysk-core/frysk/hpd/MapsCommand.java
index 278c9dc..833a6da 100644
--- a/frysk-core/frysk/hpd/MapsCommand.java
+++ b/frysk-core/frysk/hpd/MapsCommand.java
@@ -39,6 +39,7 @@
 
 package frysk.hpd;
 
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import frysk.proc.MemoryMap;
@@ -55,23 +56,46 @@ public class MapsCommand extends ParameterizedCommand {
   }
   
   void interpret(CLI cli, Input cmd, Object options) {
+
+    int processCount = 0;
+    HashMap procList = new HashMap();  
     PTSet ptset = cli.getCommandPTSet(cmd);
+    
     Iterator taskDataIterator = ptset.getTaskData();
     if (taskDataIterator.hasNext() == false)  {
-      cli.addMessage("Cannot find main task. Cannot print out process maps.", Message.TYPE_ERROR);
+      cli.addMessage("Cannot find main task. Cannot print out process maps.", 
+	      	Message.TYPE_ERROR);
       return;
     }
-    Proc mainProc = ((TaskData) taskDataIterator.next()).getTask().getProc();
-    MemoryMap[] maps = mainProc.getMaps();
+    
+    while (taskDataIterator.hasNext()) {
+	Proc proc = ((TaskData) taskDataIterator.next()).getTask().getProc();
+	if (!procList.containsValue(proc)) {
+	    procList.put(proc,proc);
+	    processCount++;
+	}
+    }
+    
+    Iterator procIterator = procList.values().iterator();
 
-    if (maps == null) {
-	cli.addMessage("No maps data to print for this process", 
-		       Message.TYPE_WARNING);
-	return;
+    while (procIterator.hasNext()) {
+	Proc mainProc = ((Proc)procIterator.next());
+
+	MemoryMap[] maps = mainProc.getMaps();
+
+	if (maps == null) {
+	    cli.addMessage("No maps data to print for this process", 
+		    Message.TYPE_WARNING);
+	    continue;
+	}
+
+	if (processCount > 1)
+	    cli.outWriter.println("For process: " + mainProc.getPid()+"\n");
+
+	for (int i=0; i<maps.length; i++)
+	    cli.outWriter.println(maps[i].toString());
+	}
     }
-    for (int i=0; i<maps.length; i++)
-    	cli.outWriter.println(maps[i].toString());
-  }
   
   int completer(CLI cli, Input input, int cursor, List completions) {
     return -1;
diff --git a/frysk-core/frysk/hpd/TestAuxvCommand.java b/frysk-core/frysk/hpd/TestAuxvCommand.java
index 8434d36..f0863e5 100644
--- a/frysk-core/frysk/hpd/TestAuxvCommand.java
+++ b/frysk-core/frysk/hpd/TestAuxvCommand.java
@@ -68,7 +68,7 @@ public class TestAuxvCommand extends TestLib {
     }
     
     BuildAuxv buildAuxv = new BuildAuxv();
-    buildAuxv.construct(liveAuxv);
+    buildAuxv.construct(liveAuxv, proc);
     
     
     e = new HpdTestbed();
diff --git a/frysk-core/frysk/util/AuxvStringBuilder.java b/frysk-core/frysk/util/AuxvStringBuilder.java
index 02ce064..69d0ceb 100644
--- a/frysk-core/frysk/util/AuxvStringBuilder.java
+++ b/frysk-core/frysk/util/AuxvStringBuilder.java
@@ -38,8 +38,12 @@
 // exception.
 package frysk.util;
 
+import inua.eio.ByteBuffer;
 import inua.elf.AT;
 import frysk.proc.Auxv;
+import frysk.proc.Proc;
+import frysk.symtab.Symbol;
+import frysk.symtab.SymbolFactory;
 
 
 public abstract class AuxvStringBuilder
@@ -47,24 +51,56 @@ public abstract class AuxvStringBuilder
   protected AuxvStringBuilder() {
   }
   
-  public final void construct (Auxv[] rawAuxv) {
+  public final void construct (Auxv[] rawAuxv, Proc mainProc) {
     String  value;
+
     for (int i=0; i < rawAuxv.length; i++) {
-      switch (rawAuxv[i].type) {
-      case 33:
-      case 16:
-      case 3:
-      case 9:
+	switch (rawAuxv[i].type) {
+	case 33:
+	case 16:
+	case 3:
+	    value = "0x"+Long.toHexString(rawAuxv[i].val);
+	    break;
+	case 9:
+	    Symbol symbol = SymbolFactory.getSymbol(mainProc.getMainTask(), 
+		    rawAuxv[i].val);
+	    value = symbol.getName()+" (0x" +
+	    Long.toHexString(rawAuxv[i].val)+")";
+	    break;
 	case 15: 
-	  value = "0x"+Long.toHexString(rawAuxv[i].val);
-	  break;
-      default: 
-	value = ""+rawAuxv[i].val;
-      }    		  
-      buildLine(AT.toString(rawAuxv[i].type), AT.toPrintString(rawAuxv[i].type), value);
+	    value = getMemoryString(rawAuxv[i].val, mainProc);
+	    break;
+	default: 
+	    value = ""+rawAuxv[i].val;
+	}    		  
+	buildLine(AT.toString(rawAuxv[i].type), AT.toPrintString(rawAuxv[i].type), value);
     }
   }
   
   abstract public void buildLine(String type, String desc, String value);
+  
+  private String getMemoryString(long address, Proc mainProc) {


hooks/post-receive
--
frysk system monitor/debugger


                 reply	other threads:[~2008-01-09 21:53 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=20080109215300.7840.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: link
Be 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).