Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


vmx refactoring
[palacios.git] / palacios / include / palacios / vmx.h
1
2 /* 
3  * This file is part of the Palacios Virtual Machine Monitor developed
4  * by the V3VEE Project with funding from the United States National 
5  * Science Foundation and the Department of Energy.  
6  *
7  * The V3VEE Project is a joint project between Northwestern University
8  * and the University of New Mexico.  You can find out more at 
9  * http://www.v3vee.org
10  *
11  * Copyright (c) 2008, Peter Dinda <pdinda@northwestern.edu> 
12  * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> 
13  * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org> 
14  * All rights reserved.
15  *
16  * Author: Peter Dinda <pdinda@northwestern.edu>
17  * Author: Jack Lange <jarusl@cs.northwestern.edu>
18  *
19  * This is free software.  You are permitted to use,
20  * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
21  */
22
23
24 #ifndef __VMX_H
25 #define __VMX_H
26
27 #ifdef __V3VEE__
28
29 #include <palacios/vmm_types.h>
30 #include <palacios/vmcs.h>
31
32 // Intel VMX Specific MSRs
33 #define VMX_FEATURE_CONTROL_MSR     0x0000003a
34 #define VMX_BASIC_MSR          0x00000480
35 #define VMX_PINBASED_CTLS_MSR       0x00000481
36 #define VMX_PROCBASED_CTLS_MSR      0x00000482
37 #define VMX_EXIT_CTLS_MSR           0x00000483
38 #define VMX_ENTRY_CTLS_MSR          0x00000484
39 #define VMX_MISC_MSR                0x00000485
40 #define VMX_CR0_FIXED0_MSR          0x00000486
41 #define VMX_CR0_FIXED1_MSR          0x00000487
42 #define VMX_CR4_FIXED0_MSR          0x00000488
43 #define VMX_CR4_FIXED1_MSR          0x00000489
44 #define VMX_VMCS_ENUM_MSR           0x0000048A
45
46 #define VMX_SUCCESS        0
47 #define VMX_FAIL_INVALID   1
48 #define VMX_FAIL_VALID     2
49 #define VMM_ERROR          3
50
51 #define FEATURE_CONTROL_LOCK  0x00000001
52 #define FEATURE_CONTROL_VMXON 0x00000004
53 #define FEATURE_CONTROL_VALID ( FEATURE_CONTROL_LOCK | FEATURE_CONTROL_VMXON )
54
55
56 #define CPUID_1_ECX_VTXFLAG 0x00000020
57
58
59
60 struct vmx_basic_msr {
61     uint32_t revision;
62     uint_t regionSize   : 13;
63     uint_t rsvd1        : 4; // Always 0
64     uint_t physWidth    : 1;
65     uint_t smm          : 1; // Always 1
66     uint_t memType      : 4;
67     uint_t rsvd2        : 10; // Always 0
68 }  __attribute__((packed));
69
70 typedef enum { 
71     VMXASSIST_STARTUP,
72     VMXASSIST_V8086_BIOS,
73     VMXASSIST_V8086,
74     NORMAL 
75 } vmx_state_t;
76
77 struct vmx_data {
78     vmx_state_t state;
79     struct vmcs_data vmcs;
80 };
81
82
83 enum InstructionType { VM_UNKNOWN_INST, VM_MOV_TO_CR0 } ;
84
85 struct Instruction {
86   enum InstructionType type;
87   uint_t          address;
88   uint_t          size;
89   uint_t          input1;
90   uint_t          input2;
91   uint_t          output;
92 };
93
94
95
96
97 int is_vmx_capable();
98
99 VmxOnRegion * Init_VMX();
100 VmxOnRegion * CreateVmxOnRegion();
101
102 int VMLaunch(struct VMDescriptor *vm);
103
104
105 int Do_VMM(struct VMXRegs regs);
106
107
108 #endif // ! __V3VEE__
109
110 #endif