1/* 2 * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) 3 * 4 * SPDX-License-Identifier: GPL-2.0-only 5 */ 6#pragma once 7 8#include <sel4vm/guest_vm.h> 9#include <sel4vm/arch/guest_x86_context.h> 10 11#define MAX_INSTR_OPCODES 255 12#define OP_ESCAPE 0xf 13 14int vm_fetch_instruction(vm_vcpu_t *vcpu, uint32_t eip, uintptr_t cr3, int len, uint8_t *buf); 15 16int vm_decode_instruction(uint8_t *instr, int instr_len, int *reg, uint32_t *imm, int *op_len); 17 18void vm_decode_ept_violation(vm_vcpu_t *vcpu, int *reg, uint32_t *imm, int *size); 19 20/* Interpret just enough virtual 8086 instructions to run trampoline code. 21 Returns the final jump address */ 22uintptr_t vm_emulate_realmode(vm_vcpu_t *vcpu, uint8_t *instr_buf, 23 uint16_t *segment, uintptr_t eip, uint32_t len, guest_state_t *gs); 24 25// TODO don't have these in a header, make them inline functions 26const static int vm_decoder_reg_mapw[] = { 27 VCPU_CONTEXT_EAX, 28 VCPU_CONTEXT_ECX, 29 VCPU_CONTEXT_EDX, 30 VCPU_CONTEXT_EBX, 31 /*VCPU_CONTEXT_ESP*/ -1, 32 VCPU_CONTEXT_EBP, 33 VCPU_CONTEXT_ESI, 34 VCPU_CONTEXT_EDI 35}; 36 37const static int vm_decoder_reg_mapb[] = { 38 VCPU_CONTEXT_EAX, 39 VCPU_CONTEXT_ECX, 40 VCPU_CONTEXT_EDX, 41 VCPU_CONTEXT_EBX, 42 VCPU_CONTEXT_EAX, 43 VCPU_CONTEXT_ECX, 44 VCPU_CONTEXT_EDX, 45 VCPU_CONTEXT_EBX 46}; 47 48