bnd: Drop bnd prefix for relaxed short jmp instructions

Reverted the redundant branch instruction patterns for bnd prefix.
And when a relaxed jmp instruction becomes a short (Jb) form,
bnd prefix is not needed because it does not initialize bnd registers.
So in that case, bnd prefix is silently dropped.

BND JMP foo       -> drops bnd prefix
BND JMP short foo -> shows an explicit error

Signed-off-by: Jin Kyu Song <jin.kyu.song@intel.com>
This commit is contained in:
Jin Kyu Song 2013-11-21 19:40:42 -08:00
parent 5f3bfee708
commit 305f3cee04
4 changed files with 65 additions and 97 deletions

View file

@ -361,6 +361,7 @@ static bool jmp_match(int32_t segment, int64_t offset, int bits,
int64_t isize;
const uint8_t *code = temp->code;
uint8_t c = code[0];
bool is_byte;
if (((c & ~1) != 0370) || (ins->oprs[0].type & STRICT))
return false;
@ -379,7 +380,14 @@ static bool jmp_match(int32_t segment, int64_t offset, int bits,
return false;
isize = ins->oprs[0].offset - offset - isize; /* isize is delta */
return (isize >= -128 && isize <= 127); /* is it byte size? */
is_byte = (isize >= -128 && isize <= 127); /* is it byte size? */
if (is_byte && c == 0371 && ins->prefixes[PPS_REP] == P_BND) {
/* jmp short (opcode eb) cannot be used with bnd prefix. */
ins->prefixes[PPS_REP] = P_none;
}
return is_byte;
}
int64_t assemble(int32_t segment, int64_t offset, int bits, iflags_t cp,
@ -684,6 +692,9 @@ int64_t assemble(int32_t segment, int64_t offset, int bits, iflags_t cp,
error(ERR_NONFATAL, "instruction not supported in %d-bit mode",
bits);
break;
case MERR_BADBND:
error(ERR_NONFATAL, "bnd prefix is not allowed");
break;
default:
error(ERR_NONFATAL,
"invalid combination of opcode and operands");

139
insns.dat
View file

@ -245,18 +245,18 @@ BTS reg64,reg64 [mr: o64 0f ab /r] X64
BTS rm16,imm [mi: hle o16 0f ba /5 ib,u] 386,SB,LOCK
BTS rm32,imm [mi: hle o32 0f ba /5 ib,u] 386,SB,LOCK
BTS rm64,imm [mi: hle o64 0f ba /5 ib,u] X64,SB,LOCK
CALL imm [i: odf e8 rel] 8086
CALL imm|near [i: odf e8 rel] 8086,ND
CALL imm [i: odf e8 rel] 8086,BND
CALL imm|near [i: odf e8 rel] 8086,ND,BND
CALL imm|far [i: odf 9a iwd seg] 8086,ND,NOLONG
; Call/jmp near imm/reg/mem is always 64-bit in long mode.
CALL imm16 [i: o16 e8 rel] 8086,NOLONG
CALL imm16|near [i: o16 e8 rel] 8086,ND,NOLONG
CALL imm16 [i: o16 e8 rel] 8086,NOLONG,BND
CALL imm16|near [i: o16 e8 rel] 8086,ND,NOLONG,BND
CALL imm16|far [i: o16 9a iwd seg] 8086,ND,NOLONG
CALL imm32 [i: o32 e8 rel] 386,NOLONG
CALL imm32|near [i: o32 e8 rel] 386,ND,NOLONG
CALL imm32 [i: o32 e8 rel] 386,NOLONG,BND
CALL imm32|near [i: o32 e8 rel] 386,ND,NOLONG,BND
CALL imm32|far [i: o32 9a iwd seg] 386,ND,NOLONG
CALL imm64 [i: o64nw e8 rel] X64
CALL imm64|near [i: o64nw e8 rel] X64,ND
CALL imm64 [i: o64nw e8 rel] X64,BND
CALL imm64|near [i: o64nw e8 rel] X64,ND,BND
CALL imm:imm [ji: odf 9a iwd iw] 8086,NOLONG
CALL imm16:imm [ji: o16 9a iw iw] 8086,NOLONG
CALL imm:imm16 [ji: o16 9a iw iw] 8086,NOLONG
@ -267,31 +267,14 @@ CALL mem|far [m: o64 ff /3] X64
CALL mem16|far [m: o16 ff /3] 8086
CALL mem32|far [m: o32 ff /3] 386
CALL mem64|far [m: o64 ff /3] X64
CALL mem|near [m: odf ff /2] 8086,ND
CALL rm16|near [m: o16 ff /2] 8086,NOLONG,ND
CALL rm32|near [m: o32 ff /2] 386,NOLONG,ND
CALL rm64|near [m: o64nw ff /2] X64,ND
CALL mem [m: odf ff /2] 8086
CALL rm16 [m: o16 ff /2] 8086,NOLONG
CALL rm32 [m: o32 ff /2] 386,NOLONG
CALL rm64 [m: o64nw ff /2] X64
; BND + CALL
CALL imm [i: odf e8 rel] 8086,MPX,BND
CALL imm|near [i: odf e8 rel] 8086,ND,MPX,BND
CALL imm16 [i: o16 e8 rel] 8086,NOLONG,MPX,BND
CALL imm16|near [i: o16 e8 rel] 8086,ND,NOLONG,MPX,BND
CALL imm32 [i: o32 e8 rel] 386,NOLONG,MPX,BND
CALL imm32|near [i: o32 e8 rel] 386,ND,NOLONG,MPX,BND
CALL imm64 [i: o64nw e8 rel] X64,MPX,BND
CALL imm64|near [i: o64nw e8 rel] X64,ND,MPX,BND
CALL mem|near [m: odf ff /2] 8086,ND,MPX,BND
CALL rm16|near [m: o16 ff /2] 8086,NOLONG,ND,MPX,BND
CALL rm32|near [m: o32 ff /2] 386,NOLONG,ND,MPX,BND
CALL rm64|near [m: o64nw ff /2] X64,ND,MPX,BND
CALL mem [m: odf ff /2] 8086,MPX,BND
CALL rm16 [m: o16 ff /2] 8086,NOLONG,MPX,BND
CALL rm32 [m: o32 ff /2] 386,NOLONG,MPX,BND
CALL rm64 [m: o64nw ff /2] X64,MPX,BND
CALL mem|near [m: odf ff /2] 8086,ND,BND
CALL rm16|near [m: o16 ff /2] 8086,NOLONG,ND,BND
CALL rm32|near [m: o32 ff /2] 386,NOLONG,ND,BND
CALL rm64|near [m: o64nw ff /2] X64,ND,BND
CALL mem [m: odf ff /2] 8086,BND
CALL rm16 [m: o16 ff /2] 8086,NOLONG,BND
CALL rm32 [m: o32 ff /2] 386,NOLONG,BND
CALL rm64 [m: o64nw ff /2] X64,BND
CBW void [ o16 98] 8086
CDQ void [ o32 99] 386
@ -696,18 +679,18 @@ JECXZ imm [i: a32 e3 rel8] 386
JRCXZ imm [i: a64 e3 rel8] X64
JMP imm|short [i: eb rel8] 8086
JMP imm [i: jmp8 eb rel8] 8086,ND
JMP imm [i: odf e9 rel] 8086
JMP imm|near [i: odf e9 rel] 8086,ND
JMP imm [i: odf e9 rel] 8086,BND
JMP imm|near [i: odf e9 rel] 8086,ND,BND
JMP imm|far [i: odf ea iwd seg] 8086,ND,NOLONG
; Call/jmp near imm/reg/mem is always 64-bit in long mode.
JMP imm16 [i: o16 e9 rel] 8086,NOLONG
JMP imm16|near [i: o16 e9 rel] 8086,ND,NOLONG
JMP imm16 [i: o16 e9 rel] 8086,NOLONG,BND
JMP imm16|near [i: o16 e9 rel] 8086,ND,NOLONG,BND
JMP imm16|far [i: o16 ea iwd seg] 8086,ND,NOLONG
JMP imm32 [i: o32 e9 rel] 386,NOLONG
JMP imm32|near [i: o32 e9 rel] 386,ND,NOLONG
JMP imm32 [i: o32 e9 rel] 386,NOLONG,BND
JMP imm32|near [i: o32 e9 rel] 386,ND,NOLONG,BND
JMP imm32|far [i: o32 ea iwd seg] 386,ND,NOLONG
JMP imm64 [i: o64nw e9 rel] X64
JMP imm64|near [i: o64nw e9 rel] X64,ND
JMP imm64 [i: o64nw e9 rel] X64,BND
JMP imm64|near [i: o64nw e9 rel] X64,ND,BND
JMP imm:imm [ji: odf ea iwd iw] 8086,NOLONG
JMP imm16:imm [ji: o16 ea iw iw] 8086,NOLONG
JMP imm:imm16 [ji: o16 ea iw iw] 8086,NOLONG
@ -718,31 +701,14 @@ JMP mem|far [m: o64 ff /5] X64
JMP mem16|far [m: o16 ff /5] 8086
JMP mem32|far [m: o32 ff /5] 386
JMP mem64|far [m: o64 ff /5] X64
JMP mem|near [m: odf ff /4] 8086,ND
JMP rm16|near [m: o16 ff /4] 8086,NOLONG,ND
JMP rm32|near [m: o32 ff /4] 386,NOLONG,ND
JMP rm64|near [m: o64nw ff /4] X64,ND
JMP mem [m: odf ff /4] 8086
JMP rm16 [m: o16 ff /4] 8086,NOLONG
JMP rm32 [m: o32 ff /4] 386,NOLONG
JMP rm64 [m: o64nw ff /4] X64
; BND + JMP
JMP imm [i: odf e9 rel] 8086,MPX,BND
JMP imm|near [i: odf e9 rel] 8086,ND,MPX,BND
JMP imm16 [i: o16 e9 rel] 8086,NOLONG,MPX,BND
JMP imm16|near [i: o16 e9 rel] 8086,ND,NOLONG,MPX,BND
JMP imm32 [i: o32 e9 rel] 386,NOLONG,MPX,BND
JMP imm32|near [i: o32 e9 rel] 386,ND,NOLONG,MPX,BND
JMP imm64 [i: o64nw e9 rel] X64,MPX,BND
JMP imm64|near [i: o64nw e9 rel] X64,ND,MPX,BND
JMP mem|near [m: odf ff /4] 8086,ND,MPX,BND
JMP rm16|near [m: o16 ff /4] 8086,NOLONG,ND,MPX,BND
JMP rm32|near [m: o32 ff /4] 386,NOLONG,ND,MPX,BND
JMP rm64|near [m: o64nw ff /4] X64,ND,MPX,BND
JMP mem [m: odf ff /4] 8086,MPX,BND
JMP rm16 [m: o16 ff /4] 8086,NOLONG,MPX,BND
JMP rm32 [m: o32 ff /4] 386,NOLONG,MPX,BND
JMP rm64 [m: o64nw ff /4] X64,MPX,BND
JMP mem|near [m: odf ff /4] 8086,ND,BND
JMP rm16|near [m: o16 ff /4] 8086,NOLONG,ND,BND
JMP rm32|near [m: o32 ff /4] 386,NOLONG,ND,BND
JMP rm64|near [m: o64nw ff /4] X64,ND,BND
JMP mem [m: odf ff /4] 8086,BND
JMP rm16 [m: o16 ff /4] 8086,NOLONG,BND
JMP rm32 [m: o32 ff /4] 386,NOLONG,BND
JMP rm64 [m: o64nw ff /4] X64,BND
JMPE imm [i: odf 0f b8 rel] IA64
JMPE imm16 [i: o16 0f b8 rel] IA64
@ -1149,17 +1115,12 @@ RDMSR void [ 0f 32] PENT,PRIV
RDPMC void [ 0f 33] P6
RDTSC void [ 0f 31] PENT
RDTSCP void [ 0f 01 f9] X86_64
RET void [ c3] 8086
RET imm [i: c2 iw] 8086,SW
RET void [ c3] 8086,BND
RET imm [i: c2 iw] 8086,SW,BND
RETF void [ cb] 8086
RETF imm [i: ca iw] 8086,SW
RETN void [ c3] 8086
RETN imm [i: c2 iw] 8086,SW
; BND + RET
RET void [ c3] 8086,MPX,BND
RET imm [i: c2 iw] 8086,SW,MPX,BND
RETN void [ c3] 8086,MPX,BND
RETN imm [i: c2 iw] 8086,SW,MPX,BND
RETN void [ c3] 8086,BND
RETN imm [i: c2 iw] 8086,SW,BND
ROL rm8,unity [m-: d0 /0] 8086
ROL rm8,reg_cl [m-: d2 /0] 8086
@ -1518,25 +1479,15 @@ CMOVcc reg32,mem [rm: o32 0f 40+c /r] P6,SM
CMOVcc reg32,reg32 [rm: o32 0f 40+c /r] P6
CMOVcc reg64,mem [rm: o64 0f 40+c /r] X64,SM
CMOVcc reg64,reg64 [rm: o64 0f 40+c /r] X64
Jcc imm|near [i: odf 0f 80+c rel] 386
Jcc imm16|near [i: o16 0f 80+c rel] 386,NOLONG
Jcc imm32|near [i: o32 0f 80+c rel] 386,NOLONG
Jcc imm64|near [i: o64nw 0f 80+c rel] X64
Jcc imm|short [i: 70+c rel8] 8086,ND
Jcc imm [i: jcc8 70+c rel8] 8086,ND
Jcc imm [i: 0f 80+c rel] 386,ND
Jcc imm [i: 71+c jlen e9 rel] 8086,ND
Jcc imm [i: 70+c rel8] 8086
; BND + Jcc
Jcc imm|near [i: odf 0f 80+c rel] 386,MPX,BND
Jcc imm16|near [i: o16 0f 80+c rel] 386,NOLONG,MPX,BND
Jcc imm32|near [i: o32 0f 80+c rel] 386,NOLONG,MPX,BND
Jcc imm64|near [i: o64nw 0f 80+c rel] X64,MPX,BND
Jcc imm|short [i: 70+c rel8] 8086,ND,MPX,BND
Jcc imm [i: jcc8 70+c rel8] 8086,ND,MPX,BND
Jcc imm [i: 0f 80+c rel] 386,ND,MPX,BND
Jcc imm [i: 71+c jlen e9 rel] 8086,ND,MPX,BND
Jcc imm [i: 70+c rel8] 8086,MPX,BND
Jcc imm|near [i: odf 0f 80+c rel] 386,BND
Jcc imm16|near [i: o16 0f 80+c rel] 386,NOLONG,BND
Jcc imm32|near [i: o32 0f 80+c rel] 386,NOLONG,BND
Jcc imm64|near [i: o64nw 0f 80+c rel] X64,BND
Jcc imm|short [i: 70+c rel8] 8086,ND,BND
Jcc imm [i: jcc8 70+c rel8] 8086,ND,BND
Jcc imm [i: 0f 80+c rel] 386,ND,BND
Jcc imm [i: 71+c jlen e9 rel] 8086,ND,BND
Jcc imm [i: 70+c rel8] 8086,BND
SETcc mem [m: 0f 90+c /0] 386,SB
SETcc reg8 [m: 0f 90+c /0] 386

View file

@ -111,7 +111,10 @@ BITS 64
; bnd
bnd ret
bnd call foo
bnd jmp foo
bnd jmp foo ; when it becomes a Jb form - short jmp (eb),
; bnd prefix is silently dropped
bnd jmp near 0 ; near jmp (opcode e9)
; bnd jmp short 0 ; explicit short jmp (opcode eb) : error
bnd jno foo
foo: bnd ret

View file

@ -79,7 +79,10 @@ BITS 32
; bnd
bnd ret
bnd call foo
bnd jmp foo
bnd jmp foo ; when it becomes a Jb form - short jmp (eb),
; bnd prefix is silently dropped
bnd jmp near 0 ; near jmp (opcode e9)
; bnd jmp short 0 ; explicit short jmp (opcode eb) : error
bnd jno foo
foo: bnd ret