1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/sandbox/win/src/sidestep/ia32_modrm_map.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,92 @@ 1.4 +// Copyright (c) 2012 The Chromium Authors. All rights reserved. 1.5 +// Use of this source code is governed by a BSD-style license that can be 1.6 +// found in the LICENSE file. 1.7 + 1.8 +// Table of relevant information about how to decode the ModR/M byte. 1.9 +// Based on information in the IA-32 Intel Architecture 1.10 +// Software Developer's Manual Volume 2: Instruction Set Reference. 1.11 + 1.12 +#include "sandbox/win/src/sidestep/mini_disassembler.h" 1.13 +#include "sandbox/win/src/sidestep/mini_disassembler_types.h" 1.14 + 1.15 +namespace sidestep { 1.16 + 1.17 +const ModrmEntry MiniDisassembler::s_ia16_modrm_map_[] = { 1.18 +// mod == 00 1.19 + /* r/m == 000 */ { false, false, OS_ZERO }, 1.20 + /* r/m == 001 */ { false, false, OS_ZERO }, 1.21 + /* r/m == 010 */ { false, false, OS_ZERO }, 1.22 + /* r/m == 011 */ { false, false, OS_ZERO }, 1.23 + /* r/m == 100 */ { false, false, OS_ZERO }, 1.24 + /* r/m == 101 */ { false, false, OS_ZERO }, 1.25 + /* r/m == 110 */ { true, false, OS_WORD }, 1.26 + /* r/m == 111 */ { false, false, OS_ZERO }, 1.27 +// mod == 01 1.28 + /* r/m == 000 */ { true, false, OS_BYTE }, 1.29 + /* r/m == 001 */ { true, false, OS_BYTE }, 1.30 + /* r/m == 010 */ { true, false, OS_BYTE }, 1.31 + /* r/m == 011 */ { true, false, OS_BYTE }, 1.32 + /* r/m == 100 */ { true, false, OS_BYTE }, 1.33 + /* r/m == 101 */ { true, false, OS_BYTE }, 1.34 + /* r/m == 110 */ { true, false, OS_BYTE }, 1.35 + /* r/m == 111 */ { true, false, OS_BYTE }, 1.36 +// mod == 10 1.37 + /* r/m == 000 */ { true, false, OS_WORD }, 1.38 + /* r/m == 001 */ { true, false, OS_WORD }, 1.39 + /* r/m == 010 */ { true, false, OS_WORD }, 1.40 + /* r/m == 011 */ { true, false, OS_WORD }, 1.41 + /* r/m == 100 */ { true, false, OS_WORD }, 1.42 + /* r/m == 101 */ { true, false, OS_WORD }, 1.43 + /* r/m == 110 */ { true, false, OS_WORD }, 1.44 + /* r/m == 111 */ { true, false, OS_WORD }, 1.45 +// mod == 11 1.46 + /* r/m == 000 */ { false, false, OS_ZERO }, 1.47 + /* r/m == 001 */ { false, false, OS_ZERO }, 1.48 + /* r/m == 010 */ { false, false, OS_ZERO }, 1.49 + /* r/m == 011 */ { false, false, OS_ZERO }, 1.50 + /* r/m == 100 */ { false, false, OS_ZERO }, 1.51 + /* r/m == 101 */ { false, false, OS_ZERO }, 1.52 + /* r/m == 110 */ { false, false, OS_ZERO }, 1.53 + /* r/m == 111 */ { false, false, OS_ZERO } 1.54 +}; 1.55 + 1.56 +const ModrmEntry MiniDisassembler::s_ia32_modrm_map_[] = { 1.57 +// mod == 00 1.58 + /* r/m == 000 */ { false, false, OS_ZERO }, 1.59 + /* r/m == 001 */ { false, false, OS_ZERO }, 1.60 + /* r/m == 010 */ { false, false, OS_ZERO }, 1.61 + /* r/m == 011 */ { false, false, OS_ZERO }, 1.62 + /* r/m == 100 */ { false, true, OS_ZERO }, 1.63 + /* r/m == 101 */ { true, false, OS_DOUBLE_WORD }, 1.64 + /* r/m == 110 */ { false, false, OS_ZERO }, 1.65 + /* r/m == 111 */ { false, false, OS_ZERO }, 1.66 +// mod == 01 1.67 + /* r/m == 000 */ { true, false, OS_BYTE }, 1.68 + /* r/m == 001 */ { true, false, OS_BYTE }, 1.69 + /* r/m == 010 */ { true, false, OS_BYTE }, 1.70 + /* r/m == 011 */ { true, false, OS_BYTE }, 1.71 + /* r/m == 100 */ { true, true, OS_BYTE }, 1.72 + /* r/m == 101 */ { true, false, OS_BYTE }, 1.73 + /* r/m == 110 */ { true, false, OS_BYTE }, 1.74 + /* r/m == 111 */ { true, false, OS_BYTE }, 1.75 +// mod == 10 1.76 + /* r/m == 000 */ { true, false, OS_DOUBLE_WORD }, 1.77 + /* r/m == 001 */ { true, false, OS_DOUBLE_WORD }, 1.78 + /* r/m == 010 */ { true, false, OS_DOUBLE_WORD }, 1.79 + /* r/m == 011 */ { true, false, OS_DOUBLE_WORD }, 1.80 + /* r/m == 100 */ { true, true, OS_DOUBLE_WORD }, 1.81 + /* r/m == 101 */ { true, false, OS_DOUBLE_WORD }, 1.82 + /* r/m == 110 */ { true, false, OS_DOUBLE_WORD }, 1.83 + /* r/m == 111 */ { true, false, OS_DOUBLE_WORD }, 1.84 +// mod == 11 1.85 + /* r/m == 000 */ { false, false, OS_ZERO }, 1.86 + /* r/m == 001 */ { false, false, OS_ZERO }, 1.87 + /* r/m == 010 */ { false, false, OS_ZERO }, 1.88 + /* r/m == 011 */ { false, false, OS_ZERO }, 1.89 + /* r/m == 100 */ { false, false, OS_ZERO }, 1.90 + /* r/m == 101 */ { false, false, OS_ZERO }, 1.91 + /* r/m == 110 */ { false, false, OS_ZERO }, 1.92 + /* r/m == 111 */ { false, false, OS_ZERO }, 1.93 +}; 1.94 + 1.95 +}; // namespace sidestep