public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Create Watchpoint data class. Return Watchpoint class instead of long. Do not allow user to set global/local flags. Add new test,testing new getAllWatchPoints() funtion.
@ 2008-04-03 13:00 pmuldoon
  0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2008-04-03 13:00 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  72db660d1ea985caa145e3cf93880c6e705d8b51 (commit)
      from  21953327b97883d2adb9423c3dad56fc319f2f12 (commit)

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

- Log -----------------------------------------------------------------
commit 72db660d1ea985caa145e3cf93880c6e705d8b51
Author: Phil Muldoon <pmuldoon@redhat.com>
Date:   Thu Apr 3 13:58:27 2008 +0100

    Create Watchpoint data class. Return Watchpoint class instead of long. Do not allow user to set global/local flags. Add new test,testing new getAllWatchPoints() funtion.
    
    2008-04-03  Phil Muldoon  <pmuldoon@redhat.com>
    
            * TestWatchpoint.java (Symbol.Symbol): New temporary class to resolve
            Elf symbols.
            (getGlobalSymbolAddress): New function.
            (testWatchFourBytesBitPattern): Adjust to use funit-watchpoints.S.
            GetAddress from Watchpoint.java
            (testWatchTwoBytesBitPattern): Ditto.
            (testWatchOneByteBitPattern): Ditto.
            (testGetAllWatchpoints): New.
            * IA32WatchpointFunctions.java (setWatchpoint): Delete localOnly flag.
            Remove local/global breakpoint bit logic.
            (readWatchpoint): Rewrite. Return Watchpoint.
            * X8664WatchpointFunctions.java (setWatchpoint): Delete localOnly flag.
            Remove local/global breakpoint bit logic.
            (readWatchpoint): Rewrite. Return Watchpoint.
            * WatchpointFunctions.java (getAllWatchpoints): New. Implement.
            (setWatchpoint): Remove localOnly flag.
            (readWatchpoint): return a Watchpoint class over a long.

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

Summary of changes:
 frysk-core/frysk/isa/watchpoints/ChangeLog         |   20 +++
 .../isa/watchpoints/IA32WatchpointFunctions.java   |   67 +++++++---
 .../frysk/isa/watchpoints/TestWatchpoint.java      |  135 +++++++++++++++++---
 .../watchpoints/Watchpoint.java}                   |   98 +++++++--------
 .../frysk/isa/watchpoints/WatchpointFunctions.java |   25 +++-
 .../isa/watchpoints/X8664WatchpointFunctions.java  |   65 +++++++---
 6 files changed, 299 insertions(+), 111 deletions(-)
 copy frysk-core/frysk/{symtab/Symbol.java => isa/watchpoints/Watchpoint.java} (53%)

First 500 lines of diff:
diff --git a/frysk-core/frysk/isa/watchpoints/ChangeLog b/frysk-core/frysk/isa/watchpoints/ChangeLog
index e3f419a..93952e1 100644
--- a/frysk-core/frysk/isa/watchpoints/ChangeLog
+++ b/frysk-core/frysk/isa/watchpoints/ChangeLog
@@ -1,3 +1,23 @@
+2008-04-03  Phil Muldoon  <pmuldoon@redhat.com>
+
+	* TestWatchpoint.java (Symbol.Symbol): New temporary class to resolve
+	Elf symbols. 
+	(getGlobalSymbolAddress): New function.
+	(testWatchFourBytesBitPattern): Adjust to use funit-watchpoints.S.
+	GetAddress from Watchpoint.java
+	(testWatchTwoBytesBitPattern): Ditto.
+	(testWatchOneByteBitPattern): Ditto.
+	(testGetAllWatchpoints): New.
+	* IA32WatchpointFunctions.java (setWatchpoint): Delete localOnly flag.
+	Remove local/global breakpoint bit logic.
+	(readWatchpoint): Rewrite. Return Watchpoint.
+	* X8664WatchpointFunctions.java (setWatchpoint): Delete localOnly flag.
+	Remove local/global breakpoint bit logic.
+	(readWatchpoint): Rewrite. Return Watchpoint.
+	* WatchpointFunctions.java (getAllWatchpoints): New. Implement.
+	(setWatchpoint): Remove localOnly flag.
+	(readWatchpoint): return a Watchpoint class over a long.
+
 2008-04-02  Phil Muldoon  <pmuldoon@redhat.com>
 
 	* Watchpoint.java: Refactor to WatchpointFunctions.java
