+++ /dev/null
-#include <stdlib.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-
-#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;
-}