X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=misc%2Fdecoder_test%2Ftest.c;fp=misc%2Fdecoder_test%2Ftest.c;h=0000000000000000000000000000000000000000;hp=f92238adbb49307ddc1a5d2e0940bb81b19caff8;hb=7a6cd49101201e207daf7113a9048193835cebaf;hpb=320320a1c8681f2d8258a03dd087b3aed18b48a1 diff --git a/misc/decoder_test/test.c b/misc/decoder_test/test.c deleted file mode 100644 index f92238a..0000000 --- a/misc/decoder_test/test.c +++ /dev/null @@ -1,194 +0,0 @@ -#include -#include -#include -#include -#include - - -#include "test.h" -#include "vmm_xed.h" -#include "vmm_decoder.h" -#include "vm_guest.h" - - -/* Disgusting mask hack... - I can't think right now, so we'll do it this way... -*/ -static const ullong_t mask_1 = 0x00000000000000ffLL; -static const ullong_t mask_2 = 0x000000000000ffffLL; -static const ullong_t mask_4 = 0x00000000ffffffffLL; -static const ullong_t mask_8 = 0xffffffffffffffffLL; - - -#define MASK(val, length) ({ \ - ullong_t mask = 0x0LL; \ - switch (length) { \ - case 1: \ - mask = mask_1; \ - case 2: \ - mask = mask_2; \ - case 4: \ - mask = mask_4; \ - case 8: \ - mask = mask_8; \ - } \ - val & mask;}) \ - -static void init_guest_info(struct guest_info * info) { - memset(info, 0, sizeof(struct guest_info)); - info->cpu_mode = PROTECTED; - - info->vm_regs.rax = 0x01010101; - info->vm_regs.rbx = 0x02020202; - info->vm_regs.rcx = 0x03030303; - info->vm_regs.rdx = 0x04040404; - - info->vm_regs.rdi = 0x05050505; - info->vm_regs.rsi = 0x06060606; - info->vm_regs.rsp = 0x07070707; - info->vm_regs.rbp = 0x08080808; - - info->vm_regs.rdi = 0x05050505; - info->vm_regs.rsi = 0x06060606; - info->vm_regs.rsp = 0x07070707; - info->vm_regs.rbp = 0x08080808; - - - info->segments.ds.base = 0xf0f0f0f0; - info->segments.es.base = 0xe0e0e0e0; - - - - -} -static const char * mem = "MEMORY"; -static const char * reg = "REGISTER"; -static const char * imm = "IMMEDIATE"; -static const char * invalid = "INVALID"; - -static const char * get_op_type_str(operand_type_t type) { - if (type == MEM_OPERAND) { - return mem; - } else if (type == REG_OPERAND) { - return reg; - } else if (type == IMM_OPERAND) { - return imm; - } else { - return invalid; - } -} - -static int print_op(struct x86_operand *op) { - printf("\ttype=%s\n", get_op_type_str(op->type)); - - switch (op->type) { - case REG_OPERAND: - printf("\tsize=%d\n", op->size); - printf("\taddr=0x%x (val=%x)\n", op->operand, MASK(*(uint_t*)(op->operand), op->size)); - return 0; - case MEM_OPERAND: - printf("\tsize=%d\n", op->size); - printf("\taddr=0x%x\n", op->operand); - return 0; - - case IMM_OPERAND: - printf("\tsize=%d\n", op->size); - printf("\tval=0x%x\n", op->operand); - return 0; - - default: - return -1; - } -} - -int main(int argc, char ** argv) { - char * filename; - int fd; - struct stat file_state; - int ret; - char * file_buf; - int buf_offset = 0; - int file_size = 0; - char * instr_ptr = 0; - - struct guest_info * info = (struct guest_info *)malloc(sizeof(struct guest_info ));; - - init_decoder(); - init_guest_info(info); - - if (argc == 1) { - printf("Error: Must give a binary file\n"); - exit(-1); - } - - filename = argv[1]; - - ret = stat(filename, &file_state); - - if (ret == -1) { - printf("Could not stat file\n"); - return -1; - } - file_size = file_state.st_size; - - file_buf = malloc(file_size); - - fd = open(filename, NULL); - - if (fd == -1) { - printf("Could not open file\n"); - return -1; - } else { - int total_read = 0; - int num_read = 0; - - while (total_read < file_size) { - num_read = read(fd, file_buf + total_read, file_size - total_read); - - if (num_read == 0) { - printf("end of file\n"); - break; - } - if (num_read == -1) { - printf("Read error\n"); - exit(-1); - } - - total_read += num_read; - } - - } - - - instr_ptr = file_buf; - - - PrintV3CtrlRegs(info); - PrintV3GPRs(info); - PrintV3Segments(info); - - - while (buf_offset < file_size) { - struct x86_instr instr; - - if (v3_decode(info, (addr_t)instr_ptr + buf_offset, &instr) == -1) { - printf("Unhandled instruction\n"); - buf_offset += instr.instr_length; - continue; - } - printf("instr_length = %d, noperands=%d\n", instr.instr_length, instr.num_operands); - - printf("Source:\n"); - print_op(&(instr.src_operand)); - - printf("Dest:\n"); - print_op(&(instr.dst_operand)); - - - printf("\n\n"); - - buf_offset += instr.instr_length; - } - - return 0; -}