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.


Succesful transition to vmxassist, then to the bios, where it dies in keyboard init.
[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 #include <palacios/vmm.h>
32 #include <palacios/vm_guest.h>
33
34 // Intel VMX Specific MSRs
35 #define VMX_FEATURE_CONTROL_MSR     0x0000003a
36 #define VMX_BASIC_MSR               0x00000480
37 #define VMX_PINBASED_CTLS_MSR       0x00000481
38 #define VMX_PROCBASED_CTLS_MSR      0x00000482
39 #define VMX_EXIT_CTLS_MSR           0x00000483
40 #define VMX_ENTRY_CTLS_MSR          0x00000484
41 #define VMX_MISC_MSR                0x00000485
42 #define VMX_CR0_FIXED0_MSR          0x00000486
43 #define VMX_CR0_FIXED1_MSR          0x00000487
44 #define VMX_CR4_FIXED0_MSR          0x00000488
45 #define VMX_CR4_FIXED1_MSR          0x00000489
46 #define VMX_VMCS_ENUM_MSR           0x0000048A
47
48 #define VMX_SUCCESS        0
49 #define VMX_FAIL_INVALID   1
50 #define VMX_FAIL_VALID     2
51 #define VMM_ERROR          3
52
53 #define FEATURE_CONTROL_LOCK  0x00000001
54 #define FEATURE_CONTROL_VMXON 0x00000004
55 #define FEATURE_CONTROL_VALID ( FEATURE_CONTROL_LOCK | FEATURE_CONTROL_VMXON )
56
57
58 #define CPUID_1_ECX_VTXFLAG 0x00000020
59
60
61
62 struct vmx_basic_msr {
63     uint32_t revision;
64     uint_t regionSize   : 13;
65     uint_t rsvd1        : 4; // Always 0
66     uint_t physWidth    : 1;
67     uint_t smm          : 1; // Always 1
68     uint_t memType      : 4;
69     uint_t rsvd2        : 10; // Always 0
70 }  __attribute__((packed));
71
72 typedef enum { 
73     VMXASSIST_STARTUP,
74     VMXASSIST_V8086_BIOS,
75     VMXASSIST_V8086,
76     NORMAL 
77 } vmx_state_t;
78
79 struct tss_descriptor {
80     union {
81     ulong_t value;
82     struct {
83         uint16_t    limit1;
84         uint16_t    base1;
85         uint_t      base2       : 8;
86         /* In IA32, type follows the form 10B1b, where B is the busy flag */
87         uint_t      type        : 4; 
88         uint_t      zero1       : 1;
89         uint_t      dpl         : 2;
90         uint_t      present     : 1;
91         uint_t      limit2      : 4;
92         uint_t      available   : 1;
93         uint_t      zero2       : 1;
94         uint_t      zero3       : 1;
95         uint_t      granularity : 1;
96         uint_t      base3       : 8;
97 #ifdef __V3_64BIT__
98         uint32_t    base4;
99         uint_t      rsvd1       : 8;
100         uint_t      zero4       : 5;
101         uint_t      rsvd2       : 19;
102 #endif
103     } __attribute__((packed));
104     } __attribute__((packed));
105 }__attribute__((packed));
106
107 struct vmcs_host_state {
108     struct v3_segment  gdtr;
109     struct v3_segment  idtr;
110     struct v3_segment  tr;
111 };
112
113 struct vmx_data {
114     vmx_state_t state;
115     addr_t vmcs_ptr_phys;
116     struct vmcs_host_state host_state;
117     /* VMX Control Fields */
118     uint32_t pinbased_ctrls;
119     uint32_t pri_procbased_ctrls;
120     uint32_t sec_procbased_ctrls;
121     uint32_t exit_ctrls;
122     uint32_t entry_ctrls;
123 };
124
125
126 enum InstructionType { VM_UNKNOWN_INST, VM_MOV_TO_CR0 } ;
127
128 struct Instruction {
129   enum InstructionType type;
130   uint_t          address;
131   uint_t          size;
132   uint_t          input1;
133   uint_t          input2;
134   uint_t          output;
135 };
136
137
138
139
140 int v3_is_vmx_capable();
141 void v3_init_vmx(struct v3_ctrl_ops* vm_ops);
142 int v3_update_vmcs_guest_state(struct guest_info * info);
143 int v3_update_vmcs_ctrl_fields(struct guest_info * info);
144 int v3_update_vmcs_host_state(struct guest_info * info);
145
146
147
148 #endif // ! __V3VEE__
149
150 #endif 
151
152