| Index: src/trusted/validator_x86/testdata/64/prefix-2.tf
|
| diff --git a/src/trusted/validator_x86/testdata/64/prefix-2.tf b/src/trusted/validator_x86/testdata/64/prefix-2.tf
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8d99e7e6d7797f14348109ce5bfad50707392e6a
|
| --- /dev/null
|
| +++ b/src/trusted/validator_x86/testdata/64/prefix-2.tf
|
| @@ -0,0 +1,341 @@
|
| +BITS: 64
|
| +OUTCOME: invalid
|
| +
|
| +# 2 prefixes of the same type
|
| +# lock lock add %eax,(%rsp)
|
| +hex: F0 F0 01 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Duplicating a prefix byte is not allowed by Native Client
|
| +
|
| +# mov %edi,%edi
|
| +# lea (%r15,%rdi),%rdi
|
| +# rep rep stos %eax,%es:(%rdi)
|
| +asm: mov %edi,%edi
|
| +hex: 89 FF
|
| +
|
| +asm: lea (%r15,%rdi,1),%rdi
|
| +hex: 49 8D 3C 3F
|
| +
|
| +hex: F3 F3 AB
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Duplicating a prefix byte is not allowed by Native Client
|
| +
|
| +# mov %edi,%edi
|
| +# lea (%r15,%rdi),%rdi
|
| +# repne rep stos %eax,%es:(%rdi)
|
| +asm: mov %edi,%edi
|
| +hex: 89 FF
|
| +
|
| +asm: lea (%r15,%rdi,1),%rdi
|
| +hex: 49 8D 3C 3F
|
| +
|
| +hex: F2 F3 AB
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Use of REPNE (F2) prefix for instruction not allowed by Native Client
|
| +
|
| +# mov %edi,%edi
|
| +# lea (%r15,%rdi),%rdi
|
| +# rep repne scas %es:(%rdi),%al
|
| +asm: mov %edi,%edi
|
| +hex: 89 FF
|
| +
|
| +asm: lea (%r15,%rdi,1),%rdi
|
| +hex: 49 8D 3C 3F
|
| +
|
| +hex: F3 F2 AE
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +
|
| +# fs gs mov %eax,%eax
|
| +asm: fs; gs; mov %eax,%eax
|
| +hex: 64 65 89 C0
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +nc_out: ERROR: Specifying different segment registers using prefix bytes is not allowed by Native Client
|
| +
|
| +# 0x66 mov %ax,%ax
|
| +hex: 66 66 89 C0
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Duplicating a prefix byte is not allowed by Native Client
|
| +
|
| +# 0x67 mov %eax,(%esp)
|
| +hex: 67 67 89 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Duplicating a prefix byte is not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit memory address
|
| +
|
| +# rex rex jmp $
|
| +hex: 40 40 EB FD
|
| +nc_out: ERROR: Multiple use of REX prefix not allowed
|
| +nc_out: [at +1] Bad jump target
|
| +
|
| +
|
| +# 2 prefixes of different type
|
| +# lock add %eax, %ss:(%rsp)
|
| +hex: 36 F0 01 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +
|
| +hex: F0 36 01 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +
|
| +
|
| +# Nops for bundle alignment.
|
| +asm: nop; nop; nop
|
| +hex: 90 90 90
|
| +
|
| +
|
| +# mov %edi,%edi
|
| +# lea (%r15,%rdi),%rdi
|
| +# es rep stos %eax,%es:(%rdi)
|
| +asm: mov %edi,%edi
|
| +hex: 89 FF
|
| +
|
| +asm: lea (%r15,%rdi,1),%rdi
|
| +hex: 49 8D 3C 3F
|
| +nc_out: Bad basic block alignment.
|
| +
|
| +hex: 26 F3 AB
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +
|
| +asm: mov %edi,%edi
|
| +hex: 89 FF
|
| +
|
| +asm: lea (%r15,%rdi,1),%rdi
|
| +hex: 49 8D 3C 3F
|
| +
|
| +hex: F3 26 AB
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +
|
| +# lock add %ax, (%rsp)
|
| +asm: lock add %ax,(%rsp)
|
| +hex: 66 F0 01 04 24
|
| +
|
| +hex: F0 66 01 04 24
|
| +
|
| +# Doesn't validate due to bug.
|
| +# mov %edi,%edi
|
| +# lea (%r15,%rdi),%rdi
|
| +# rep stosw %ax,%es:(%rdi)
|
| +asm: mov %edi,%edi
|
| +hex: 89 FF
|
| +
|
| +asm: lea (%r15,%rdi,1),%rdi
|
| +hex: 49 8D 3C 3F
|
| +
|
| +asm: rep stos %ax,%es:(%rdi)
|
| +hex: 66 F3 AB
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: Bad basic block alignment.
|
| +
|
| +asm: mov %edi,%edi
|
| +hex: 89 FF
|
| +
|
| +asm: lea (%r15,%rdi,1),%rdi
|
| +hex: 49 8D 3C 3F
|
| +
|
| +hex: F3 66 AB
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +
|
| +# lock add %eax, (%esp)
|
| +asm: lock addr32 add %eax,(%esp)
|
| +hex: 67 F0 01 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit memory address
|
| +
|
| +hex: F0 67 01 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit memory address
|
| +
|
| +
|
| +# Nop for bundle alignment.
|
| +asm: nop
|
| +hex: 90
|
| +
|
| +
|
| +# rep stos %eax, %es:(%edi)
|
| +asm: mov %edi,%edi
|
| +hex: 89 FF
|
| +
|
| +asm: lea (%r15,%rdi,1),%rdi
|
| +hex: 49 8D 3C 3F
|
| +
|
| +asm: rep addr32 stos %eax,%es:(%edi)
|
| +hex: 67 F3 AB
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit segment address
|
| +
|
| +asm: mov %edi,%edi
|
| +hex: 89 FF
|
| +
|
| +asm: lea (%r15,%rdi,1),%rdi
|
| +hex: 49 8D 3C 3F
|
| +
|
| +hex: F3 67 AB
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit segment address
|
| +
|
| +# lock add %rax, (%rsp)
|
| +asm: lock add %rax,(%rsp)
|
| +hex: f0 48 01 04 24
|
| +
|
| +asm: rex.W; lock add %eax,(%rsp)
|
| +hex: 48 f0 01 04 24
|
| +nc_out: ERROR: REX prefix byte must appear last
|
| +
|
| +# mov %edi,%edi
|
| +# lea (%r15,%rdi),%rdi
|
| +# rep stos %rax,%es:(%rdi)
|
| +asm: mov %edi,%edi
|
| +hex: 89 FF
|
| +
|
| +asm: lea (%r15,%rdi,1),%rdi
|
| +hex: 49 8D 3C 3F
|
| +
|
| +asm: rep stos %rax,%es:(%rdi)
|
| +hex: F3 48 AB
|
| +
|
| +# fs mov %ax,%ax
|
| +asm: fs; mov %ax,%ax
|
| +hex: 64 66 89 C0
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +
|
| +asm: data16; fs; mov %eax,%eax
|
| +hex: 66 64 89 C0
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +
|
| +# fs add %eax, (%esp)
|
| +hex: 67 64 01 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit segment address
|
| +
|
| +asm: addr32 add %eax,%fs:(%esp)
|
| +hex: 64 67 01 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit segment address
|
| +
|
| +# fs mov %rax,%rax
|
| +asm: fs; mov %rax,%rax
|
| +hex: 64 48 89 C0
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +
|
| +asm: rex.W; fs; mov %eax,%eax
|
| +hex: 48 64 89 C0
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +nc_out: ERROR: REX prefix byte must appear last
|
| +
|
| +# add %ax, (%esp)
|
| +hex: 66 67 01 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit memory address
|
| +
|
| +asm: addr32 add %ax,(%esp)
|
| +hex: 67 66 01 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit memory address
|
| +
|
| +# mov %r15l, (%rsp)
|
| +asm: mov %r15w,(%rsp)
|
| +hex: 66 44 89 3C 24
|
| +
|
| +asm: rex.R; mov %di,(%rsp)
|
| +hex: 44 66 89 3C 24
|
| +nc_out: ERROR: REX prefix byte must appear last
|
| +
|
| +# mov %r15, (%esp)
|
| +asm: addr32 mov %r15,(%esp)
|
| +hex: 67 4C 89 3C 24
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit memory address
|
| +
|
| +asm: rex.WR; addr32 mov %edi,(%esp)
|
| +hex: 4C 67 89 3C 24
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: REX prefix byte must appear last
|
| +nc_out: ERROR: Assignment to non-64 bit memory address
|
| +
|
| +
|
| +# 2 prefixes when one is mandatory
|
| +# fs phaddw %xmm0,%xmm1
|
| +asm: fs; phaddw %xmm0,%xmm1
|
| +hex: 64 66 0F 38 01 C8
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +
|
| +# fs addsd %xmm0,%xmm1
|
| +asm: fs; addsd %xmm0,%xmm1
|
| +hex: 64 F2 0F 58 C8
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Uses a segment prefix byte not allowed by Native Client
|
| +
|
| +# 0x66 phaddw %xmm0,%xmm1
|
| +hex: 66 66 0F 38 01 C8
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Duplicating a prefix byte is not allowed by Native Client
|
| +nc_out: [at +1] Bad basic block alignment.
|
| +
|
| +# 0x66 addsd %xmm0,%xmm1
|
| +asm: data16; addsd %xmm0,%xmm1
|
| +hex: 66 F2 0F 58 C8
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Use of DATA16 (66) prefix for instruction not allowed by Native Client
|
| +
|
| +# phaddw (%esp), %xmm0
|
| +asm: addr32 phaddw (%esp),%xmm0
|
| +hex: 67 66 0f 38 01 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit memory address
|
| +
|
| +# addsd (%esp), %xmm0
|
| +asm: addr32 addsd (%esp),%xmm0
|
| +hex: 67 f2 0f 58 04 24
|
| +nc_out: ERROR: More than one (non-REX) prefix byte specified
|
| +nc_out: ERROR: Use of 67 (ADDR16) prefix not allowed by Native Client
|
| +nc_out: ERROR: Assignment to non-64 bit memory address
|
| +
|
| +# mov %eax,%eax
|
| +# phaddw (%r15,%rax),%xmm0
|
| +asm: mov %eax,%eax
|
| +hex: 89 C0
|
| +
|
| +asm: phaddw (%r15,%rax,1),%xmm0
|
| +hex: 66 41 0F 38 01 04 07
|
| +
|
| +asm: mov %eax,%eax
|
| +hex: 89 C0
|
| +
|
| +asm: rex.B; phaddw (%rdi,%rax,1),%xmm0
|
| +hex: 41 66 0F 38 01 04 07
|
| +nc_out: ERROR: REX prefix byte must appear last
|
| +
|
| +# mov %eax,%eax
|
| +# addsd (%r15,%rax),%xmm0
|
| +asm: mov %eax,%eax
|
| +hex: 89 C0
|
| +
|
| +asm: addsd (%r15,%rax,1),%xmm0
|
| +hex: F2 41 0F 58 04 07
|
| +
|
| +asm: mov %eax,%eax
|
| +hex: 89 C0
|
| +
|
| +asm: rex.B; addsd (%rdi,%rax,1),%xmm0
|
| +hex: 41 F2 0F 58 04 07
|
| +nc_out: ERROR: REX prefix byte must appear last
|
| +
|
|
|