From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19592 invoked by alias); 11 Dec 2007 15:18:15 -0000 Received: (qmail 19544 invoked by uid 367); 11 Dec 2007 15:18:14 -0000 Date: Tue, 11 Dec 2007 15:18:00 -0000 Message-ID: <20071211151814.19529.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Add 128-bit accessors for i386 XMM registers to libunwind; use. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 2579d604e2b8ce0bc583e872642ecdfefb957cfa X-Git-Newrev: 6c23569523a01607cc228900d76331a5b91c3329 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2007-q4/txt/msg00563.txt.bz2 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 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 * LibunwindRegisterMapFactory.java (IA32): Add XMM registers. * TestRegs.java (testVectorRegisters()): Enable on IA-32. frysk-imports/libunwind/ChangeLog 2007-12-10 Andrew Cagney * 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 + * 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 + + * 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 * 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