public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Add 128-bit accessors for i386 XMM registers to libunwind; use.
@ 2007-12-11 15:18 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2007-12-11 15:18 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  6c23569523a01607cc228900d76331a5b91c3329 (commit)
      from  2579d604e2b8ce0bc583e872642ecdfefb957cfa (commit)

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

- Log -----------------------------------------------------------------
commit 6c23569523a01607cc228900d76331a5b91c3329
Author: Andrew Cagney <cagney@redhat.com>
Date:   Tue Dec 11 10:04:02 2007 -0500

    Add 128-bit accessors for i386 XMM registers to libunwind; use.
    
    frysk-core/frysk/stack/ChangeLog
    2007-12-10  Andrew Cagney  <cagney@redhat.com>
    
    	* LibunwindRegisterMapFactory.java (IA32): Add XMM registers.
    	* TestRegs.java (testVectorRegisters()): Enable on IA-32.
    
    frysk-imports/libunwind/ChangeLog
    2007-12-10  Andrew Cagney  <cagney@redhat.com>
    
    	* src/x86/Gregs.c (linux_scratch_loc): Add XMM registers.
    	(tdep_access_fpreg): Ditto.
    	* src/x86/regname.c: Add XMM registers.
    	* src/x86/is_fpreg.c: Include XMM0 .. XMM7 in floating point
    	registers.
    	* include/libunwind-x86.h (x86_regnum_t): Add UNW_X86_XMM0,
    	UNW_X86_XMM1, UNW_X86_XMM2, UNW_X86_XMM3, UNW_X86_XMM4,
    	UNW_X86_XMM5, UNW_X86_XMM7, UNW_X86_XMM7.
    	(unw_tdep_fpreg_t): Change to a union of possible values.

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

Summary of changes:
 frysk-core/frysk/stack/ChangeLog                   |    3 +
 .../frysk/stack/LibunwindRegisterMapFactory.java   |   13 ++++-
 frysk-core/frysk/stack/TestRegs.java               |    4 --
 frysk-imports/libunwind/ChangeLog                  |   12 +++++
 frysk-imports/libunwind/include/libunwind-x86.h    |   17 +++++++-
 frysk-imports/libunwind/src/x86/Gregs.c            |   19 ++++++++
 frysk-imports/libunwind/src/x86/is_fpreg.c         |    3 +-
 frysk-imports/libunwind/src/x86/regname.c          |    4 +-
 frysk-sys/lib/unwind/cni/UnwindH.hxx               |   45 ++++++++++----------
 9 files changed, 87 insertions(+), 33 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/stack/ChangeLog b/frysk-core/frysk/stack/ChangeLog
index cf5f5d6..fca7953 100644
--- a/frysk-core/frysk/stack/ChangeLog
+++ b/frysk-core/frysk/stack/ChangeLog
@@ -1,5 +1,8 @@
 2007-12-10  Andrew Cagney  <cagney@redhat.com>
 
+	* LibunwindRegisterMapFactory.java (IA32): Add XMM registers.
+	* TestRegs.java (testVectorRegisters()): Enable on IA-32.
+	
 	* TestRegs.java (testFloatRegisters()): Enable on IA-32.
 	* LibunwindAddressSpace.java (accessReg(Number,byte[],boolean)):
 	Limit the transfer size to the register's size.
