1 #include <palacios/vmm_decoder.h>
2 #include <palacios/vmm_xed.h>
3 #include <xed/xed-interface.h>
4 #include <palacios/vm_guest.h>
6 static xed_state_t decoder_state;
9 static int set_decoder_mode(struct guest_info * info, xed_state_t * state) {
10 switch (info->cpu_mode) {
12 if (state->mmode != XED_MACHINE_MODE_LEGACY_16) {
14 XED_MACHINE_MODE_LEGACY_16,
15 XED_ADDRESS_WIDTH_16b,
16 XED_ADDRESS_WIDTH_16b);
21 if (state->mmode != XED_MACHINE_MODE_LEGACY_32) {
23 XED_MACHINE_MODE_LEGACY_32,
24 XED_ADDRESS_WIDTH_32b,
25 XED_ADDRESS_WIDTH_32b);
29 if (state->mmode != XED_MACHINE_MODE_LONG_64) {
30 state->mmode = XED_MACHINE_MODE_LONG_64;
42 xed_state_zero(&decoder_state);
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;
51 if (set_decoder_mode(info, &decoder_state) == -1) {
52 PrintError("Could not set decoder mode\n");
56 xed_decoded_inst_zero_set_mode(&xed_instr, &decoder_state);
58 xed_error = xed_decode(&xed_instr,
59 REINTERPRET_CAST(const xed_uint8_t *, instr_ptr),
60 XED_MAX_INSTRUCTION_BYTES);
63 if (xed_error != XED_ERROR_NONE) {
64 PrintError("Xed error: %s\n", xed_error_enum_t2str(xed_error));
68 instr->instr_length = xed_decoded_inst_get_length (&xed_instr);
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)));
81 // print_operands(&xed_instr);
84 // print_memops(&xed_instr);
87 //print_flags(&xed_instr);
90 //print_attributes(&xed_instr);*/
98 int v3_encode(struct guest_info * info, struct x86_instr * instr, char * instr_buf) {
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;
117 for (i=0, num=1; i<100; i += length, num++){
119 xed_state_zero(&dstate);
120 //if (argc > 2 && strcmp(argv[1], "-64") == 0)
125 dstate.mmode=XED_MACHINE_MODE_LONG_64;
129 xed_state_init(&dstate,
130 XED_MACHINE_MODE_LEGACY_32,
131 XED_ADDRESS_WIDTH_32b,
132 XED_ADDRESS_WIDTH_32b);
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);
142 case XED_ERROR_BUFFER_TOO_SHORT:
143 PrintDebug("Not enough bytes provided\n");
145 case XED_ERROR_GENERAL_ERROR:
146 PrintDebug("Could not decode given input.\n");
149 PrintDebug("Unhandled error code \n");
153 length = xed_decoded_inst_get_length (&xedd);
155 PrintDebug("\nThe %dth instruction:", num);
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)));
168 // print_operands(&xedd);
171 // print_memops(&xedd);
174 //print_flags(&xedd);
177 //print_attributes(&xedd);