[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[XenPPC] [xenppc-unstable] [ppc] gpproxy improvements



# HG changeset patch
# User Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
# Node ID 17f7a426b2cddbc9b347157a49edfa921cf58867
# Parent  be9fe905334a4b9bcc6238d0490630449077e2c5
[ppc] gpproxy improvements

The patch:
  - Allows for GDB to set a register
  - Fixes "fr*" numbering to be 0 to 31
  - Properly returns "x" packet in repsonse to a "p" packet when the
    requested register is "unfetchable", this part not described in
    the manuals but is described in the GDB source code.

Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
---
 tools/gpproxy/gdbremote.py |   17 +++++++++++++----
 tools/gpproxy/powerpc.py   |   17 ++++++++++++++---
 tools/gpproxy/riscwatch.py |    8 ++++++++
 3 files changed, 35 insertions(+), 7 deletions(-)

diff -r be9fe905334a -r 17f7a426b2cd tools/gpproxy/gdbremote.py
--- a/tools/gpproxy/gdbremote.py        Thu Jul 06 06:39:09 2006 -0400
+++ b/tools/gpproxy/gdbremote.py        Thu Jul 06 06:44:19 2006 -0400
@@ -30,10 +30,11 @@ HANDLERS = {
        "?": "cmd_question",
        "c": "cmd_continue",
        "C": "cmd_continue_sig",
-       "g": "cmd_regs",
+       "g": "cmd_get_regs",
        "m": "cmd_memory",
        "M": "cmd_memory",
-       "p": "cmd_reg",
+       "p": "cmd_get_reg",
+       "P": "cmd_set_reg",
        "q": "cmd_query",
        "s": "cmd_step",
        "z": "cmd_breakpoint",
@@ -256,7 +257,7 @@ class GDBRemoteHandler(SocketServer.Base
                replypkt.payload = state
                return True
 
-       def cmd_regs(self, pkt, replypkt):
+       def cmd_get_regs(self, pkt, replypkt):
                regset = self.arch.get_registers()
                data = "".join(regset)
                replypkt.payload = data
@@ -294,9 +295,17 @@ class GDBRemoteHandler(SocketServer.Base
 
                return True
 
-       def cmd_reg(self, pkt, replypkt):
+       def cmd_get_reg(self, pkt, replypkt):
                self.ack()
                replypkt.payload = self.arch.get_register(int(pkt.payload, 16))
+               return True
+
+       def cmd_set_reg(self, pkt, replypkt):
+               self.ack()
+               num_end = pkt.payload.find("=")
+               num = int(pkt.payload[:num_end], 16)
+               val = int(pkt.payload[num_end + 1:], 16)
+               replypkt.payload = self.arch.set_register(num, val)
                return True
 
        def cmd_step(self, pkt, replypkt):
diff -r be9fe905334a -r 17f7a426b2cd tools/gpproxy/powerpc.py
--- a/tools/gpproxy/powerpc.py  Thu Jul 06 06:39:09 2006 -0400
+++ b/tools/gpproxy/powerpc.py  Thu Jul 06 06:44:19 2006 -0400
@@ -26,12 +26,12 @@ class PowerPC:
 
                # GPRs
                for j in range(32):
-                       REGS.append("r%s" % i)
+                       REGS.append("r%s" % j)
                        i += 1
 
                # FPRs
                for j in range(32):
-                       REGS.append("fr%s" % i)
+                       REGS.append("fr%s" % j)
                        i += 1
 
                REGS.append("pc")
@@ -43,8 +43,19 @@ class PowerPC:
                REGS.append("fpscr")
 
        def get_register(self, num):
-               regname = REGS[num]
+               try:
+                       regname = REGS[num]
+               except:
+                       return "x" # unfetchable
                return self.target.get_register(regname)
+
+       def set_register(self, num, val):
+               try:
+                       regname = REGS[num]
+               except:
+                       return "x" # unfetchable
+               self.target.set_register(regname, val)
+               return "OK"
 
        def get_registers(self):
                """Returns the array of target registers in proper GDB 
arch-specific
diff -r be9fe905334a -r 17f7a426b2cd tools/gpproxy/riscwatch.py
--- a/tools/gpproxy/riscwatch.py        Thu Jul 06 06:39:09 2006 -0400
+++ b/tools/gpproxy/riscwatch.py        Thu Jul 06 06:44:19 2006 -0400
@@ -150,6 +150,14 @@ class RISCWatchSession:
                        return "0000000000000000"
                return m.group(1)
 
+       def set_register(self, name, val):
+               reg = translate_regname(name)
+               result = self._command("reg %s=%x" % (reg, val))
+               m = ERRVAL.match(result)
+               if m:
+                       raise IOError(m.group(2))
+               return True
+
        def set_memory(self, addr, len, val):
                assert len < 32
                result = self._command("m -d%d %x=%x" % (len, addr, val))

_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.