174fe6c29SRuslan Bukin /*
2*85f87cf4SRuslan Bukin * Copyright (c) 2013-2019, Intel Corporation
374fe6c29SRuslan Bukin *
474fe6c29SRuslan Bukin * Redistribution and use in source and binary forms, with or without
574fe6c29SRuslan Bukin * modification, are permitted provided that the following conditions are met:
674fe6c29SRuslan Bukin *
774fe6c29SRuslan Bukin * * Redistributions of source code must retain the above copyright notice,
874fe6c29SRuslan Bukin * this list of conditions and the following disclaimer.
974fe6c29SRuslan Bukin * * Redistributions in binary form must reproduce the above copyright notice,
1074fe6c29SRuslan Bukin * this list of conditions and the following disclaimer in the documentation
1174fe6c29SRuslan Bukin * and/or other materials provided with the distribution.
1274fe6c29SRuslan Bukin * * Neither the name of Intel Corporation nor the names of its contributors
1374fe6c29SRuslan Bukin * may be used to endorse or promote products derived from this software
1474fe6c29SRuslan Bukin * without specific prior written permission.
1574fe6c29SRuslan Bukin *
1674fe6c29SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1774fe6c29SRuslan Bukin * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1874fe6c29SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1974fe6c29SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2074fe6c29SRuslan Bukin * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2174fe6c29SRuslan Bukin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2274fe6c29SRuslan Bukin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2374fe6c29SRuslan Bukin * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2474fe6c29SRuslan Bukin * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2574fe6c29SRuslan Bukin * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2674fe6c29SRuslan Bukin * POSSIBILITY OF SUCH DAMAGE.
2774fe6c29SRuslan Bukin */
2874fe6c29SRuslan Bukin
2974fe6c29SRuslan Bukin #include "ptunit.h"
3074fe6c29SRuslan Bukin
3174fe6c29SRuslan Bukin #include "pt_ild.h"
3274fe6c29SRuslan Bukin
3374fe6c29SRuslan Bukin #include <string.h>
3474fe6c29SRuslan Bukin
3574fe6c29SRuslan Bukin
3674fe6c29SRuslan Bukin /* Check that an instruction is decoded correctly. */
ptunit_ild_decode(uint8_t * raw,uint8_t size,enum pt_exec_mode mode)3774fe6c29SRuslan Bukin static struct ptunit_result ptunit_ild_decode(uint8_t *raw, uint8_t size,
3874fe6c29SRuslan Bukin enum pt_exec_mode mode)
3974fe6c29SRuslan Bukin {
4074fe6c29SRuslan Bukin struct pt_insn_ext iext;
4174fe6c29SRuslan Bukin struct pt_insn insn;
4274fe6c29SRuslan Bukin int errcode;
4374fe6c29SRuslan Bukin
4474fe6c29SRuslan Bukin memset(&iext, 0, sizeof(iext));
4574fe6c29SRuslan Bukin memset(&insn, 0, sizeof(insn));
4674fe6c29SRuslan Bukin
4774fe6c29SRuslan Bukin memcpy(insn.raw, raw, size);
4874fe6c29SRuslan Bukin insn.size = size;
4974fe6c29SRuslan Bukin insn.mode = mode;
5074fe6c29SRuslan Bukin
5174fe6c29SRuslan Bukin errcode = pt_ild_decode(&insn, &iext);
5274fe6c29SRuslan Bukin ptu_int_eq(errcode, 0);
5374fe6c29SRuslan Bukin
5474fe6c29SRuslan Bukin ptu_uint_eq(insn.size, size);
5574fe6c29SRuslan Bukin ptu_int_eq(insn.iclass, ptic_other);
5674fe6c29SRuslan Bukin ptu_int_eq(iext.iclass, PTI_INST_INVALID);
5774fe6c29SRuslan Bukin
5874fe6c29SRuslan Bukin return ptu_passed();
5974fe6c29SRuslan Bukin }
6074fe6c29SRuslan Bukin
6174fe6c29SRuslan Bukin /* Check that an instruction is decoded and classified correctly. */
ptunit_ild_classify(uint8_t * raw,uint8_t size,enum pt_exec_mode mode,pti_inst_enum_t iclass)6274fe6c29SRuslan Bukin static struct ptunit_result ptunit_ild_classify(uint8_t *raw, uint8_t size,
6374fe6c29SRuslan Bukin enum pt_exec_mode mode,
6474fe6c29SRuslan Bukin pti_inst_enum_t iclass)
6574fe6c29SRuslan Bukin {
6674fe6c29SRuslan Bukin struct pt_insn_ext iext;
6774fe6c29SRuslan Bukin struct pt_insn insn;
6874fe6c29SRuslan Bukin int errcode;
6974fe6c29SRuslan Bukin
7074fe6c29SRuslan Bukin memset(&iext, 0, sizeof(iext));
7174fe6c29SRuslan Bukin memset(&insn, 0, sizeof(insn));
7274fe6c29SRuslan Bukin
7374fe6c29SRuslan Bukin memcpy(insn.raw, raw, size);
7474fe6c29SRuslan Bukin insn.size = size;
7574fe6c29SRuslan Bukin insn.mode = mode;
7674fe6c29SRuslan Bukin
7774fe6c29SRuslan Bukin errcode = pt_ild_decode(&insn, &iext);
7874fe6c29SRuslan Bukin ptu_int_eq(errcode, 0);
7974fe6c29SRuslan Bukin
8074fe6c29SRuslan Bukin ptu_uint_eq(insn.size, size);
8174fe6c29SRuslan Bukin ptu_int_eq(iext.iclass, iclass);
8274fe6c29SRuslan Bukin
8374fe6c29SRuslan Bukin return ptu_passed();
8474fe6c29SRuslan Bukin }
8574fe6c29SRuslan Bukin
8674fe6c29SRuslan Bukin /* Check that an invalid instruction is detected correctly.
8774fe6c29SRuslan Bukin *
8874fe6c29SRuslan Bukin * Note that we intentionally do not detect all invalid instructions. This test
8974fe6c29SRuslan Bukin * therefore only covers some that we care about.
9074fe6c29SRuslan Bukin */
ptunit_ild_invalid(uint8_t * raw,uint8_t size,enum pt_exec_mode mode)9174fe6c29SRuslan Bukin static struct ptunit_result ptunit_ild_invalid(uint8_t *raw, uint8_t size,
9274fe6c29SRuslan Bukin enum pt_exec_mode mode)
9374fe6c29SRuslan Bukin {
9474fe6c29SRuslan Bukin struct pt_insn_ext iext;
9574fe6c29SRuslan Bukin struct pt_insn insn;
9674fe6c29SRuslan Bukin int errcode;
9774fe6c29SRuslan Bukin
9874fe6c29SRuslan Bukin memset(&iext, 0, sizeof(iext));
9974fe6c29SRuslan Bukin memset(&insn, 0, sizeof(insn));
10074fe6c29SRuslan Bukin
10174fe6c29SRuslan Bukin memcpy(insn.raw, raw, size);
10274fe6c29SRuslan Bukin insn.size = size;
10374fe6c29SRuslan Bukin insn.mode = mode;
10474fe6c29SRuslan Bukin
10574fe6c29SRuslan Bukin errcode = pt_ild_decode(&insn, &iext);
10674fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_bad_insn);
10774fe6c29SRuslan Bukin
10874fe6c29SRuslan Bukin return ptu_passed();
10974fe6c29SRuslan Bukin }
11074fe6c29SRuslan Bukin
11174fe6c29SRuslan Bukin
11274fe6c29SRuslan Bukin /* Macros to automatically update the test location. */
11374fe6c29SRuslan Bukin #define ptu_decode(insn, size, mode) \
11474fe6c29SRuslan Bukin ptu_check(ptunit_ild_decode, insn, size, mode)
11574fe6c29SRuslan Bukin
11674fe6c29SRuslan Bukin #define ptu_classify(insn, size, mode, iclass) \
11774fe6c29SRuslan Bukin ptu_check(ptunit_ild_classify, insn, size, mode, iclass)
11874fe6c29SRuslan Bukin
11974fe6c29SRuslan Bukin /* Macros to also automatically supply the instruction size. */
12074fe6c29SRuslan Bukin #define ptu_decode_s(insn, mode) \
12174fe6c29SRuslan Bukin ptu_decode(insn, sizeof(insn), mode)
12274fe6c29SRuslan Bukin
12374fe6c29SRuslan Bukin #define ptu_classify_s(insn, mode, iclass) \
12474fe6c29SRuslan Bukin ptu_classify(insn, sizeof(insn), mode, iclass)
12574fe6c29SRuslan Bukin
12674fe6c29SRuslan Bukin #define ptu_invalid_s(insn, mode) \
12774fe6c29SRuslan Bukin ptu_check(ptunit_ild_invalid, insn, sizeof(insn), mode)
12874fe6c29SRuslan Bukin
12974fe6c29SRuslan Bukin
push(void)13074fe6c29SRuslan Bukin static struct ptunit_result push(void)
13174fe6c29SRuslan Bukin {
13274fe6c29SRuslan Bukin uint8_t insn[] = { 0x68, 0x11, 0x22, 0x33, 0x44 };
13374fe6c29SRuslan Bukin
13474fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
13574fe6c29SRuslan Bukin
13674fe6c29SRuslan Bukin return ptu_passed();
13774fe6c29SRuslan Bukin }
13874fe6c29SRuslan Bukin
jmp_rel(void)13974fe6c29SRuslan Bukin static struct ptunit_result jmp_rel(void)
14074fe6c29SRuslan Bukin {
14174fe6c29SRuslan Bukin uint8_t insn[] = { 0xE9, 0x60, 0xF9, 0xFF, 0xFF };
14274fe6c29SRuslan Bukin
14374fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_JMP_E9);
14474fe6c29SRuslan Bukin
14574fe6c29SRuslan Bukin return ptu_passed();
14674fe6c29SRuslan Bukin }
14774fe6c29SRuslan Bukin
long_nop(void)14874fe6c29SRuslan Bukin static struct ptunit_result long_nop(void)
14974fe6c29SRuslan Bukin {
15074fe6c29SRuslan Bukin uint8_t insn[] = { 0x66, 0x66, 0x66, 0x66,
15174fe6c29SRuslan Bukin 0x66, 0x66, 0X2E, 0X0F,
15274fe6c29SRuslan Bukin 0X1F, 0x84, 0x00, 0x00,
15374fe6c29SRuslan Bukin 0x00, 0x00, 0x00 };
15474fe6c29SRuslan Bukin
15574fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
15674fe6c29SRuslan Bukin
15774fe6c29SRuslan Bukin return ptu_passed();
15874fe6c29SRuslan Bukin }
15974fe6c29SRuslan Bukin
mov_al_64(void)16074fe6c29SRuslan Bukin static struct ptunit_result mov_al_64(void)
16174fe6c29SRuslan Bukin {
16274fe6c29SRuslan Bukin uint8_t insn[] = { 0x48, 0xa0, 0x3f, 0xaa, 0xbb, 0xcc, 0xdd, 0xee,
16374fe6c29SRuslan Bukin 0xff, 0x11 };
16474fe6c29SRuslan Bukin
16574fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
16674fe6c29SRuslan Bukin
16774fe6c29SRuslan Bukin return ptu_passed();
16874fe6c29SRuslan Bukin }
16974fe6c29SRuslan Bukin
mov_al_32_em64(void)17074fe6c29SRuslan Bukin static struct ptunit_result mov_al_32_em64(void)
17174fe6c29SRuslan Bukin {
17274fe6c29SRuslan Bukin uint8_t insn[] = { 0x67, 0xa0, 0x3f, 0xaa, 0xbb, 0xcc, 0xdd, 0xee,
17374fe6c29SRuslan Bukin 0xff, 0X11 };
17474fe6c29SRuslan Bukin
17574fe6c29SRuslan Bukin ptu_decode(insn, 6, ptem_64bit);
17674fe6c29SRuslan Bukin
17774fe6c29SRuslan Bukin return ptu_passed();
17874fe6c29SRuslan Bukin }
17974fe6c29SRuslan Bukin
mov_al_32(void)18074fe6c29SRuslan Bukin static struct ptunit_result mov_al_32(void)
18174fe6c29SRuslan Bukin {
18274fe6c29SRuslan Bukin uint8_t insn[] = { 0xa0, 0x3f, 0xaa, 0xbb, 0xcc, 0xdd, 0xee };
18374fe6c29SRuslan Bukin
18474fe6c29SRuslan Bukin ptu_decode(insn, 5, ptem_32bit);
18574fe6c29SRuslan Bukin
18674fe6c29SRuslan Bukin return ptu_passed();
18774fe6c29SRuslan Bukin }
18874fe6c29SRuslan Bukin
mov_al_32_em16(void)18974fe6c29SRuslan Bukin static struct ptunit_result mov_al_32_em16(void)
19074fe6c29SRuslan Bukin {
19174fe6c29SRuslan Bukin uint8_t insn[] = { 0x67, 0xa0, 0x3f, 0xaa, 0xbb, 0xcc, 0xdd, 0xee };
19274fe6c29SRuslan Bukin
19374fe6c29SRuslan Bukin ptu_decode(insn, 6, ptem_16bit);
19474fe6c29SRuslan Bukin
19574fe6c29SRuslan Bukin return ptu_passed();
19674fe6c29SRuslan Bukin }
19774fe6c29SRuslan Bukin
mov_al_16_em32(void)19874fe6c29SRuslan Bukin static struct ptunit_result mov_al_16_em32(void)
19974fe6c29SRuslan Bukin {
20074fe6c29SRuslan Bukin uint8_t insn[] = { 0x67, 0xa0, 0x3f, 0xaa, 0xbb, 0xcc, 0xdd, 0xee };
20174fe6c29SRuslan Bukin
20274fe6c29SRuslan Bukin ptu_decode(insn, 4, ptem_32bit);
20374fe6c29SRuslan Bukin
20474fe6c29SRuslan Bukin return ptu_passed();
20574fe6c29SRuslan Bukin }
20674fe6c29SRuslan Bukin
mov_al_16(void)20774fe6c29SRuslan Bukin static struct ptunit_result mov_al_16(void)
20874fe6c29SRuslan Bukin {
20974fe6c29SRuslan Bukin uint8_t insn[] = { 0xa0, 0x3f, 0xaa, 0xbb, 0xcc, 0xdd, 0xee };
21074fe6c29SRuslan Bukin
21174fe6c29SRuslan Bukin ptu_decode(insn, 3, ptem_16bit);
21274fe6c29SRuslan Bukin
21374fe6c29SRuslan Bukin return ptu_passed();
21474fe6c29SRuslan Bukin }
21574fe6c29SRuslan Bukin
rdtsc(void)21674fe6c29SRuslan Bukin static struct ptunit_result rdtsc(void)
21774fe6c29SRuslan Bukin {
21874fe6c29SRuslan Bukin uint8_t insn[] = { 0x0f, 0x31 };
21974fe6c29SRuslan Bukin
22074fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
22174fe6c29SRuslan Bukin
22274fe6c29SRuslan Bukin return ptu_passed();
22374fe6c29SRuslan Bukin }
22474fe6c29SRuslan Bukin
pcmpistri(void)22574fe6c29SRuslan Bukin static struct ptunit_result pcmpistri(void)
22674fe6c29SRuslan Bukin {
22774fe6c29SRuslan Bukin uint8_t insn[] = { 0x66, 0x0f, 0x3a, 0x63, 0x04, 0x16, 0x1a };
22874fe6c29SRuslan Bukin
22974fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
23074fe6c29SRuslan Bukin
23174fe6c29SRuslan Bukin return ptu_passed();
23274fe6c29SRuslan Bukin }
23374fe6c29SRuslan Bukin
vmovdqa(void)23474fe6c29SRuslan Bukin static struct ptunit_result vmovdqa(void)
23574fe6c29SRuslan Bukin {
23674fe6c29SRuslan Bukin uint8_t insn[] = { 0xc5, 0xf9, 0x6f, 0x25, 0xa9, 0x55, 0x04, 0x00 };
23774fe6c29SRuslan Bukin
23874fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
23974fe6c29SRuslan Bukin
24074fe6c29SRuslan Bukin return ptu_passed();
24174fe6c29SRuslan Bukin }
24274fe6c29SRuslan Bukin
vpandn(void)24374fe6c29SRuslan Bukin static struct ptunit_result vpandn(void)
24474fe6c29SRuslan Bukin {
24574fe6c29SRuslan Bukin uint8_t insn[] = { 0xc4, 0x41, 0x29, 0xdf, 0xd1 };
24674fe6c29SRuslan Bukin
24774fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
24874fe6c29SRuslan Bukin
24974fe6c29SRuslan Bukin return ptu_passed();
25074fe6c29SRuslan Bukin }
25174fe6c29SRuslan Bukin
syscall(void)25274fe6c29SRuslan Bukin static struct ptunit_result syscall(void)
25374fe6c29SRuslan Bukin {
25474fe6c29SRuslan Bukin uint8_t insn[] = { 0x0f, 0x05 };
25574fe6c29SRuslan Bukin
25674fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_SYSCALL);
25774fe6c29SRuslan Bukin
25874fe6c29SRuslan Bukin return ptu_passed();
25974fe6c29SRuslan Bukin }
26074fe6c29SRuslan Bukin
sysret(void)26174fe6c29SRuslan Bukin static struct ptunit_result sysret(void)
26274fe6c29SRuslan Bukin {
26374fe6c29SRuslan Bukin uint8_t insn[] = { 0x0f, 0x07 };
26474fe6c29SRuslan Bukin
26574fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_SYSRET);
26674fe6c29SRuslan Bukin
26774fe6c29SRuslan Bukin return ptu_passed();
26874fe6c29SRuslan Bukin }
26974fe6c29SRuslan Bukin
sysenter(void)27074fe6c29SRuslan Bukin static struct ptunit_result sysenter(void)
27174fe6c29SRuslan Bukin {
27274fe6c29SRuslan Bukin uint8_t insn[] = { 0x0f, 0x34 };
27374fe6c29SRuslan Bukin
27474fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_SYSENTER);
27574fe6c29SRuslan Bukin
27674fe6c29SRuslan Bukin return ptu_passed();
27774fe6c29SRuslan Bukin }
27874fe6c29SRuslan Bukin
sysexit(void)27974fe6c29SRuslan Bukin static struct ptunit_result sysexit(void)
28074fe6c29SRuslan Bukin {
28174fe6c29SRuslan Bukin uint8_t insn[] = { 0x0f, 0x35 };
28274fe6c29SRuslan Bukin
28374fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_SYSEXIT);
28474fe6c29SRuslan Bukin
28574fe6c29SRuslan Bukin return ptu_passed();
28674fe6c29SRuslan Bukin }
28774fe6c29SRuslan Bukin
int3(void)28874fe6c29SRuslan Bukin static struct ptunit_result int3(void)
28974fe6c29SRuslan Bukin {
29074fe6c29SRuslan Bukin uint8_t insn[] = { 0xcc };
29174fe6c29SRuslan Bukin
29274fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_INT3);
29374fe6c29SRuslan Bukin
29474fe6c29SRuslan Bukin return ptu_passed();
29574fe6c29SRuslan Bukin }
29674fe6c29SRuslan Bukin
intn(void)29774fe6c29SRuslan Bukin static struct ptunit_result intn(void)
29874fe6c29SRuslan Bukin {
29974fe6c29SRuslan Bukin uint8_t insn[] = { 0xcd, 0x06 };
30074fe6c29SRuslan Bukin
30174fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_INT);
30274fe6c29SRuslan Bukin
30374fe6c29SRuslan Bukin return ptu_passed();
30474fe6c29SRuslan Bukin }
30574fe6c29SRuslan Bukin
iret(void)30674fe6c29SRuslan Bukin static struct ptunit_result iret(void)
30774fe6c29SRuslan Bukin {
30874fe6c29SRuslan Bukin uint8_t insn[] = { 0xcf };
30974fe6c29SRuslan Bukin
31074fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_IRET);
31174fe6c29SRuslan Bukin
31274fe6c29SRuslan Bukin return ptu_passed();
31374fe6c29SRuslan Bukin }
31474fe6c29SRuslan Bukin
call_9a_cd(void)31574fe6c29SRuslan Bukin static struct ptunit_result call_9a_cd(void)
31674fe6c29SRuslan Bukin {
31774fe6c29SRuslan Bukin uint8_t insn[] = { 0x9a, 0x00, 0x00, 0x00, 0x00 };
31874fe6c29SRuslan Bukin
31974fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_16bit, PTI_INST_CALL_9A);
32074fe6c29SRuslan Bukin
32174fe6c29SRuslan Bukin return ptu_passed();
32274fe6c29SRuslan Bukin }
32374fe6c29SRuslan Bukin
call_9a_cp(void)32474fe6c29SRuslan Bukin static struct ptunit_result call_9a_cp(void)
32574fe6c29SRuslan Bukin {
32674fe6c29SRuslan Bukin uint8_t insn[] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
32774fe6c29SRuslan Bukin
32874fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_32bit, PTI_INST_CALL_9A);
32974fe6c29SRuslan Bukin
33074fe6c29SRuslan Bukin return ptu_passed();
33174fe6c29SRuslan Bukin }
33274fe6c29SRuslan Bukin
call_ff_3(void)33374fe6c29SRuslan Bukin static struct ptunit_result call_ff_3(void)
33474fe6c29SRuslan Bukin {
33574fe6c29SRuslan Bukin uint8_t insn[] = { 0xff, 0x1c, 0x25, 0x00, 0x00, 0x00, 0x00 };
33674fe6c29SRuslan Bukin
33774fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_CALL_FFr3);
33874fe6c29SRuslan Bukin
33974fe6c29SRuslan Bukin return ptu_passed();
34074fe6c29SRuslan Bukin }
34174fe6c29SRuslan Bukin
jmp_ff_5(void)34274fe6c29SRuslan Bukin static struct ptunit_result jmp_ff_5(void)
34374fe6c29SRuslan Bukin {
34474fe6c29SRuslan Bukin uint8_t insn[] = { 0xff, 0x2c, 0x25, 0x00, 0x00, 0x00, 0x00 };
34574fe6c29SRuslan Bukin
34674fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_JMP_FFr5);
34774fe6c29SRuslan Bukin
34874fe6c29SRuslan Bukin return ptu_passed();
34974fe6c29SRuslan Bukin }
35074fe6c29SRuslan Bukin
jmp_ea_cd(void)35174fe6c29SRuslan Bukin static struct ptunit_result jmp_ea_cd(void)
35274fe6c29SRuslan Bukin {
35374fe6c29SRuslan Bukin uint8_t insn[] = { 0xea, 0x00, 0x00, 0x00, 0x00 };
35474fe6c29SRuslan Bukin
35574fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_16bit, PTI_INST_JMP_EA);
35674fe6c29SRuslan Bukin
35774fe6c29SRuslan Bukin return ptu_passed();
35874fe6c29SRuslan Bukin }
35974fe6c29SRuslan Bukin
jmp_ea_cp(void)36074fe6c29SRuslan Bukin static struct ptunit_result jmp_ea_cp(void)
36174fe6c29SRuslan Bukin {
36274fe6c29SRuslan Bukin uint8_t insn[] = { 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
36374fe6c29SRuslan Bukin
36474fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_32bit, PTI_INST_JMP_EA);
36574fe6c29SRuslan Bukin
36674fe6c29SRuslan Bukin return ptu_passed();
36774fe6c29SRuslan Bukin }
36874fe6c29SRuslan Bukin
ret_ca(void)36974fe6c29SRuslan Bukin static struct ptunit_result ret_ca(void)
37074fe6c29SRuslan Bukin {
37174fe6c29SRuslan Bukin uint8_t insn[] = { 0xca, 0x00, 0x00 };
37274fe6c29SRuslan Bukin
37374fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_RET_CA);
37474fe6c29SRuslan Bukin
37574fe6c29SRuslan Bukin return ptu_passed();
37674fe6c29SRuslan Bukin }
37774fe6c29SRuslan Bukin
vmlaunch(void)37874fe6c29SRuslan Bukin static struct ptunit_result vmlaunch(void)
37974fe6c29SRuslan Bukin {
38074fe6c29SRuslan Bukin uint8_t insn[] = { 0x0f, 0x01, 0xc2 };
38174fe6c29SRuslan Bukin
38274fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_VMLAUNCH);
38374fe6c29SRuslan Bukin
38474fe6c29SRuslan Bukin return ptu_passed();
38574fe6c29SRuslan Bukin }
38674fe6c29SRuslan Bukin
vmresume(void)38774fe6c29SRuslan Bukin static struct ptunit_result vmresume(void)
38874fe6c29SRuslan Bukin {
38974fe6c29SRuslan Bukin uint8_t insn[] = { 0x0f, 0x01, 0xc3 };
39074fe6c29SRuslan Bukin
39174fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_VMRESUME);
39274fe6c29SRuslan Bukin
39374fe6c29SRuslan Bukin return ptu_passed();
39474fe6c29SRuslan Bukin }
39574fe6c29SRuslan Bukin
vmcall(void)39674fe6c29SRuslan Bukin static struct ptunit_result vmcall(void)
39774fe6c29SRuslan Bukin {
39874fe6c29SRuslan Bukin uint8_t insn[] = { 0x0f, 0x01, 0xc1 };
39974fe6c29SRuslan Bukin
40074fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_VMCALL);
40174fe6c29SRuslan Bukin
40274fe6c29SRuslan Bukin return ptu_passed();
40374fe6c29SRuslan Bukin }
40474fe6c29SRuslan Bukin
vmptrld(void)40574fe6c29SRuslan Bukin static struct ptunit_result vmptrld(void)
40674fe6c29SRuslan Bukin {
40774fe6c29SRuslan Bukin uint8_t insn[] = { 0x0f, 0xc7, 0x30 };
40874fe6c29SRuslan Bukin
40974fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_VMPTRLD);
41074fe6c29SRuslan Bukin
41174fe6c29SRuslan Bukin return ptu_passed();
41274fe6c29SRuslan Bukin }
41374fe6c29SRuslan Bukin
jrcxz(void)41474fe6c29SRuslan Bukin static struct ptunit_result jrcxz(void)
41574fe6c29SRuslan Bukin {
41674fe6c29SRuslan Bukin uint8_t insn[] = { 0xe3, 0x00 };
41774fe6c29SRuslan Bukin
41874fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_JrCXZ);
41974fe6c29SRuslan Bukin
42074fe6c29SRuslan Bukin return ptu_passed();
42174fe6c29SRuslan Bukin }
42274fe6c29SRuslan Bukin
mov_eax_moffs64(void)42374fe6c29SRuslan Bukin static struct ptunit_result mov_eax_moffs64(void)
42474fe6c29SRuslan Bukin {
42574fe6c29SRuslan Bukin uint8_t insn[] = { 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42674fe6c29SRuslan Bukin 0x00 };
42774fe6c29SRuslan Bukin
42874fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
42974fe6c29SRuslan Bukin
43074fe6c29SRuslan Bukin return ptu_passed();
43174fe6c29SRuslan Bukin }
43274fe6c29SRuslan Bukin
mov_eax_moffs64_32(void)43374fe6c29SRuslan Bukin static struct ptunit_result mov_eax_moffs64_32(void)
43474fe6c29SRuslan Bukin {
43574fe6c29SRuslan Bukin uint8_t insn[] = { 0x67, 0xa1, 0x00, 0x00, 0x00, 0x00 };
43674fe6c29SRuslan Bukin
43774fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
43874fe6c29SRuslan Bukin
43974fe6c29SRuslan Bukin return ptu_passed();
44074fe6c29SRuslan Bukin }
44174fe6c29SRuslan Bukin
mov_rax_moffs64(void)44274fe6c29SRuslan Bukin static struct ptunit_result mov_rax_moffs64(void)
44374fe6c29SRuslan Bukin {
44474fe6c29SRuslan Bukin uint8_t insn[] = { 0x48, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44574fe6c29SRuslan Bukin 0x00, 0x00 };
44674fe6c29SRuslan Bukin
44774fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
44874fe6c29SRuslan Bukin
44974fe6c29SRuslan Bukin return ptu_passed();
45074fe6c29SRuslan Bukin }
45174fe6c29SRuslan Bukin
mov_rax_moffs64_32(void)45274fe6c29SRuslan Bukin static struct ptunit_result mov_rax_moffs64_32(void)
45374fe6c29SRuslan Bukin {
45474fe6c29SRuslan Bukin uint8_t insn[] = { 0x67, 0x48, 0xa1, 0x00, 0x00, 0x00, 0x00 };
45574fe6c29SRuslan Bukin
45674fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
45774fe6c29SRuslan Bukin
45874fe6c29SRuslan Bukin return ptu_passed();
45974fe6c29SRuslan Bukin }
46074fe6c29SRuslan Bukin
mov_ax_moffs64(void)46174fe6c29SRuslan Bukin static struct ptunit_result mov_ax_moffs64(void)
46274fe6c29SRuslan Bukin {
46374fe6c29SRuslan Bukin uint8_t insn[] = { 0x66, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46474fe6c29SRuslan Bukin 0x00, 0x00 };
46574fe6c29SRuslan Bukin
46674fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
46774fe6c29SRuslan Bukin
46874fe6c29SRuslan Bukin return ptu_passed();
46974fe6c29SRuslan Bukin }
47074fe6c29SRuslan Bukin
mov_ax_moffs64_32(void)47174fe6c29SRuslan Bukin static struct ptunit_result mov_ax_moffs64_32(void)
47274fe6c29SRuslan Bukin {
47374fe6c29SRuslan Bukin uint8_t insn[] = { 0x67, 0x66, 0xa1, 0x00, 0x00, 0x00, 0x00 };
47474fe6c29SRuslan Bukin
47574fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
47674fe6c29SRuslan Bukin
47774fe6c29SRuslan Bukin return ptu_passed();
47874fe6c29SRuslan Bukin }
47974fe6c29SRuslan Bukin
mov_eax_moffs32(void)48074fe6c29SRuslan Bukin static struct ptunit_result mov_eax_moffs32(void)
48174fe6c29SRuslan Bukin {
48274fe6c29SRuslan Bukin uint8_t insn[] = { 0xa1, 0x00, 0x00, 0x00, 0x00 };
48374fe6c29SRuslan Bukin
48474fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_32bit);
48574fe6c29SRuslan Bukin
48674fe6c29SRuslan Bukin return ptu_passed();
48774fe6c29SRuslan Bukin }
48874fe6c29SRuslan Bukin
mov_ax_moffs32(void)48974fe6c29SRuslan Bukin static struct ptunit_result mov_ax_moffs32(void)
49074fe6c29SRuslan Bukin {
49174fe6c29SRuslan Bukin uint8_t insn[] = { 0x66, 0xa1, 0x00, 0x00, 0x00, 0x00 };
49274fe6c29SRuslan Bukin
49374fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_32bit);
49474fe6c29SRuslan Bukin
49574fe6c29SRuslan Bukin return ptu_passed();
49674fe6c29SRuslan Bukin }
49774fe6c29SRuslan Bukin
mov_ax_moffs16(void)49874fe6c29SRuslan Bukin static struct ptunit_result mov_ax_moffs16(void)
49974fe6c29SRuslan Bukin {
50074fe6c29SRuslan Bukin uint8_t insn[] = { 0xa1, 0x00, 0x00 };
50174fe6c29SRuslan Bukin
50274fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_16bit);
50374fe6c29SRuslan Bukin
50474fe6c29SRuslan Bukin return ptu_passed();
50574fe6c29SRuslan Bukin }
50674fe6c29SRuslan Bukin
les(void)50774fe6c29SRuslan Bukin static struct ptunit_result les(void)
50874fe6c29SRuslan Bukin {
50974fe6c29SRuslan Bukin uint8_t insn[] = { 0xc4, 0x00 };
51074fe6c29SRuslan Bukin
51174fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_16bit);
51274fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_32bit);
51374fe6c29SRuslan Bukin
51474fe6c29SRuslan Bukin return ptu_passed();
51574fe6c29SRuslan Bukin }
51674fe6c29SRuslan Bukin
les_disp16(void)51774fe6c29SRuslan Bukin static struct ptunit_result les_disp16(void)
51874fe6c29SRuslan Bukin {
51974fe6c29SRuslan Bukin uint8_t insn[] = { 0xc4, 0x06, 0x00, 0x00 };
52074fe6c29SRuslan Bukin
52174fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_16bit);
52274fe6c29SRuslan Bukin
52374fe6c29SRuslan Bukin return ptu_passed();
52474fe6c29SRuslan Bukin }
52574fe6c29SRuslan Bukin
les_disp32(void)52674fe6c29SRuslan Bukin static struct ptunit_result les_disp32(void)
52774fe6c29SRuslan Bukin {
52874fe6c29SRuslan Bukin uint8_t insn[] = { 0xc4, 0x05, 0x00, 0x00, 0x00, 0x00 };
52974fe6c29SRuslan Bukin
53074fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_32bit);
53174fe6c29SRuslan Bukin
53274fe6c29SRuslan Bukin return ptu_passed();
53374fe6c29SRuslan Bukin }
53474fe6c29SRuslan Bukin
les_ind_disp8(void)53574fe6c29SRuslan Bukin static struct ptunit_result les_ind_disp8(void)
53674fe6c29SRuslan Bukin {
53774fe6c29SRuslan Bukin uint8_t insn[] = { 0xc4, 0x40, 0x00 };
53874fe6c29SRuslan Bukin
53974fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_16bit);
54074fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_32bit);
54174fe6c29SRuslan Bukin
54274fe6c29SRuslan Bukin return ptu_passed();
54374fe6c29SRuslan Bukin }
54474fe6c29SRuslan Bukin
les_ind_disp16(void)54574fe6c29SRuslan Bukin static struct ptunit_result les_ind_disp16(void)
54674fe6c29SRuslan Bukin {
54774fe6c29SRuslan Bukin uint8_t insn[] = { 0xc4, 0x80, 0x00, 0x00 };
54874fe6c29SRuslan Bukin
54974fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_16bit);
55074fe6c29SRuslan Bukin
55174fe6c29SRuslan Bukin return ptu_passed();
55274fe6c29SRuslan Bukin }
55374fe6c29SRuslan Bukin
les_ind_disp32(void)55474fe6c29SRuslan Bukin static struct ptunit_result les_ind_disp32(void)
55574fe6c29SRuslan Bukin {
55674fe6c29SRuslan Bukin uint8_t insn[] = { 0xc4, 0x80, 0x00, 0x00, 0x00, 0x00 };
55774fe6c29SRuslan Bukin
55874fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_32bit);
55974fe6c29SRuslan Bukin
56074fe6c29SRuslan Bukin return ptu_passed();
56174fe6c29SRuslan Bukin }
56274fe6c29SRuslan Bukin
lds(void)56374fe6c29SRuslan Bukin static struct ptunit_result lds(void)
56474fe6c29SRuslan Bukin {
56574fe6c29SRuslan Bukin uint8_t insn[] = { 0xc5, 0x00 };
56674fe6c29SRuslan Bukin
56774fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_16bit);
56874fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_32bit);
56974fe6c29SRuslan Bukin
57074fe6c29SRuslan Bukin return ptu_passed();
57174fe6c29SRuslan Bukin }
57274fe6c29SRuslan Bukin
lds_disp16(void)57374fe6c29SRuslan Bukin static struct ptunit_result lds_disp16(void)
57474fe6c29SRuslan Bukin {
57574fe6c29SRuslan Bukin uint8_t insn[] = { 0xc5, 0x06, 0x00, 0x00 };
57674fe6c29SRuslan Bukin
57774fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_16bit);
57874fe6c29SRuslan Bukin
57974fe6c29SRuslan Bukin return ptu_passed();
58074fe6c29SRuslan Bukin }
58174fe6c29SRuslan Bukin
lds_disp32(void)58274fe6c29SRuslan Bukin static struct ptunit_result lds_disp32(void)
58374fe6c29SRuslan Bukin {
58474fe6c29SRuslan Bukin uint8_t insn[] = { 0xc5, 0x05, 0x00, 0x00, 0x00, 0x00 };
58574fe6c29SRuslan Bukin
58674fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_32bit);
58774fe6c29SRuslan Bukin
58874fe6c29SRuslan Bukin return ptu_passed();
58974fe6c29SRuslan Bukin }
59074fe6c29SRuslan Bukin
lds_ind_disp8(void)59174fe6c29SRuslan Bukin static struct ptunit_result lds_ind_disp8(void)
59274fe6c29SRuslan Bukin {
59374fe6c29SRuslan Bukin uint8_t insn[] = { 0xc5, 0x40, 0x00 };
59474fe6c29SRuslan Bukin
59574fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_16bit);
59674fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_32bit);
59774fe6c29SRuslan Bukin
59874fe6c29SRuslan Bukin return ptu_passed();
59974fe6c29SRuslan Bukin }
60074fe6c29SRuslan Bukin
lds_ind_disp16(void)60174fe6c29SRuslan Bukin static struct ptunit_result lds_ind_disp16(void)
60274fe6c29SRuslan Bukin {
60374fe6c29SRuslan Bukin uint8_t insn[] = { 0xc5, 0x80, 0x00, 0x00 };
60474fe6c29SRuslan Bukin
60574fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_16bit);
60674fe6c29SRuslan Bukin
60774fe6c29SRuslan Bukin return ptu_passed();
60874fe6c29SRuslan Bukin }
60974fe6c29SRuslan Bukin
lds_ind_disp32(void)61074fe6c29SRuslan Bukin static struct ptunit_result lds_ind_disp32(void)
61174fe6c29SRuslan Bukin {
61274fe6c29SRuslan Bukin uint8_t insn[] = { 0xc5, 0x80, 0x00, 0x00, 0x00, 0x00 };
61374fe6c29SRuslan Bukin
61474fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_32bit);
61574fe6c29SRuslan Bukin
61674fe6c29SRuslan Bukin return ptu_passed();
61774fe6c29SRuslan Bukin }
61874fe6c29SRuslan Bukin
vpshufb(void)61974fe6c29SRuslan Bukin static struct ptunit_result vpshufb(void)
62074fe6c29SRuslan Bukin {
62174fe6c29SRuslan Bukin uint8_t insn[] = { 0x62, 0x02, 0x05, 0x00, 0x00, 0x00 };
62274fe6c29SRuslan Bukin
62374fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_64bit);
62474fe6c29SRuslan Bukin
62574fe6c29SRuslan Bukin return ptu_passed();
62674fe6c29SRuslan Bukin }
62774fe6c29SRuslan Bukin
bound(void)62874fe6c29SRuslan Bukin static struct ptunit_result bound(void)
62974fe6c29SRuslan Bukin {
63074fe6c29SRuslan Bukin uint8_t insn[] = { 0x62, 0x02 };
63174fe6c29SRuslan Bukin
63274fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_32bit);
63374fe6c29SRuslan Bukin ptu_decode_s(insn, ptem_16bit);
63474fe6c29SRuslan Bukin
63574fe6c29SRuslan Bukin return ptu_passed();
63674fe6c29SRuslan Bukin }
63774fe6c29SRuslan Bukin
evex_cutoff(void)63874fe6c29SRuslan Bukin static struct ptunit_result evex_cutoff(void)
63974fe6c29SRuslan Bukin {
64074fe6c29SRuslan Bukin uint8_t insn[] = { 0x62 };
64174fe6c29SRuslan Bukin
64274fe6c29SRuslan Bukin ptu_invalid_s(insn, ptem_64bit);
64374fe6c29SRuslan Bukin ptu_invalid_s(insn, ptem_32bit);
64474fe6c29SRuslan Bukin ptu_invalid_s(insn, ptem_16bit);
64574fe6c29SRuslan Bukin
64674fe6c29SRuslan Bukin return ptu_passed();
64774fe6c29SRuslan Bukin }
64874fe6c29SRuslan Bukin
ptwrite_r32(void)64974fe6c29SRuslan Bukin static struct ptunit_result ptwrite_r32(void)
65074fe6c29SRuslan Bukin {
65174fe6c29SRuslan Bukin uint8_t insn[] = { 0xf3, 0x0f, 0xae, 0xe7 };
65274fe6c29SRuslan Bukin
65374fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_PTWRITE);
65474fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_32bit, PTI_INST_PTWRITE);
65574fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_16bit, PTI_INST_PTWRITE);
65674fe6c29SRuslan Bukin
65774fe6c29SRuslan Bukin return ptu_passed();
65874fe6c29SRuslan Bukin }
65974fe6c29SRuslan Bukin
ptwrite_m32(void)66074fe6c29SRuslan Bukin static struct ptunit_result ptwrite_m32(void)
66174fe6c29SRuslan Bukin {
66274fe6c29SRuslan Bukin uint8_t insn[] = { 0xf3, 0x0f, 0xae, 0x67, 0xcc };
66374fe6c29SRuslan Bukin
66474fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_PTWRITE);
66574fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_32bit, PTI_INST_PTWRITE);
66674fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_16bit, PTI_INST_PTWRITE);
66774fe6c29SRuslan Bukin
66874fe6c29SRuslan Bukin return ptu_passed();
66974fe6c29SRuslan Bukin }
67074fe6c29SRuslan Bukin
ptwrite_r64(void)67174fe6c29SRuslan Bukin static struct ptunit_result ptwrite_r64(void)
67274fe6c29SRuslan Bukin {
67374fe6c29SRuslan Bukin uint8_t insn[] = { 0xf3, 0x48, 0x0f, 0xae, 0xe7 };
67474fe6c29SRuslan Bukin
67574fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_PTWRITE);
67674fe6c29SRuslan Bukin
67774fe6c29SRuslan Bukin return ptu_passed();
67874fe6c29SRuslan Bukin }
67974fe6c29SRuslan Bukin
ptwrite_m64(void)68074fe6c29SRuslan Bukin static struct ptunit_result ptwrite_m64(void)
68174fe6c29SRuslan Bukin {
68274fe6c29SRuslan Bukin uint8_t insn[] = { 0xf3, 0x48, 0x0f, 0xae, 0x67, 0xcc };
68374fe6c29SRuslan Bukin
68474fe6c29SRuslan Bukin ptu_classify_s(insn, ptem_64bit, PTI_INST_PTWRITE);
68574fe6c29SRuslan Bukin
68674fe6c29SRuslan Bukin return ptu_passed();
68774fe6c29SRuslan Bukin }
68874fe6c29SRuslan Bukin
main(int argc,char ** argv)68974fe6c29SRuslan Bukin int main(int argc, char **argv)
69074fe6c29SRuslan Bukin {
69174fe6c29SRuslan Bukin struct ptunit_suite suite;
69274fe6c29SRuslan Bukin
69374fe6c29SRuslan Bukin suite = ptunit_mk_suite(argc, argv);
69474fe6c29SRuslan Bukin
69574fe6c29SRuslan Bukin ptu_run(suite, push);
69674fe6c29SRuslan Bukin ptu_run(suite, jmp_rel);
69774fe6c29SRuslan Bukin ptu_run(suite, long_nop);
69874fe6c29SRuslan Bukin ptu_run(suite, mov_al_64);
69974fe6c29SRuslan Bukin ptu_run(suite, mov_al_32);
70074fe6c29SRuslan Bukin ptu_run(suite, mov_al_32_em64);
70174fe6c29SRuslan Bukin ptu_run(suite, mov_al_32_em16);
70274fe6c29SRuslan Bukin ptu_run(suite, mov_al_16_em32);
70374fe6c29SRuslan Bukin ptu_run(suite, mov_al_16);
70474fe6c29SRuslan Bukin ptu_run(suite, rdtsc);
70574fe6c29SRuslan Bukin ptu_run(suite, pcmpistri);
70674fe6c29SRuslan Bukin ptu_run(suite, vmovdqa);
70774fe6c29SRuslan Bukin ptu_run(suite, vpandn);
70874fe6c29SRuslan Bukin ptu_run(suite, syscall);
70974fe6c29SRuslan Bukin ptu_run(suite, sysret);
71074fe6c29SRuslan Bukin ptu_run(suite, sysenter);
71174fe6c29SRuslan Bukin ptu_run(suite, sysexit);
71274fe6c29SRuslan Bukin ptu_run(suite, int3);
71374fe6c29SRuslan Bukin ptu_run(suite, intn);
71474fe6c29SRuslan Bukin ptu_run(suite, iret);
71574fe6c29SRuslan Bukin ptu_run(suite, call_9a_cd);
71674fe6c29SRuslan Bukin ptu_run(suite, call_9a_cp);
71774fe6c29SRuslan Bukin ptu_run(suite, call_ff_3);
71874fe6c29SRuslan Bukin ptu_run(suite, jmp_ff_5);
71974fe6c29SRuslan Bukin ptu_run(suite, jmp_ea_cd);
72074fe6c29SRuslan Bukin ptu_run(suite, jmp_ea_cp);
72174fe6c29SRuslan Bukin ptu_run(suite, ret_ca);
72274fe6c29SRuslan Bukin ptu_run(suite, vmlaunch);
72374fe6c29SRuslan Bukin ptu_run(suite, vmresume);
72474fe6c29SRuslan Bukin ptu_run(suite, vmcall);
72574fe6c29SRuslan Bukin ptu_run(suite, vmptrld);
72674fe6c29SRuslan Bukin ptu_run(suite, jrcxz);
72774fe6c29SRuslan Bukin ptu_run(suite, mov_eax_moffs64);
72874fe6c29SRuslan Bukin ptu_run(suite, mov_eax_moffs64_32);
72974fe6c29SRuslan Bukin ptu_run(suite, mov_rax_moffs64);
73074fe6c29SRuslan Bukin ptu_run(suite, mov_rax_moffs64_32);
73174fe6c29SRuslan Bukin ptu_run(suite, mov_ax_moffs64);
73274fe6c29SRuslan Bukin ptu_run(suite, mov_ax_moffs64_32);
73374fe6c29SRuslan Bukin ptu_run(suite, mov_eax_moffs32);
73474fe6c29SRuslan Bukin ptu_run(suite, mov_ax_moffs32);
73574fe6c29SRuslan Bukin ptu_run(suite, mov_ax_moffs16);
73674fe6c29SRuslan Bukin ptu_run(suite, les);
73774fe6c29SRuslan Bukin ptu_run(suite, les_disp16);
73874fe6c29SRuslan Bukin ptu_run(suite, les_disp32);
73974fe6c29SRuslan Bukin ptu_run(suite, les_ind_disp8);
74074fe6c29SRuslan Bukin ptu_run(suite, les_ind_disp16);
74174fe6c29SRuslan Bukin ptu_run(suite, les_ind_disp32);
74274fe6c29SRuslan Bukin ptu_run(suite, lds);
74374fe6c29SRuslan Bukin ptu_run(suite, lds_disp16);
74474fe6c29SRuslan Bukin ptu_run(suite, lds_disp32);
74574fe6c29SRuslan Bukin ptu_run(suite, lds_ind_disp8);
74674fe6c29SRuslan Bukin ptu_run(suite, lds_ind_disp16);
74774fe6c29SRuslan Bukin ptu_run(suite, lds_ind_disp32);
74874fe6c29SRuslan Bukin ptu_run(suite, vpshufb);
74974fe6c29SRuslan Bukin ptu_run(suite, bound);
75074fe6c29SRuslan Bukin ptu_run(suite, evex_cutoff);
75174fe6c29SRuslan Bukin ptu_run(suite, ptwrite_r32);
75274fe6c29SRuslan Bukin ptu_run(suite, ptwrite_m32);
75374fe6c29SRuslan Bukin ptu_run(suite, ptwrite_r64);
75474fe6c29SRuslan Bukin ptu_run(suite, ptwrite_m64);
75574fe6c29SRuslan Bukin
75674fe6c29SRuslan Bukin return ptunit_report(&suite);
75774fe6c29SRuslan Bukin }
758