svn commit: r266354 - head/sys/amd64/amd64
John Baldwin
jhb at FreeBSD.org
Sat May 17 21:10:04 UTC 2014
Author: jhb
Date: Sat May 17 21:10:03 2014
New Revision: 266354
URL: http://svnweb.freebsd.org/changeset/base/266354
Log:
Add support for decoding rdrand and rdseed.
Modified:
head/sys/amd64/amd64/db_disasm.c
Modified: head/sys/amd64/amd64/db_disasm.c
==============================================================================
--- head/sys/amd64/amd64/db_disasm.c Sat May 17 21:07:54 2014 (r266353)
+++ head/sys/amd64/amd64/db_disasm.c Sat May 17 21:10:03 2014 (r266354)
@@ -71,6 +71,7 @@ __FBSDID("$FreeBSD$");
#define R 5 /* register, in 'reg' field */
#define Rw 6 /* word register, in 'reg' field */
#define Rq 39 /* quad register, in 'reg' field */
+#define Rv 40 /* register in 'r/m' field */
#define Ri 7 /* register in instruction */
#define S 8 /* segment reg, in 'reg' field */
#define Si 9 /* segment reg, in instruction */
@@ -628,6 +629,17 @@ static const struct inst db_Grp5[] = {
{ "", TRUE, NONE, 0, 0 }
};
+static const struct inst db_Grp9b[] = {
+ { "", TRUE, NONE, 0, 0 },
+ { "", TRUE, NONE, 0, 0 },
+ { "", TRUE, NONE, 0, 0 },
+ { "", TRUE, NONE, 0, 0 },
+ { "", TRUE, NONE, 0, 0 },
+ { "", TRUE, NONE, 0, 0 },
+ { "rdrand",TRUE, LONG, op1(Rv), 0 },
+ { "rdseed",TRUE, LONG, op1(Rv), 0 }
+};
+
static const struct inst db_inst_table[256] = {
/*00*/ { "add", TRUE, BYTE, op2(R, E), 0 },
/*01*/ { "add", TRUE, LONG, op2(R, E), 0 },
@@ -1300,7 +1312,13 @@ db_disasm(loc, altfmt)
i_size = ip->i_size;
i_mode = ip->i_mode;
- if (ip->i_extra == db_Grp1 || ip->i_extra == db_Grp2 ||
+ if (ip->i_extra == db_Grp9 && f_mod(rex, regmodrm) == 3) {
+ ip = &db_Grp9b[f_reg(rex, regmodrm)];
+ i_name = ip->i_name;
+ i_size = ip->i_size;
+ i_mode = ip->i_mode;
+ }
+ else if (ip->i_extra == db_Grp1 || ip->i_extra == db_Grp2 ||
ip->i_extra == db_Grp6 || ip->i_extra == db_Grp7 ||
ip->i_extra == db_Grp8 || ip->i_extra == db_Grp9 ||
ip->i_extra == db_Grp15) {
@@ -1511,6 +1529,10 @@ db_disasm(loc, altfmt)
db_printf("%s", db_reg[rex != 0 ? 1 : 0][(rex & REX_R) ? QUAD : LONG][f_rm(rex, inst)]);
break;
+ case Rv:
+ db_printf("%s", db_reg[rex != 0 ? 1 : 0][(size == LONG && (rex & REX_W)) ? QUAD : size][f_rm(rex, regmodrm)]);
+ break;
+
case S:
db_printf("%s", db_seg_reg[f_reg(rex, regmodrm)]);
break;
More information about the svn-src-head
mailing list