X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmm_decoder.h;h=ec52d094f3cea38d6a2b09a9dd03612b612b9a1e;hb=5db3136d5331c355c188537c68005db8d2cb4eac;hp=ddbf9f8847347bccf1d60bbe0d0239e9e76ea16e;hpb=d0534dc3a0dc459971b2cdfd423dfb9a4f06a08b;p=palacios.releases.git diff --git a/palacios/include/palacios/vmm_decoder.h b/palacios/include/palacios/vmm_decoder.h index ddbf9f8..ec52d09 100644 --- a/palacios/include/palacios/vmm_decoder.h +++ b/palacios/include/palacios/vmm_decoder.h @@ -1,21 +1,33 @@ -#ifndef __VMM_EMULATE_H -#define __VMM_EMULATE_H - -#ifdef __V3VEE__ - -#include -#include /* - * This is where we do the hideous X86 instruction parsing among other things - * We can parse out the instruction prefixes, as well as decode the operands + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2008, Jack Lange + * Copyright (c) 2008, The V3VEE Project + * All rights reserved. + * + * Author: Jack Lange + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". */ +#ifndef __VMM_DECODER_H +#define __VMM_DECODER_H +#ifdef __V3VEE__ +#include +#include -typedef enum {INVALID_OPERAND, REG_OPERAND, MEM_OPERAND} operand_type_t; +typedef enum {INVALID_OPERAND, REG_OPERAND, MEM_OPERAND, IMM_OPERAND} operand_type_t; struct x86_operand { addr_t operand; @@ -23,7 +35,7 @@ struct x86_operand { operand_type_t type; }; -struct x86_prefix_list { +struct x86_prefixes { uint_t lock : 1; // 0xF0 uint_t repne : 1; // 0xF2 uint_t repnz : 1; // 0xF2 @@ -44,17 +56,26 @@ struct x86_prefix_list { struct x86_instr { + struct x86_prefixes prefixes; uint_t instr_length; addr_t opcode; // a pointer to the V3_OPCODE_[*] arrays defined below uint_t num_operands; - struct x86_prefix_list prefixes; - struct x86_operand first_operand; - struct x86_operand second_operand; + struct x86_operand dst_operand; + struct x86_operand src_operand; struct x86_operand third_operand; void * decoder_data; }; +struct basic_instr_info { + uint_t instr_length; + uint_t op_size; + uint_t str_op : 1; + uint_t has_rep : 1; +}; + + + /************************/ /* EXTERNAL DECODER API */ /************************/ @@ -88,10 +109,16 @@ int v3_decode(struct guest_info * info, addr_t instr_ptr, struct x86_instr * ins int v3_encode(struct guest_info * info, struct x86_instr * instr, char * instr_buf); +/* + * Gets the operand size for a memory operation + * + */ +int v3_basic_mem_decode(struct guest_info * info, addr_t instr_ptr, struct basic_instr_info * instr_info); - +/* Removes a rep prefix in place */ +void strip_rep_prefix(uchar_t * instr, int length); @@ -181,7 +208,10 @@ MAKE_INSTR(SMSW, 3, 0x0f, 0x01, 0x00); #define PREFIX_OP_SIZE 0x66 #define PREFIX_ADDR_SIZE 0x67 -static inline int is_prefix_byte(char byte) { +int opcode_cmp(const uchar_t * op1, const uchar_t * op2); + + +static inline int is_prefix_byte(uchar_t byte) { switch (byte) { case 0xF0: // lock case 0xF2: // REPNE/REPNZ @@ -391,13 +421,13 @@ static inline operand_type_t decode_operands16(struct v3_gprs * gprs, // input/o static inline operand_type_t decode_operands32(struct v3_gprs * gprs, // input/output - char * modrm_instr, // input + uchar_t * modrm_instr, // input int * offset, // output addr_t * first_operand, // output addr_t * second_operand, // output reg_size_t reg_size) { // input - char * instr_cursor = modrm_instr; + uchar_t * instr_cursor = modrm_instr; struct modrm_byte * modrm = (struct modrm_byte *)modrm_instr; addr_t base_addr = 0; modrm_mode_t mod_mode = 0;