diff --git a/frysk-core/frysk/stack/LibunwindRegisterMapFactory.java b/frysk-core/frysk/stack/LibunwindRegisterMapFactory.java
index 51b65c1..0ba51b4 100644
--- a/frysk-core/frysk/stack/LibunwindRegisterMapFactory.java
+++ b/frysk-core/frysk/stack/LibunwindRegisterMapFactory.java
@@ -67,7 +67,7 @@ public class LibunwindRegisterMapFactory {
 	.add(IA32Registers.EIP, UnwindRegistersX86.EIP)
 	.add(IA32Registers.EFLAGS, UnwindRegistersX86.EFLAGS)
 	.add(IA32Registers.TRAPS, UnwindRegistersX86.TRAPNO)
-    // MMX registers
+    // Floating-point registers
 	.add(X87Registers.ST0, UnwindRegistersX86.ST0)
 	.add(X87Registers.ST1, UnwindRegistersX86.ST1)
 	.add(X87Registers.ST2, UnwindRegistersX86.ST2)
@@ -84,8 +84,15 @@ public class LibunwindRegisterMapFactory {
 	.add(X87Registers.EIP, UnwindRegistersX86.FIP)
 	.add(X87Registers.DP, UnwindRegistersX86.FEA)
 	.add(X87Registers.DS, UnwindRegistersX86.FDS)
-    // SSE Registers
-    //TODO: XMMx registers.
+    // XMMx registers.
+	.add(X87Registers.XMM0, UnwindRegistersX86.XMM0)
+	.add(X87Registers.XMM1, UnwindRegistersX86.XMM1)
+	.add(X87Registers.XMM2, UnwindRegistersX86.XMM2)
+	.add(X87Registers.XMM3, UnwindRegistersX86.XMM3)
+	.add(X87Registers.XMM4, UnwindRegistersX86.XMM4)
+	.add(X87Registers.XMM5, UnwindRegistersX86.XMM5)
+	.add(X87Registers.XMM6, UnwindRegistersX86.XMM6)
+	.add(X87Registers.XMM7, UnwindRegistersX86.XMM7)
     //.add(IA32Registers.MXCSR, UnwindRegistersX86.MXCSR)
     // Segment registers
 	.add(IA32Registers.GS, UnwindRegistersX86.GS)
diff --git a/frysk-core/frysk/stack/TestRegs.java b/frysk-core/frysk/stack/TestRegs.java
index 3a00ffc..415ebd4 100644
--- a/frysk-core/frysk/stack/TestRegs.java
+++ b/frysk-core/frysk/stack/TestRegs.java
@@ -69,8 +69,6 @@ public class TestRegs extends RegsCase {
 
     // XXX: Delete this once the unresolved cases are fixed.
     public void testFloatRegisters() {
-// 	if (isa() == ISA.IA32 && unresolved(4911))
-// 	    return;
 	if (isa() == ISA.X8664 && unresolved(5195))
 	    return;
 	super.testFloatRegisters();
@@ -78,8 +76,6 @@ public class TestRegs extends RegsCase {
 
     // XXX: Delete this once the unresolved cases are fixed.
     public void testVectorRegisters() {
-	if (isa() == ISA.IA32 && unresolved(4911))
-	    return;
         if (isa() == ISA.X8664 && unresolved(5195))
             return;
 	super.testVectorRegisters();
diff --git a/frysk-imports/libunwind/ChangeLog b/frysk-imports/libunwind/ChangeLog
index 3e02b0d..04d85ee 100644
--- a/frysk-imports/libunwind/ChangeLog
+++ b/frysk-imports/libunwind/ChangeLog
@@ -1,3 +1,15 @@
+2007-12-11  Andrew Cagney  <cagney@redhat.com>
+
+	* src/x86/Gregs.c (linux_scratch_loc): Add XMM registers.
+	(tdep_access_fpreg): Ditto.
+	* src/x86/regname.c: Add XMM registers.
+	* src/x86/is_fpreg.c: Include XMM0 .. XMM7 in floating point
+	registers.
+	* include/libunwind-x86.h (x86_regnum_t): Add UNW_X86_XMM0,
+	UNW_X86_XMM1, UNW_X86_XMM2, UNW_X86_XMM3, UNW_X86_XMM4,
+	UNW_X86_XMM5, UNW_X86_XMM7, UNW_X86_XMM7.
+	(unw_tdep_fpreg_t): Change to a union of possible values.
+
 2007-12-11  Mark Wielaard  <mwielaard@redhat.com>
 
 	* include/libunwind-common.h.in (unw_get_unwind_table): Add
diff --git a/frysk-imports/libunwind/include/libunwind-x86.h b/frysk-imports/libunwind/include/libunwind-x86.h
index 38664f9..1e321db 100644
--- a/frysk-imports/libunwind/include/libunwind-x86.h
+++ b/frysk-imports/libunwind/include/libunwind-x86.h
@@ -48,7 +48,11 @@ extern "C" {
 typedef uint32_t unw_word_t;
 typedef int32_t unw_sword_t;
 
-typedef long double unw_tdep_fpreg_t;
+typedef union {
+  struct { uint8_t b[4]; } val32;
+  struct { uint8_t b[10]; } val80;
+  struct { uint8_t b[16]; } val128;
+} unw_tdep_fpreg_t;
 
 typedef enum
   {
@@ -131,7 +135,16 @@ typedef enum
     /* frame info (read-only) */
     UNW_X86_CFA,
 
-    UNW_TDEP_LAST_REG = UNW_X86_LDT,
+    UNW_X86_XMM0,	/* scratch */
+    UNW_X86_XMM1,	/* scratch */
+    UNW_X86_XMM2,	/* scratch */
+    UNW_X86_XMM3,	/* scratch */
+    UNW_X86_XMM4,	/* scratch */
+    UNW_X86_XMM5,	/* scratch */
+    UNW_X86_XMM6,	/* scratch */
+    UNW_X86_XMM7,	/* scratch */
+
+    UNW_TDEP_LAST_REG = UNW_X86_XMM7,
 
     UNW_TDEP_IP = UNW_X86_EIP,
     UNW_TDEP_SP = UNW_X86_CFA,
diff --git a/frysk-imports/libunwind/src/x86/Gregs.c b/frysk-imports/libunwind/src/x86/Gregs.c
index 68afd37..78cfabc 100644
--- a/frysk-imports/libunwind/src/x86/Gregs.c
+++ b/frysk-imports/libunwind/src/x86/Gregs.c
@@ -97,6 +97,17 @@ linux_scratch_loc (struct cursor *c, unw_regnum_t reg)
       is_fpstate = 1;
       off = LINUX_FPSTATE_XMM0_OFF + 8*(reg - UNW_X86_XMM0_lo);
       break;
+    case UNW_X86_XMM0:
+    case UNW_X86_XMM1:
+    case UNW_X86_XMM2:
+    case UNW_X86_XMM3:
+    case UNW_X86_XMM4:
+    case UNW_X86_XMM5:
+    case UNW_X86_XMM6:
+    case UNW_X86_XMM7:
+      is_fpstate = 1;
+      off = LINUX_FPSTATE_XMM0_OFF + 16*(reg - UNW_X86_XMM0);
+      break;
 
     case UNW_X86_FOP:
     case UNW_X86_TSS:
@@ -235,6 +246,14 @@ tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
     case UNW_X86_ST6:
     case UNW_X86_ST7:
       /* SSE fp registers */
+    case UNW_X86_XMM0:
+    case UNW_X86_XMM1:
+    case UNW_X86_XMM2:
+    case UNW_X86_XMM3:
+    case UNW_X86_XMM4:
+    case UNW_X86_XMM5:
+    case UNW_X86_XMM6:
+    case UNW_X86_XMM7:
     case UNW_X86_XMM0_lo:
     case UNW_X86_XMM0_hi:
     case UNW_X86_XMM1_lo:
diff --git a/frysk-imports/libunwind/src/x86/is_fpreg.c b/frysk-imports/libunwind/src/x86/is_fpreg.c
index 6dc5640..8f1536d 100644
--- a/frysk-imports/libunwind/src/x86/is_fpreg.c
+++ b/frysk-imports/libunwind/src/x86/is_fpreg.c
@@ -29,5 +29,6 @@ PROTECTED int
 unw_is_fpreg (int regnum)
 {
   return ((regnum >= UNW_X86_ST0 && regnum <= UNW_X86_ST7)
-	  || (regnum >= UNW_X86_XMM0_lo && regnum <= UNW_X86_XMM7_hi));
+	  || (regnum >= UNW_X86_XMM0_lo && regnum <= UNW_X86_XMM7_hi)
+	  || (regnum >= UNW_X86_XMM0 && regnum <= UNW_X86_XMM7));
 }
diff --git a/frysk-imports/libunwind/src/x86/regname.c b/frysk-imports/libunwind/src/x86/regname.c
index 824e213..2228510 100644
--- a/frysk-imports/libunwind/src/x86/regname.c
+++ b/frysk-imports/libunwind/src/x86/regname.c
@@ -12,7 +12,9 @@ static const char *regname[] =
     "xmm6_lo", "xmm6_hi", "xmm7_lo", "xmm7_hi",
     "mxcsr",
     "gs", "fs", "es", "ds", "ss", "cs",
-    "tss", "ldt"
+    "tss", "ldt",
+    "cfi",
+    "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
   };
 
 PROTECTED const char *
diff --git a/frysk-sys/lib/unwind/cni/UnwindH.hxx b/frysk-sys/lib/unwind/cni/UnwindH.hxx
index e1cc430..64890f5 100644
--- a/frysk-sys/lib/unwind/cni/UnwindH.hxx
+++ b/frysk-sys/lib/unwind/cni/UnwindH.hxx
@@ -299,20 +299,21 @@ lib::unwind::TARGET::getRegister(gnu::gcj::RawDataManaged* cursor,
     unw_word_t w;
     unw_fpreg_t fp;
   } word;
+  int size;
   if (unw_is_fpreg(regNum))
-    {
-      verifyBounds(offset, length, bytes, start, sizeof(word.fp));
-      status = unw_get_fpreg((::unw_cursor_t *) cursor,
-			     (::unw_regnum_t) regNum,
-			     &word.fp);
-    }
+    size = sizeof(word.fp);
   else
-    {
-      verifyBounds(offset, length, bytes, start, sizeof(word.w));
-      status = unw_get_reg((::unw_cursor_t *) cursor,
+    size = sizeof(word.w);
+  verifyBounds(offset, length, bytes, start, size);
+  if (unw_is_fpreg(regNum))
+    status = unw_get_fpreg((::unw_cursor_t *) cursor,
 			   (::unw_regnum_t) regNum,
-			   &word.w);
-    }
+			   &word.fp);
+  else
+    status = unw_get_reg((::unw_cursor_t *) cursor,
+			 (::unw_regnum_t) regNum,
+			 &word.w);
+  printf("status=%d\n", status);
   if (status != 0)
     throwRuntimeException("get register failed");
   memcpy(elements(bytes) + start, (uint8_t*)&word + offset, length);
@@ -330,20 +331,20 @@ lib::unwind::TARGET::setRegister(gnu::gcj::RawDataManaged* cursor,
     unw_word_t w;
     unw_fpreg_t fp;
   } word;
+  int size;
   if (unw_is_fpreg(regNum))
-    {
-      verifyBounds(offset, length, bytes, start, sizeof(word.fp));
-      status = unw_get_fpreg((::unw_cursor_t *) cursor,
-			     (::unw_regnum_t) regNum,
-			     &word.fp);
-    }
+    size = sizeof(word.fp);
   else
-    {
-      verifyBounds(offset, length, bytes, start, sizeof(word.w));
-      status = unw_get_reg((::unw_cursor_t *) cursor,
+    size = sizeof(word.w);
+  verifyBounds(offset, length, bytes, start, size);
+  if (unw_is_fpreg(regNum))
+    status = unw_get_fpreg((::unw_cursor_t *) cursor,
 			   (::unw_regnum_t) regNum,
-			   &word.w);
-    }
+			   &word.fp);
+  else
+    status = unw_get_reg((::unw_cursor_t *) cursor,
+			 (::unw_regnum_t) regNum,
+			 &word.w);
   if (status != 0)
     throwRuntimeException("set register failed");
   memcpy((uint8_t*)&word + offset, elements(bytes) + start, length);


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


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

only message in thread, other threads:[~2007-12-11 15:18 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-12-11 15:18 [SCM] master: Add 128-bit accessors for i386 XMM registers to libunwind; use cagney

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