diff --git a/frysk-core/frysk/isa/watchpoints/IA32WatchpointFunctions.java b/frysk-core/frysk/isa/watchpoints/IA32WatchpointFunctions.java
index 15117c5..e2883c7 100644
--- a/frysk-core/frysk/isa/watchpoints/IA32WatchpointFunctions.java
+++ b/frysk-core/frysk/isa/watchpoints/IA32WatchpointFunctions.java
@@ -65,8 +65,7 @@ class IA32WatchpointFunctions extends WatchpointFunctions {
      */
     public void setWatchpoint(Task task, int index, 
 	       long addr, int range,
-	       boolean writeOnly, 
-	       boolean localOnly) {
+	       boolean writeOnly) { 
 
 	
 	// turn bit off (b = bit no): l &= ~(1L << b)
@@ -86,17 +85,10 @@ class IA32WatchpointFunctions extends WatchpointFunctions {
 	    // Calculate "Global Exact Breakpoint #index Enabled" bit to set
 	    int bitToSet = index * 2;
 	    
-	    if (localOnly) {
-		// Set "Local Exact Breakpoint #index Enabled" to 0
-		debugControl |= (1L << bitToSet);		
-		// Set Global Exact Breakpoint to 1
-		debugControl &= ~(1L << bitToSet+1);		
-	    } else {
-		// Set "Local Exact Breakpoint #index Enabled" to 0
-		debugControl &= ~(1L << bitToSet);		
-		// Set Global Exact Breakpoint to 1
-		debugControl |= (1L << bitToSet+1);
-	    }	    
+	    // Set "Local Exact Breakpoint #index Enabled" to 0
+	    debugControl &= ~(1L << bitToSet);		
+	    // Set Global Exact Breakpoint to 1
+	    debugControl |= (1L << bitToSet+1);
 	    
 	    // Dending on the WP register to set, the next
 	    // 4 bits are offset 4 * WP Count. On x8664 
@@ -148,18 +140,53 @@ class IA32WatchpointFunctions extends WatchpointFunctions {
 				       "range. Has to be 1, 2, 4 or 8");
     }
 
+
     /**
      * Reads a watchpoint. Takes a task, and an index.
      *
      * @param task - task to read a watchpoint from.
      * @param index - watchpoint number to read.
-     *
-     * @return long - value of register for watchpoint.
+
+     * @return Watchpoint - value of Watchpoint at
+     * register. 
      */
-    public long readWatchpoint(Task task, int index) {
-	return task.getRegister(IA32Registers.DEBUG_REGS_GROUP.getRegisters()[index]);
-    }		
+    public Watchpoint readWatchpoint(Task task, int index) {
+	// Get Address from watchpoint register
+	long address = task.getRegister(
+		IA32Registers.DEBUG_REGS_GROUP.getRegisters()[index]);
+	
+	// Get debug status register for all other values
+	long debugStatus = task.getRegister(IA32Registers.DEBUG_CONTROL);
 
+	boolean writeOnly = false;
+	
+	// To find write/read, or read only the bit setting is 0 + no of
+	// register to check * 4 bits (each register has four bits assigned
+	// for r/w and global/local bits.
+	int typeOfWpTrap = 16 + (index *4);        
+
+	// if 1 and 0 set, must be writeOnly.
+	if ( (testBit(debugStatus,typeOfWpTrap)) && (!testBit(debugStatus,typeOfWpTrap+1)))
+        	writeOnly = true;
+
+	// Move over +2 bits for length
+        int lengthOfWP = typeOfWpTrap + 2;
+        int length = 0;
+
+        // Test length on combination of bits. 00 = 1, 01 = 2
+        // 11 = 4.
+        if (!testBit(debugStatus,lengthOfWP)) 
+            if (!testBit(debugStatus,lengthOfWP+1))
+        	length = 1;
+            else
+        	length = 2;
+        else
+            if (testBit(debugStatus, lengthOfWP))
+        	length = 4;
+	return Watchpoint.create(address, length, index, writeOnly);
+    }	
+
+    
     /**
      * Deletes a watchpoint. Takes a task, and an index.
      *
@@ -219,6 +246,10 @@ class IA32WatchpointFunctions extends WatchpointFunctions {
     public long readControlRegister(Task task) {
 	return task.getRegister(IA32Registers.DEBUG_CONTROL);
     }
+    
+    private boolean testBit(long register, int bitToTest) {
+	return (register & (1L << bitToTest)) != 0;
+    }
 
 }
 
diff --git a/frysk-core/frysk/isa/watchpoints/TestWatchpoint.java b/frysk-core/frysk/isa/watchpoints/TestWatchpoint.java
index 49e5ceb..db52a10 100644
--- a/frysk-core/frysk/isa/watchpoints/TestWatchpoint.java
+++ b/frysk-core/frysk/isa/watchpoints/TestWatchpoint.java
@@ -40,6 +40,17 @@
 
 package frysk.isa.watchpoints;
 
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import lib.dwfl.Dwfl;
+import lib.dwfl.DwflModule;
+import lib.dwfl.ElfSymbolBinding;
+import lib.dwfl.ElfSymbolType;
+import lib.dwfl.ElfSymbolVisibility;
+import lib.dwfl.SymbolBuilder;
+import frysk.config.Config;
+import frysk.dwfl.DwflCache;
 import frysk.proc.Proc;
 import frysk.proc.Task;
 import frysk.testbed.DaemonBlockedAtEntry;
@@ -56,17 +67,17 @@ public class TestWatchpoint extends TestLib {
 	    return;
 	Proc proc = giveMeABlockedProc();
 	Task task = proc.getMainTask();
-	long address = 0x1000;
+	long address = getGlobalSymbolAddress(task,"source");
 	long debugControlRegister;
 	WatchpointFunctions wp = WatchpointFunctionFactory.getWatchpoint(task.getISA());
 	long savedDebugControlRegister = wp.readControlRegister(task);
 	for (int i=0; i<4; i++) {
 
 
-	    wp.setWatchpoint(task, i, address, 4, false, false);
+	    wp.setWatchpoint(task, i, address, 4, false);
 	    // simple first test. Does register contain address?
 	    assertEquals("Saved watchpoint and address are similar", 
-		 address, wp.readWatchpoint(task, i));
+		 address, wp.readWatchpoint(task, i).getAddress());
 	    
 	    debugControlRegister = wp.readControlRegister(task);
 	
@@ -92,7 +103,7 @@ public class TestWatchpoint extends TestLib {
 	for (int j=0; j < 4; j++) {	    
 	    wp.deleteWatchpoint(task,j);
 	    assertEquals("Deleted Watchpoint is 0", 
-		    wp.readWatchpoint(task, j),0);
+		    wp.readWatchpoint(task, j).getAddress(),0);
 	}
 
 	assertEquals("Debug control register is left as we originally found it", 
@@ -109,17 +120,17 @@ public class TestWatchpoint extends TestLib {
 	    return;
 	Proc proc = giveMeABlockedProc();
 	Task task = proc.getMainTask();
-	long address = 0x1000;
+	long address = getGlobalSymbolAddress(task,"source");
 	long debugControlRegister;
 	WatchpointFunctions wp = WatchpointFunctionFactory.getWatchpoint(task.getISA());
 	long savedDebugControlRegister = wp.readControlRegister(task);
 	for (int i=0; i<4; i++) {
 
 
-	    wp.setWatchpoint(task, i, address, 1, true, false);
+	    wp.setWatchpoint(task, i, address, 1, true);
 	    // simple first test. Does register contain address?
 	    assertEquals("Saved watchpoint and address are similar", 
-		 address, wp.readWatchpoint(task, i));
+		 address, wp.readWatchpoint(task, i).getAddress());
 	    
 	    debugControlRegister = wp.readControlRegister(task);
 	
@@ -145,7 +156,7 @@ public class TestWatchpoint extends TestLib {
 	for (int j=0; j < 4; j++) {	    
 	    wp.deleteWatchpoint(task,j);
 	    assertEquals("Deleted Watchpoint is 0", 
-		    wp.readWatchpoint(task, j),0);
+		    wp.readWatchpoint(task, j).getAddress(),0);
 	}
 
 	assertEquals("Debug control register is left as we originally found it", 
@@ -164,25 +175,25 @@ public class TestWatchpoint extends TestLib {
 	    return;
 	Proc proc = giveMeABlockedProc();
 	Task task = proc.getMainTask();
-	long address = 0x0;
+	long address = getGlobalSymbolAddress(task,"source");
 	long debugControlRegister;	
 	WatchpointFunctions wp = WatchpointFunctionFactory.getWatchpoint(task.getISA());
 
 	long savedDebugControlRegister = wp.readControlRegister(task);
 
 	for (int i=0; i<4; i++) {
-	    wp.setWatchpoint(task, i, address, 1, false, true);
+	    wp.setWatchpoint(task, i, address, 1, false);
 
 	    // simple first test. Does register contain address?
 	    assertEquals("Saved watchpoint and address are similar", 
-		 address, wp.readWatchpoint(task, i));
+		 address, wp.readWatchpoint(task, i).getAddress());
 	    
 	    debugControlRegister = wp.readControlRegister(task);
 	
-	    // Test Debug Control Register Bit Pattern. Local Exact.
-	    assertEquals(i + " wp local exact bit", true, 
+	    // Test Debug Control Register Bit Pattern. Global Exact.
+	    assertEquals(i + " wp local exact bit", false, 
 		    testBit(debugControlRegister, 0 + (i*2)));
-	    assertEquals(i + " wp global exact bit", false, 
+	    assertEquals(i + " wp global exact bit", true, 
 		    testBit(debugControlRegister,  1 + (i*2)));
 
 	    // Test Debug Control Register. Fire on Read and Write
@@ -201,7 +212,7 @@ public class TestWatchpoint extends TestLib {
 	for (int j=0; j < 4; j++) {	    
 	    wp.deleteWatchpoint(task,j);
 	    assertEquals("Deleted Watchpoint is 0", 
-		    wp.readWatchpoint(task, j),0);
+		    wp.readWatchpoint(task, j).getAddress(),0);
 	}
 
 	assertEquals("Debug control register is left as we originally found it", 
@@ -209,17 +220,103 @@ public class TestWatchpoint extends TestLib {
 
     }
 
+    public void testGetAllWatchpoints () {
+	// Set maximum number of watchpoints, then test them
+	// via getAll.
+	if (unresolvedOnPPC(5991)) 
+	    return;
+	int lengthSet[]  = {1,1,2,4};
+	int count = 0;
+	Proc proc = giveMeABlockedProc();
+	Task task = proc.getMainTask();
+	long address = getGlobalSymbolAddress(task,"source");
+	WatchpointFunctions wp = WatchpointFunctionFactory.getWatchpoint(task.getISA());
+	for (int i=0; i<wp.getWatchpointCount(); i++) 
+	    wp.setWatchpoint(task, i, address, lengthSet[i], true);
+	
+	ArrayList watchpointSet = (ArrayList) wp.getAllWatchpoints(task);
+	Iterator i = watchpointSet.iterator();
+	while (i.hasNext()) {
+	    Watchpoint watchpoint = ((Watchpoint) i.next());
+	    assertNotNull("Check retrieved watchpoint is not null", watchpoint);
+	    assertEquals("address = source var address for Watchpoint " + i,
+		    address,watchpoint.getAddress());
+	    assertEquals("length = " + lengthSet[count], lengthSet[count],
+		    watchpoint.getRange());
+	    assertEquals("register allocation = " + count, count,
+		    watchpoint.getRegister());
+	    assertEquals("writeOnly ", true,
+		    watchpoint.isWriteOnly());
+	    count++;
+	}
+	
+	assertEquals("Returned count is correct", wp.getWatchpointCount(),count);
+    }
+
+    
     private boolean testBit(long register, int bitToTest) {
 	return (register & (1L << bitToTest)) != 0;
     }
     
-    private Proc giveMeABlockedProc ()
-    {
-      String[] nocmds = {};
-      DaemonBlockedAtEntry ackProc = new DaemonBlockedAtEntry(nocmds);
+    private Proc giveMeABlockedProc () {
+      DaemonBlockedAtEntry ackProc = new DaemonBlockedAtEntry(
+	      Config.getPkgLibFile("funit-watchpoint"));
       assertNotNull(ackProc);
       return ackProc.getMainTask().getProc();
     }
 
+    /**
+     * Returns the address of a global label by quering the the Proc
+     * main Task's Dwlf.
+     */
+    long getGlobalSymbolAddress(Task task, String label)  {
+      Dwfl dwfl = DwflCache.getDwfl(task);
+      Symbol sym = Symbol.get(dwfl, label);
+      return sym.getAddress();
+    }
+    
+    
+    // Helper class since there there isn't a get symbol method in Dwfl,
+    // so we need to wrap it all in a builder pattern.
+    static class Symbol implements SymbolBuilder {
+      private String name;
+      private long address;
+
+      private boolean found;
+
+      private Symbol()  {
+        // properties get set in public static get() method.
+      }
+
+      static Symbol get(Dwfl dwfl, String name)  {
+        Symbol sym = new Symbol();
+        sym.name = name;
+        DwflModule[] modules = dwfl.getModules();
+        for (int i = 0; i < modules.length && ! sym.found; i++)
+  	modules[i].getSymbolByName(name, sym);
+        
+        if (sym.found)
+  	return sym;
+        else
+  	return null;
+      }
+
+      String getName() {
+        return name;
+      }
+
+      long getAddress() {
+        return address;
+      }
+
+      public void symbol(String name, long value, long size, ElfSymbolType type,
+	    ElfSymbolBinding bind, ElfSymbolVisibility visibility) {
+	  if (name.equals(this.name)) {
+	      this.address = value;
+	      this.found = true;
+	  }
+	
+      }
+    } 
 }    
 
diff --git a/frysk-core/frysk/symtab/Symbol.java b/frysk-core/frysk/isa/watchpoints/Watchpoint.java
similarity index 53%
copy from frysk-core/frysk/symtab/Symbol.java
copy to frysk-core/frysk/isa/watchpoints/Watchpoint.java
index fae9612..ef88924 100644
--- a/frysk-core/frysk/symtab/Symbol.java
+++ b/frysk-core/frysk/isa/watchpoints/Watchpoint.java
@@ -1,6 +1,9 @@
-// This file is part of the program FRYSK.
+
+
+package frysk.isa.watchpoints;
+//This file is part of the program FRYSK.
 //
-// Copyright 2007, 2008, Red Hat Inc.
+// Copyright 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
@@ -36,71 +39,58 @@
 // modification, you must delete this exception statement from your
 // version and license this file solely under the GPL without
 // exception.
-
-package frysk.symtab;
-
-import lib.stdcpp.Demangler;
-
-/**
- * The object-file symbol.  Typically obtained by reading ELF
- * information.
- *
- * Do not confuse this with higher-level symbolic information, such as
- * function names, obtained from debug information such as DWARF.
- */
-
-public class Symbol {
+public class Watchpoint {
 
     private final long address;
-    private final long size;
-    private final String name;
-    protected String demangledName = null;
+    private final int range;
+    private final int register;
+    private final boolean writeOnly;
 
-    // package private constructor.
-    Symbol(long address, long size, String name) {
+    private Watchpoint(long address, int range, int register, boolean writeOnly) {
 	this.address = address;
-	this.size = size;
-	this.name = name;
+	this.range = range;
+	this.register = register;
+	this.writeOnly = writeOnly;
     }
 
     /**
-     * Return the address of the symbol.
+     * Create
+     *  
+     * Watchpoint. This is an immutable class that carries only information.
+     * It is not connected with the underlying hardware, and there is no
+     * guarantee that the information contained in this class is current,
+     * or even exists at any given time. 
+     * 
+     * The watchpoint manager can, and will, optimize watchpoint allocation 
+     * to maximize use; and it can, and will, sometimes combine or split 
+     * hardware watchpoints.  Thus this class is immutable, and cannot be
+     * changed after instantiation. If you want to alter a watchpoint, you should
+     * apply it via the WatchpointFunctionFactory, WatchpointFunction classes and
+     * their subclasses, and a new watchpoint object will be generated.
+     * 
+     * Clients should not instantiate this class directly.
+     * 
+     * @param address - address of watchpoint.
+     * @param range - range of the watchpoint.
+     * @param register - register watchpoint was allocated.
+     * @param writeOnly - true if the watchpoint will only trigger on a write. 
      */
-    public long getAddress () {
-	return address;
+    public static Watchpoint create(long address, int range, int register, boolean writeOnly) {
+	return new Watchpoint(address, range, register, writeOnly);
     }
-
-    /**
-     * Return the size of the symbol (possibly zero).
-     */
-    public long getSize () {
-	return size;
+    public int getRegister() {
+        return register;
     }
 
-    /**
-     * Return the mangled name (the raw string found in the symbol
-     * table).  Or NULL, of the name is unknown.
-     */
-    public String getName () {
-	return name;
+    public long getAddress() {
+        return address;
     }
 
-    /**
-     * Return the demangled name, or "" of the name isn't known.
-     *
-     * XXX: Is returning "" better than null?  Sounds like a cheat for
-     * code that should be conditional on the symbol being known.
-     */
-    public String getDemangledName () {
-	if (demangledName == null)
-	    demangledName = Demangler.demangle (getName());
-	return demangledName;
+    public int getRange() {
+        return range;
     }
 
-    /**
-     * Dump the symbol's contents.
-     */
-    public String toString () {
-	return name + "@" + Long.toHexString (address) + ":" + size;
-    }
+    public boolean isWriteOnly() {
+        return writeOnly;
+    }    
 }
diff --git a/frysk-core/frysk/isa/watchpoints/WatchpointFunctions.java b/frysk-core/frysk/isa/watchpoints/WatchpointFunctions.java
index 30e23fc..a5a30a9 100644
--- a/frysk-core/frysk/isa/watchpoints/WatchpointFunctions.java
+++ b/frysk-core/frysk/isa/watchpoints/WatchpointFunctions.java
@@ -40,6 +40,9 @@


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


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-04-03 13:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-04-03 13:00 [SCM] master: Create Watchpoint data class. Return Watchpoint class instead of long. Do not allow user to set global/local flags. Add new test,testing new getAllWatchPoints() funtion pmuldoon

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).