17e6b385e67fed7cb0ea774b386064898784c9194thestig@chromium.org// Copyright (c) 2010, Google Inc.
22b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// All rights reserved.
32b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org//
42b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// Redistribution and use in source and binary forms, with or without
52b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// modification, are permitted provided that the following conditions are
62b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// met:
72b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org//
82b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org//     * Redistributions of source code must retain the above copyright
92b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// notice, this list of conditions and the following disclaimer.
102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org//     * Redistributions in binary form must reproduce the above
112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// copyright notice, this list of conditions and the following disclaimer
122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// in the documentation and/or other materials provided with the
132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// distribution.
142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org//     * Neither the name of Google Inc. nor the names of its
152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// contributors may be used to endorse or promote products derived from
162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// this software without specific prior written permission.
172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org//
182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
287e6b385e67fed7cb0ea774b386064898784c9194thestig@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#include <unistd.h>
312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#include "breakpad_googletest_includes.h"
332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#include "processor/disassembler_x86.h"
342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#include "third_party/libdisasm/libdis.h"
352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgnamespace {
372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgusing google_breakpad::DisassemblerX86;
392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgunsigned char just_return[] = "\xc3";  // retn
412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgunsigned char invalid_instruction[] = "\x00";  // invalid
432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgunsigned char read_eax_jmp_eax[] =
452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x8b\x18"                  // mov ebx, [eax];
462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x33\xc9"                  // xor ebx, ebx;
472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\xff\x20"                  // jmp eax;
482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\xc3";                     // retn;
492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgunsigned char write_eax_arg_to_call[] =
512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x89\xa8\x00\x02\x00\x00"  // mov [eax+200], ebp;
522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\xc1\xeb\x02"              // shr ebx, 2;
532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x50"                      // push eax;
542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\xe8\xd1\x24\x77\x88"      // call something;
552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\xc3";                     // retn;
562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgunsigned char read_edi_stosb[] =
582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x8b\x07"                  // mov eax, [edi];
592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x8b\xc8"                  // mov ecx, eax;
602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\xf3\xaa"                  // rep stosb;
612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\xc3";                     // retn;
622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgunsigned char read_clobber_write[] =
642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x03\x18"                  // add ebx, [eax];
652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x8b\xc1"                  // mov eax, ecx;
662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x89\x10"                  // mov [eax], edx;
672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\xc3";                     // retn;
682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgunsigned char read_xchg_write[] =
702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x03\x18"                  // add ebx, [eax];
712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x91"                      // xchg eax, ecx;
722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x89\x18"                  // mov [eax], ebx;
732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x89\x11"                  // mov [ecx], edx;
742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\xc3";                     // retn;
752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgunsigned char read_cmp[] =
772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x03\x18"                  // add ebx, [eax];
782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x83\xf8\x00"              // cmp eax, 0;
792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\x74\x04"                  // je +4;
802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org    "\xc3";                     // retn;
812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgTEST(DisassemblerX86Test, SimpleReturnInstruction) {
832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  DisassemblerX86 dis(just_return, sizeof(just_return)-1, 0);
842971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(1U, dis.NextInstruction());
8564708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
862971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
8764708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.endOfBlock());
882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup());
89ed1c70b5b8b04911a1c357b0f49a51ff65c7d30eted.mielczarek  const libdis::x86_insn_t* instruction = dis.currentInstruction();
90ed1c70b5b8b04911a1c357b0f49a51ff65c7d30eted.mielczarek  EXPECT_EQ(libdis::insn_controlflow, instruction->group);
91ed1c70b5b8b04911a1c357b0f49a51ff65c7d30eted.mielczarek  EXPECT_EQ(libdis::insn_return, instruction->type);
922971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.NextInstruction());
9364708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.currentInstructionValid());
94ed1c70b5b8b04911a1c357b0f49a51ff65c7d30eted.mielczarek  EXPECT_EQ(NULL, dis.currentInstruction());
952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgTEST(DisassemblerX86Test, SimpleInvalidInstruction) {
982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  DisassemblerX86 dis(invalid_instruction, sizeof(invalid_instruction)-1, 0);
992971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.NextInstruction());
10064708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.currentInstructionValid());
1012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
1022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgTEST(DisassemblerX86Test, BadReadLeadsToBranch) {
1042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  DisassemblerX86 dis(read_eax_jmp_eax, sizeof(read_eax_jmp_eax)-1, 0);
1052971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
10664708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1072971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
10864708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());
11064708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.setBadRead());
1112971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
11264708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1132971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
11464708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_logic, dis.currentInstructionGroup());
1162971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
11764708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(google_breakpad::DISX86_BAD_BRANCH_TARGET, dis.flags());
11964708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup());
1212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
1222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgTEST(DisassemblerX86Test, BadWriteLeadsToPushedArg) {
1242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  DisassemblerX86 dis(write_eax_arg_to_call,
1252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org                      sizeof(write_eax_arg_to_call)-1, 0);
1262971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(6U, dis.NextInstruction());
12764708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1282971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
12964708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());
13164708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.setBadWrite());
1322971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(3U, dis.NextInstruction());
13364708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1342971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
13564708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup());
1372971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(1U, dis.NextInstruction());
13864708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1392971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
14064708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1412971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(5U, dis.NextInstruction());
14264708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(google_breakpad::DISX86_BAD_ARGUMENT_PASSED, dis.flags());
1442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup());
14564708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
1472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgTEST(DisassemblerX86Test, BadReadLeadsToBlockWrite) {
1502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  DisassemblerX86 dis(read_edi_stosb, sizeof(read_edi_stosb)-1, 0);
1512971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
15264708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1532971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
15464708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());
15664708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.setBadRead());
1572971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
15864708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1592971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
16064708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());
1622971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
16364708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(google_breakpad::DISX86_BAD_BLOCK_WRITE, dis.flags());
16564708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_string, dis.currentInstructionGroup());
1672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
1682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgTEST(DisassemblerX86Test, BadReadClobberThenWrite) {
1702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  DisassemblerX86 dis(read_clobber_write, sizeof(read_clobber_write)-1, 0);
1712971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
17264708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1732971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
17464708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup());
17664708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.setBadRead());
1772971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
17864708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1792971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
18064708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());
1822971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
18364708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1842971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
18564708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());
1872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
1882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
1892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgTEST(DisassemblerX86Test, BadReadXCHGThenWrite) {
1902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  DisassemblerX86 dis(read_xchg_write, sizeof(read_xchg_write)-1, 0);
1912971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
19264708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1932971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
19464708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
1952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup());
19664708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.setBadRead());
1972971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(1U, dis.NextInstruction());
19864708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
1992971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
20064708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
2012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());
2022971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
20364708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
2042971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
20564708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
2062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());
2072971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
20864708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
2092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(google_breakpad::DISX86_BAD_WRITE, dis.flags());
21064708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
2112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());
2122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
2132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org
2142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgTEST(DisassemblerX86Test, BadReadThenCMP) {
2152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  DisassemblerX86 dis(read_cmp, sizeof(read_cmp)-1, 0);
2162971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
21764708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
2182971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, dis.flags());
21964708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
2202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup());
22164708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.setBadRead());
2222971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(3U, dis.NextInstruction());
22364708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
2242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(google_breakpad::DISX86_BAD_COMPARISON, dis.flags());
22564708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
2262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_comparison, dis.currentInstructionGroup());
2272971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(2U, dis.NextInstruction());
22864708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_TRUE(dis.currentInstructionValid());
2292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(google_breakpad::DISX86_BAD_COMPARISON, dis.flags());
23064708c560135ef71759dd1c41a99b29b324a6e03thestig@chromium.org  EXPECT_FALSE(dis.endOfBlock());
2312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org  EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup());
2322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
2332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}
234