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