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.


1152b5c5a0db939d634a6622f06cd653f3117d40
[palacios.git] / palacios / include / palacios / vmx_handler.h
1 /* 
2  * This file is part of the Palacios Virtual Machine Monitor developed
3  * by the V3VEE Project with funding from the United States National 
4  * Science Foundation and the Department of Energy.  
5  *
6  * The V3VEE Project is a joint project between Northwestern University
7  * and the University of New Mexico.  You can find out more at 
8  * http://www.v3vee.org
9  *
10  * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> 
11  * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org> 
12  * All rights reserved.
13  *
14  * Author: Jack Lange <jarusl@cs.northwestern.edu>
15  *
16  * This is free software.  You are permitted to use,
17  * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
18  */
19
20 #ifndef __VMX_HANDLER_H__
21 #define __VMX_HANDLER_H__
22
23 #ifdef __V3VEE__
24
25 #include <palacios/vm_guest.h>
26
27 /******************************************/
28 /* VMX Intercept Exit Codes               */
29 /******************************************/
30 typedef enum {
31     VMEXIT_INFO_EXCEPTION_OR_NMI            = 0,
32     VMEXIT_EXTERNAL_INTR                    = 1,
33     VMEXIT_TRIPLE_FAULT                     = 2,
34     VMEXIT_INIT_SIGNAL                      = 3,
35     VMEXIT_STARTUP_IPI                      = 4,
36     VMEXIT_IO_SMI                           = 5,
37     VMEXIT_OTHER_SMI                        = 6,
38     VMEXIT_INTR_WINDOW                      = 7,
39     VMEXIT_NMI_WINDOW                       = 8,
40     VMEXIT_TASK_SWITCH                      = 9,
41     VMEXIT_CPUID                            = 10,
42     VMEXIT_HLT                              = 12,
43     VMEXIT_INVD                             = 13,
44     VMEXIT_INVLPG                           = 14,
45     VMEXIT_RDPMC                            = 15,
46     VMEXIT_RDTSC                            = 16,
47     VMEXIT_RSM                              = 17,
48     VMEXIT_VMCALL                           = 18,
49     VMEXIT_VMCLEAR                          = 19,
50     VMEXIT_VMLAUNCH                         = 20,
51     VMEXIT_VMPTRLD                          = 21,
52     VMEXIT_VMPTRST                          = 22,
53     VMEXIT_VMREAD                           = 23,
54     VMEXIT_VMRESUME                         = 24,
55     VMEXIT_VMWRITE                          = 25,
56     VMEXIT_VMXOFF                           = 26,
57     VMEXIT_VMXON                            = 27,
58     VMEXIT_CR_REG_ACCESSES                  = 28,
59     VMEXIT_MOV_DR                           = 29,
60     VMEXIT_IO_INSTR                         = 30,
61     VMEXIT_RDMSR                            = 31,
62     VMEXIT_WRMSR                            = 32,
63     VMEXIT_ENTRY_FAIL_INVALID_GUEST_STATE   = 33,
64     VMEXIT_ENTRY_FAIL_MSR_LOAD              = 34,
65     VMEXIT_MWAIT                            = 36,
66     VMEXIT_MONITOR                          = 39,
67     VMEXIT_PAUSE                            = 40,
68     VMEXIT_ENTRY_FAILURE_MACHINE_CHECK      = 41,
69     VMEXIT_TPR_BELOW_THRESHOLD              = 43,
70     VMEXIT_APIC                             = 44,
71     VMEXIT_GDTR_IDTR                        = 46,
72     VMEXIT_LDTR_TR                          = 47,
73     VMEXIT_EPT_VIOLATION                    = 48,
74     VMEXIT_EPT_CONFIG                       = 49,
75     VMEXIT_INVEPT                           = 50,
76     VMEXIT_RDTSCP                           = 51,
77     VMEXIT_EXPIRED_PREEMPT_TIMER            = 52,
78     VMEXIT_INVVPID                          = 53,
79     VMEXIT_WBINVD                           = 54,
80     VMEXIT_XSETBV                           = 55
81 } vmx_exit_t;
82
83 /* VMCS Exit QUALIFICATIONs */
84 struct vmx_exit_io_qual {
85     union {
86         uint32_t value;
87         struct {
88             uint32_t access_size : 3; // (0: 1 Byte ;; 1: 2 Bytes ;; 3: 4 Bytes)
89             uint32_t dir        : 1; // (0: Out ;; 1: In)
90             uint32_t string     : 1; // (0: not string ;; 1: string)
91             uint32_t rep        : 1; // (0: not REP ;; 1: REP)
92             uint32_t op_enc      : 1; // (0: DX ;; 1: immediate)
93             uint32_t rsvd       : 9; // Set to 0
94             uint32_t port       : 16; // IO Port Number
95         } __attribute__((packed));
96     } __attribute__((packed));
97 } __attribute__((packed));
98
99 struct vmx_exit_io_instr_info {
100     union {
101         uint32_t value;
102         struct {
103             uint32_t undef1     : 7;
104             uint32_t addr_size  : 3;
105             uint32_t undef2     : 5;
106             uint32_t seg_reg    : 3;
107             uint32_t undef3     : 14;
108         } __attribute__((packed));
109     } __attribute__((packed));
110 } __attribute__((packed));
111
112 /* Exit Interrupt Vector Info */
113 struct vmx_exit_int_info {
114     union {
115         uint32_t value;
116         struct {
117             uint32_t vector     : 8; // IRQ number, exception vector, NMI = 2 
118             uint32_t type       : 3; // (0: ext. IRQ , 2: NMI , 3: hw exception , 6: sw exception
119             uint32_t error_code : 1; // 1: error Code present
120             uint32_t nmi_unblock : 1; // something to do with NMIs and IRETs (Intel 3B, sec. 23.2.2) 
121             uint32_t rsvd       : 18; // always 0
122             uint32_t valid      : 1; // always 1 if valid
123         } __attribute__ ((packed));
124     } __attribute__ ((packed));
125 } __attribute__((packed));
126
127 /* VMX entry interrupt format */
128 struct vmx_entry_int_info {
129     union {
130         uint32_t value;
131         struct {
132             uint32_t vector     : 8; // IRQ/exception vector number
133             uint32_t type       : 3; // (0: ext. IRQ, 2: NMI, 3: hw excp, 4: sw int, 5: priv. sw excp, 6: sw excp, 7: other
134             uint32_t error_code : 1; // 1: deliver error code
135             uint32_t rsvd       : 19;
136             uint32_t valid      : 1; // 1: valid
137         } __attribute__ ((packed));
138     } __attribute__ ((packed));
139 } __attribute__ ((packed));
140
141
142
143
144 struct VMExitDBGQual {
145     uint32_t B0         : 1; // Breakpoint 0 condition met
146     uint32_t B1         : 1; // Breakpoint 1 condition met
147     uint32_t B2         : 1; // Breakpoint 2 condition met
148     uint32_t B3         : 1; // Breakpoint 3 condition met
149     uint32_t rsvd       : 9; // reserved to 0
150     uint32_t BD         : 1; // detected DBG reg access
151     uint32_t BS         : 1; // cause either single instr or taken branch
152 } __attribute__((packed));
153
154
155 struct VMExitTSQual {
156     uint32_t selector   : 16; // selector of destination TSS 
157     uint32_t rsvd       : 14; // reserved to 0
158     uint32_t src        : 2; // (0: CALL ; 1: IRET ; 2: JMP ; 3: Task gate in IDT)
159 } __attribute__((packed));
160
161 struct vmx_exit_cr_qual {
162     union {
163         uint32_t value;
164         struct {
165             uint32_t cr_id       : 4; // cr number (0 for CLTS and LMSW) (bit 3 always 0, on 32bit)
166             uint32_t access_type : 2; // (0: MOV to CR ; 1: MOV from CR ; 2: CLTS ; 3: LMSW)
167             uint32_t lmsw_op_type : 1; // (0: register ; 1: memory)
168             uint32_t rsvd1      : 1; // reserved to 0
169             uint32_t gpr        : 4; // (0:RAX+[CLTS/LMSW], 1:RCX, 2:RDX, 3:RBX, 4:RSP, 5:RBP, 6:RSI, 6:RDI, 8-15:64bit regs)
170             uint32_t rsvd2      : 4; // reserved to 0
171             uint32_t lmsw_src    : 16; // src data for lmsw
172         } __attribute__((packed));
173     } __attribute__((packed));
174 } __attribute__((packed));
175
176 struct VMExitMovDRQual {
177     uint32_t regID      : 3; // debug register number
178     uint32_t rsvd1      : 1; // reserved to 0
179     uint32_t dir        : 1; // (0: MOV to DR , 1: MOV from DR)
180     uint32_t rsvd2      : 3; // reserved to 0
181     uint32_t gpr        : 4; // (0:RAX, 1:RCX, 2:RDX, 3:RBX, 4:RSP, 5:RBP, 6:RSI, 6:RDI, 8-15:64bit regs)
182 } __attribute__((packed));
183
184 /* End Exit Qualifications */
185
186 struct vmx_exit_idt_vec_info {
187     union {
188         uint32_t value;
189         struct {
190             uint32_t vector     : 8;
191             uint32_t type       : 3;
192             uint32_t error_code : 1;
193             uint32_t undef      : 1;
194             uint32_t rsvd       : 18;
195             uint32_t valid      : 1;
196         } __attribute__ ((packed));
197     } __attribute__ ((packed));
198 } __attribute__ ((packed));
199
200 int v3_handle_vmx_exit(struct v3_gprs * gprs, struct guest_info * info, struct v3_ctrl_regs * ctrl_regs);
201 const char * v3_vmx_exit_code_to_str(vmx_exit_t exit);
202
203 #endif
204
205 #endif