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