diff options
author | jhb <jhb@FreeBSD.org> | 2014-05-17 21:10:03 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2014-05-17 21:10:03 +0000 |
commit | 1c24706a8072cf54a9cbf87879c337dc31982a99 (patch) | |
tree | 5a8cc072f9d07a2f8ab55593359a40c745c45fd5 /sys/amd64 | |
parent | 6f8f959106bd1fde415a7f1cf25f97f62a7077a1 (diff) | |
download | FreeBSD-src-1c24706a8072cf54a9cbf87879c337dc31982a99.zip FreeBSD-src-1c24706a8072cf54a9cbf87879c337dc31982a99.tar.gz |
Add support for decoding rdrand and rdseed.
Diffstat (limited to 'sys/amd64')
-rw-r--r-- | sys/amd64/amd64/db_disasm.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/sys/amd64/amd64/db_disasm.c b/sys/amd64/amd64/db_disasm.c index a8d91eb..fbd9292 100644 --- a/sys/amd64/amd64/db_disasm.c +++ b/sys/amd64/amd64/db_disasm.c @@ -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; |