Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


integrated decoder
[palacios.git] / palacios / src / palacios / vmm_xed.c
1 #include <palacios/vmm_decoder.h>
2 #include <palacios/vmm_xed.h>
3 #include <xed/xed-interface.h>
4 #include <palacios/vm_guest.h>
5
6 static xed_state_t decoder_state;
7
8
9 static int set_decoder_mode(struct guest_info * info, xed_state_t * state) {
10   switch (info->cpu_mode) {
11   case REAL:
12     if (state->mmode != XED_MACHINE_MODE_LEGACY_16) {
13       xed_state_init(state,
14                      XED_MACHINE_MODE_LEGACY_16, 
15                      XED_ADDRESS_WIDTH_16b, 
16                      XED_ADDRESS_WIDTH_16b); 
17     }
18    break;
19   case PROTECTED:
20   case PROTECTED_PAE:
21     if (state->mmode != XED_MACHINE_MODE_LEGACY_32) {
22       xed_state_init(state,
23                      XED_MACHINE_MODE_LEGACY_32, 
24                      XED_ADDRESS_WIDTH_32b, 
25                      XED_ADDRESS_WIDTH_32b);
26     }
27     break;
28   case LONG:
29     if (state->mmode != XED_MACHINE_MODE_LONG_64) {    
30       state->mmode = XED_MACHINE_MODE_LONG_64;
31     }
32     break;
33   default:
34     return -1;
35   }
36   return 0;
37 }
38
39
40 int init_decoder() {
41   xed_tables_init();
42   xed_state_zero(&decoder_state);
43   return 0;
44 }
45
46
47 int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * instr) {
48   xed_decoded_inst_t xed_instr;
49   xed_error_enum_t xed_error;
50
51   if (set_decoder_mode(info, &decoder_state) == -1) {
52     PrintError("Could not set decoder mode\n");
53     return -1;
54   }
55   
56   xed_decoded_inst_zero_set_mode(&xed_instr, &decoder_state);
57
58   xed_error = xed_decode(&xed_instr, 
59                          REINTERPRET_CAST(const xed_uint8_t *, instr_ptr), 
60                          XED_MAX_INSTRUCTION_BYTES);
61   
62
63   if (xed_error != XED_ERROR_NONE) {
64     PrintError("Xed error: %s\n", xed_error_enum_t2str(xed_error));
65     return -1;
66   }
67   
68   instr->instr_length = xed_decoded_inst_get_length (&xed_instr);
69   
70   
71   PrintDebug("category: %s\n", xed_category_enum_t2str(xed_decoded_inst_get_category(&xed_instr)));;
72   PrintDebug("ISA-extension:%s\n ",xed_extension_enum_t2str(xed_decoded_inst_get_extension(&xed_instr)));
73   PrintDebug(" instruction-length: %d\n ", xed_decoded_inst_get_length(&xed_instr));
74   PrintDebug(" operand-size:%d\n ", xed_operand_values_get_effective_operand_width(xed_decoded_inst_operands_const(&xed_instr)));   
75   PrintDebug("address-size:%d\n ", xed_operand_values_get_effective_address_width(xed_decoded_inst_operands_const(&xed_instr))); 
76   PrintDebug("iform-enum-name:%s\n ",xed_iform_enum_t2str(xed_decoded_inst_get_iform_enum(&xed_instr)));
77   PrintDebug("iform-enum-name-dispatch (zero based):%d\n ", xed_decoded_inst_get_iform_enum_dispatch(&xed_instr));
78   PrintDebug("iclass-max-iform-dispatch: %d\n ", xed_iform_max_per_iclass(xed_decoded_inst_get_iclass(&xed_instr)));
79   
80   // operands
81   // print_operands(&xed_instr);
82   
83   // memops
84   // print_memops(&xed_instr);
85   
86   // flags
87   //print_flags(&xed_instr);
88   
89   // attributes
90   //print_attributes(&xed_instr);*/
91
92
93
94     return -1;
95 }
96
97
98 int v3_encode(struct guest_info * info, struct x86_instr * instr, char * instr_buf) {
99
100   return -1;
101 }
102
103
104
105
106 /*
107
108     xed_state_t dstate;
109     xed_decoded_inst_t xedd;
110     xed_uint_t i, length;
111     xed_uint8_t itext[100] = {0x01,0x00,0x00,0x00,0x12,0x00,0x55,0x48,0x89,0xe5,0x48,0x89,0x7d,0xf8,0x89,0x75,0xf4,0x89,0x55,0xf0,0x89,0x4d,0xec,0x48,0x8b,0x55,0xf8,0x8b,0x45,0xf4,0x89,0x02,0x48,0x8b,0x55,0xf8,0x8b,0x45,0xf0,0x89,0x42,0x04,0x48,0x8b,0x55,0xf8,0x8b,0x45,0xec,0x89,0x42,0x08,0xc9,0xc3,0x55,0x48,0x89,0xe5,0x48,0x89,0x7d,0xf8,0x48,0x8b,0x45,0xf8,0x8b,0x40,0x08,0xc9,0xc3,0x90,0x0};
112     xed_bool_t long_mode = true;
113     unsigned int first_argv;
114     int num;
115         
116
117     for (i=0, num=1; i<100; i += length, num++){
118             xed_tables_init();
119             xed_state_zero(&dstate);
120             //if (argc > 2 && strcmp(argv[1], "-64") == 0) 
121             long_mode = true;
122
123             if (long_mode)  {
124                 first_argv = 2;
125                 dstate.mmode=XED_MACHINE_MODE_LONG_64;
126             }
127             else {
128                 first_argv=1;
129                 xed_state_init(&dstate,
130                                XED_MACHINE_MODE_LEGACY_32, 
131                                XED_ADDRESS_WIDTH_32b, 
132                                XED_ADDRESS_WIDTH_32b);
133             }
134
135             xed_decoded_inst_zero_set_mode(&xedd, &dstate);
136             xed_error_enum_t xed_error = xed_decode(&xedd, 
137                                                     REINTERPRET_CAST(const xed_uint8_t*,&itext[i]), 
138                                                     XED_MAX_INSTRUCTION_BYTES);
139             switch(xed_error)    {
140               case XED_ERROR_NONE:
141                 break;
142               case XED_ERROR_BUFFER_TOO_SHORT:
143                 PrintDebug("Not enough bytes provided\n");
144                 return 1;
145               case XED_ERROR_GENERAL_ERROR:
146                 PrintDebug("Could not decode given input.\n");
147                 return 1;
148               default:
149                 PrintDebug("Unhandled error code \n");
150                 return 1;;
151             }
152
153             length = xed_decoded_inst_get_length (&xedd);
154
155             PrintDebug("\nThe %dth instruction:", num);
156
157             PrintDebug("\ncategory: ");
158             PrintDebug(" %s\n", xed_category_enum_t2str(xed_decoded_inst_get_category(&xedd)));;
159             PrintDebug("ISA-extension:%s\n ",xed_extension_enum_t2str(xed_decoded_inst_get_extension(&xedd)));
160             PrintDebug(" instruction-length: %d\n ", xed_decoded_inst_get_length(&xedd));
161             PrintDebug(" operand-size:%d\n ", xed_operand_values_get_effective_operand_width(xed_decoded_inst_operands_const(&xedd)));   
162             PrintDebug("address-size:%d\n ", xed_operand_values_get_effective_address_width(xed_decoded_inst_operands_const(&xedd))); 
163             PrintDebug("iform-enum-name:%s\n ",xed_iform_enum_t2str(xed_decoded_inst_get_iform_enum(&xedd)));
164             PrintDebug("iform-enum-name-dispatch (zero based):%d\n ", xed_decoded_inst_get_iform_enum_dispatch(&xedd));
165             PrintDebug("iclass-max-iform-dispatch: %d\n ", xed_iform_max_per_iclass(xed_decoded_inst_get_iclass(&xedd)));
166
167             // operands
168             // print_operands(&xedd);
169             
170             // memops
171             // print_memops(&xedd);
172             
173             // flags
174             //print_flags(&xedd);
175
176             // attributes
177             //print_attributes(&xedd);
178     }
179
180
181
182 */