X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=misc%2Fdecoder_test%2FXED2%2Fexamples%2Fxed-ex1.cpp;fp=misc%2Fdecoder_test%2FXED2%2Fexamples%2Fxed-ex1.cpp;h=b9e22f1375575e5a56fe5a4773df433077e7452e;hp=0000000000000000000000000000000000000000;hb=ddc16b0737cf58f7aa90a69c6652cdf4090aec51;hpb=626595465a2c6987606a6bc697df65130ad8c2d3 diff --git a/misc/decoder_test/XED2/examples/xed-ex1.cpp b/misc/decoder_test/XED2/examples/xed-ex1.cpp new file mode 100644 index 0000000..b9e22f1 --- /dev/null +++ b/misc/decoder_test/XED2/examples/xed-ex1.cpp @@ -0,0 +1,318 @@ +/*BEGIN_LEGAL +Intel Open Source License + +Copyright (c) 2002-2007 Intel Corporation +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. Redistributions +in binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. Neither the name of +the Intel Corporation nor the names of its contributors may be used to +endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +END_LEGAL */ +/// @file xed-ex1.cpp +/// @author Mark Charney + +extern "C" { +#include "xed-interface.h" +} +#include "xed-examples-ostreams.H" +#include +#include +#include +#include +using namespace std; + +int main(int argc, char** argv); + +void print_attributes(xed_decoded_inst_t* xedd) { + const xed_inst_t* xi = xed_decoded_inst_inst(xedd); + unsigned int i, nattributes = xed_attribute_max(); + xed_uint32_t all_attributes = xed_inst_get_attributes(xi); + if (all_attributes == 0) + return; + cout << "ATTRIBUTES: "; + for(i=0;i> hex >> x; + assert(bytes < XED_MAX_INSTRUCTION_BYTES); + itext[bytes++] = STATIC_CAST(xed_uint8_t,x); + } + if (bytes == 0) { + cout << "Must supply some hex bytes" << endl; + exit(1); + } + + cout << "Attempting to decode: " << hex << setfill('0') ; + for(i=0;i(itext[i]) << " "; + cout << endl << setfill(' ') << dec; + + xed_error_enum_t xed_error = xed_decode(&xedd, + REINTERPRET_CAST(const xed_uint8_t*,itext), + bytes); + switch(xed_error) { + case XED_ERROR_NONE: + break; + case XED_ERROR_BUFFER_TOO_SHORT: + cout << "Not enough bytes provided" << endl; + exit(1); + case XED_ERROR_GENERAL_ERROR: + cout << "Could not decode given input." << endl; + exit(1); + default: + cout << "Unhandled error code " << xed_error_enum_t2str(xed_error) << endl; + exit(1); + } + + + cout << "iclass " + << xed_iclass_enum_t2str(xed_decoded_inst_get_iclass(&xedd)) << "\t"; + cout << "category " + << xed_category_enum_t2str(xed_decoded_inst_get_category(&xedd)) << "\t"; + cout << "ISA-extension " + << xed_extension_enum_t2str(xed_decoded_inst_get_extension(&xedd)) << endl; + cout << "instruction-length " + << xed_decoded_inst_get_length(&xedd) << endl; + cout << "effective-operand-width " + << xed_operand_values_get_effective_operand_width(xed_decoded_inst_operands_const(&xedd)) << endl; + cout << "effective-address-width " + << xed_operand_values_get_effective_address_width(xed_decoded_inst_operands_const(&xedd)) << endl; + cout << "iform-enum-name " + << xed_iform_enum_t2str(xed_decoded_inst_get_iform_enum(&xedd)) << endl; + cout << "iform-enum-name-dispatch (zero based) " + << xed_decoded_inst_get_iform_enum_dispatch(&xedd) << endl; + cout << "iclass-max-iform-dispatch " + << xed_iform_max_per_iclass(xed_decoded_inst_get_iclass(&xedd)) << endl; + + // operands + print_operands(&xedd); + + // memops + print_memops(&xedd); + + // flags + print_flags(&xedd); + + // attributes + print_attributes(&xedd); + return 0; +}