public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Add 128-bit accessors for i386 XMM registers to libunwind; use.
Date: Tue, 11 Dec 2007 15:18:00 -0000	[thread overview]
Message-ID: <20071211151814.19529.qmail@sourceware.org> (raw)

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


                 reply	other threads:[~2007-12-11 15:18 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=20071211151814.19529.qmail@sourceware.org \
    --to=cagney@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).