Fixed NT ifdef
[dyninst.git] / dyninstAPI / src / arch-ia32.h
1 // $Id: arch-ia32.h,v 1.3 2002/06/10 20:01:31 gaburici Exp $
2 // VG(02/06/2002): configurable IA-32 decoder
3
4 #if !(defined(i386_unknown_linux2_0) || defined(i386_unknown_nt4_0))
5 #error "invalid architecture-os inclusion"
6 #endif
7
8 #ifndef _ARCH_IA32_H
9 #define _ARCH_IA32_H
10
11 #include <stdlib.h>
12 #include "arch-x86.h"
13
14
15 #define PREFIX_LOCK   0xF0
16 #define PREFIX_REPNZ  0xF2
17 #define PREFIX_REP    0xF3
18
19 #define PREFIX_SEGCS  0x2E
20 #define PREFIX_SEGSS  0x36
21 #define PREFIX_SEGDS  0x3E
22 #define PREFIX_SEGES  0x26
23 #define PREFIX_SEGFS  0x64
24 #define PREFIX_SEGGS  0x65
25
26 #define PREFIX_BRANCH0 0x2E
27 #define PREFIX_BRANCH1 0x3E
28
29 #define PREFIX_SZOPER  0x66
30 #define PREFIX_SZADDR  0x67
31
32
33 class ia32_prefixes
34 {
35   friend ia32_prefixes& ia32_decode_prefixes(const unsigned char* addr, ia32_prefixes&);
36  private:
37   unsigned int count;
38   // At most 4 prefixes are allowed for Intel 32-bit CPUs
39   // There also 4 groups, so this array is 0 if no prefix
40   // from that group is present, otherwise it contains the
41   // prefix opcode
42   unsigned char prfx[4];
43  public:
44   unsigned int const getCount() const { return count; }
45   unsigned char getPrefix(unsigned char group) const { return prfx[group]; }
46 };
47
48
49 ia32_prefixes& ia32_decode_prefixes(const unsigned char* addr, ia32_prefixes&);
50
51
52 class ia32_entry;
53
54 class ia32_instruction {
55   friend unsigned int ia32_decode_operands (const ia32_prefixes& pref, const ia32_entry& gotit, 
56                                             const char* addr, ia32_instruction& instruct);
57   template <unsigned int capa>
58     friend ia32_instruction& ia32_decode(const unsigned char* addr, ia32_instruction& instruct);
59   friend unsigned int ia32_decode_operands (const ia32_prefixes& pref, const ia32_entry& gotit, 
60                                      const unsigned char* addr, ia32_instruction& instruct);
61   friend ia32_instruction& ia32_decode_FP(const ia32_prefixes& pref, const unsigned char* addr,
62                                           ia32_instruction& instruct);
63   friend unsigned int ia32_emulate_old_type(ia32_instruction& instruct);
64   unsigned int size;
65   ia32_prefixes prf;
66   unsigned int legacy_type;
67
68  public:
69   unsigned int getSize() const { return size; }
70   unsigned int getLegacyType() const { return legacy_type; }
71
72 };
73
74 // VG(02/07/2002): Information that the decoder can return is
75 //   #defined below. The decoder always returns the size of the 
76 //   instruction because that has to be determined anyway.
77 //   Please don't add things that should be external to the
78 //   decoder, e.g.: how may bytes a relocated instruction needs
79 //   IMHO that stuff should go into inst-x86...
80
81 #define IA32_DECODE_PREFIXES    (1<<0)
82 #define IA32_DECODE_MNEMONICS   (1<<1)
83 #define IA32_DECODE_OPERANDS    (1<<2)
84 #define IA32_DECODE_JMPS        (1<<3)
85 #define IA32_DECODE_MOVS        (1<<4)
86 #define IA32_DECODE_CONDITIONS  (1<<5)
87
88 #define IA32_FULL_DECODER 0xffffffffffffffffu
89 #define IA32_SIZE_DECODER 0
90
91 template <unsigned int capabilities>
92 ia32_instruction& ia32_decode(const unsigned char* addr, ia32_instruction&);
93
94 // If typing the template every time is a pain, the following should help:
95 #define ia32_decode_all  ia32_decode<IA32_FULL_DECODER>
96 #define ia32_decode_size ia32_decode<IA32_SIZE_DECODER>
97 #define ia32_size(a,i)   ia32_decode_size((a),(i)).size
98
99 #endif