From: Luis Machado <lgustavo@codesourcery.com>
To: <gdb-patches@sourceware.org>
Subject: [PATCH 2/2] [BZ 21005] Add support for Intel 64 rdrand and rdseed record/replay
Date: Thu, 26 Jan 2017 17:19:00 -0000 [thread overview]
Message-ID: <1485451129-16439-2-git-send-email-lgustavo@codesourcery.com> (raw)
In-Reply-To: <1485451129-16439-1-git-send-email-lgustavo@codesourcery.com>
The following patch addresses BZ 21005, which is gdb failing to
recognize an rdrand instruction.
It enables support for both rdrand and rdseed and handles extended register
addressing (R8~R15) for 16-bit, 32-bit and 64-bit.
I tested this by hand with quite a few lines of inline asm. I thought we
had arch-specific tests in testsuite/, but it looks like we don't exercise
every little instruction with record/replay, so no testcase. Let me know
if one is required.
Regression-tested on Ubuntu 16.04 x86-64.
Testsuite results are as follows:
=== gdb Summary ===
# of expected passes 159
OK?
gdb/ChangeLog
2017-01-26 Luis Machado <lgustavo@codesourcery.com>
* NEWS: Mention support for record/replay of Intel 64 rdrand and
rdseed instructions.
i386-tdep.c (i386_process_record): Handle Intel 64 rdrand and rseed.
---
gdb/NEWS | 3 +++
gdb/i386-tdep.c | 30 ++++++++++++++++++++++++++----
2 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/gdb/NEWS b/gdb/NEWS
index 21e8cd3..0f63d9f 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -3,6 +3,9 @@
*** Changes since GDB 7.12
+* GDB now supports recording and replaying rdrand and rdseed Intel 64
+ instructions.
+
* Building GDB and GDBserver now requires a C++11 compiler.
For example, GCC 4.8 or later.
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 8a4d59f..50327bb 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -5501,14 +5501,36 @@ i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
break;
- case 0x0fc7: /* cmpxchg8b */
+ case 0x0fc7: /* cmpxchg8b / rdrand / rdseed */
if (i386_record_modrm (&ir))
return -1;
if (ir.mod == 3)
{
- ir.addr -= 2;
- opcode = opcode << 8 | ir.modrm;
- goto no_support;
+ /* rdrand and rdseed use the 3 bits of the REG field of ModR/M as
+ an extended opcode. rdrand has bits 110 (/6) and rdseed
+ has bits 111 (/7). */
+ if (ir.reg == 6 || ir.reg == 7)
+ {
+ /* The storage register is described by the 3 R/M bits, but the
+ REX.B prefix may be used to give access to registers
+ R8~R15. In this case ir.rex_b + R/M will give us the register
+ in the range R8~R15.
+
+ REX.W may also be used to access 64-bit registers, but we
+ already record entire registers and not just partial bits
+ of them. */
+ I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rex_b + ir.rm);
+ /* These instructions also set conditional bits. */
+ I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
+ break;
+ }
+ else
+ {
+ /* We don't handle this particular instruction yet. */
+ ir.addr -= 2;
+ opcode = opcode << 8 | ir.modrm;
+ goto no_support;
+ }
}
I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
--
2.7.4
next prev parent reply other threads:[~2017-01-26 17:19 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-26 17:19 [PATCH 1/2] Add rdrand/rdseed record/replay tests Luis Machado
2017-01-26 17:19 ` Luis Machado [this message]
2017-01-26 19:36 ` [PATCH 2/2] [BZ 21005] Add support for Intel 64 rdrand and rdseed record/replay Eli Zaretskii
2017-02-01 11:11 ` Pedro Alves
2017-01-26 17:23 ` [PATCH 1/2] Add rdrand/rdseed record/replay tests Luis Machado
2017-02-01 11:11 ` Pedro Alves
2017-02-01 11:09 ` Pedro Alves
[not found] ` <d5eb13e9-07a7-f266-965b-8eeb4aa3f339@codesourcery.com>
2017-02-01 12:55 ` Luis Machado
2017-02-01 15:38 ` Pedro Alves
2017-02-06 9:16 ` Luis Machado
2017-02-23 16:23 ` Yao Qi
2017-02-23 17:20 ` Luis Machado
2017-02-23 17:26 ` Luis Machado
2017-02-23 21:42 ` Yao Qi
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=1485451129-16439-2-git-send-email-lgustavo@codesourcery.com \
--to=lgustavo@codesourcery.com \
--cc=gdb-patches@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