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.


Do we need to save and restore the guests GS/FS regs?
[palacios.git] / palacios / include / palacios / vm_guest.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 __VM_GUEST_H__
21 #define __VM_GUEST_H__
22
23 #ifdef __V3VEE__
24
25 #include <palacios/vmm_types.h>
26 #include <palacios/vmm_mem.h>
27 #include <palacios/vmm_io.h>
28 #include <palacios/vmm_shadow_paging.h>
29 #include <palacios/vmm_intr.h>
30 #include <palacios/vmm_dev_mgr.h>
31 #include <palacios/vmm_time.h>
32 #include <palacios/vmm_host_events.h>
33 #include <palacios/vmm_msr.h>
34 #include <palacios/vmm_profiler.h>
35
36
37
38 struct v3_gprs {
39   v3_reg_t rdi;
40   v3_reg_t rsi;
41   v3_reg_t rbp;
42   v3_reg_t rsp;
43   v3_reg_t rbx;
44   v3_reg_t rdx;
45   v3_reg_t rcx;
46   v3_reg_t rax;
47
48   v3_reg_t r8;
49   v3_reg_t r9;
50   v3_reg_t r10;
51   v3_reg_t r11;
52   v3_reg_t r12;
53   v3_reg_t r13;
54   v3_reg_t r14;
55   v3_reg_t r15;
56   
57 } __attribute__((packed));
58
59
60 struct v3_ctrl_regs {
61   v3_reg_t cr0;
62   v3_reg_t cr2;
63   v3_reg_t cr3;
64   v3_reg_t cr4;
65   v3_reg_t cr8;
66   v3_reg_t rflags;
67   v3_reg_t efer;
68 };
69
70
71
72 struct v3_dbg_regs {
73   v3_reg_t dr0;
74   v3_reg_t dr1;
75   v3_reg_t dr2;
76   v3_reg_t dr3;
77   v3_reg_t dr6;
78   v3_reg_t dr7;
79 };
80
81 struct v3_segment {
82   ushort_t selector;
83   uint_t limit;
84   ullong_t base;
85   uint_t type           : 4;
86   uint_t system         : 1;
87   uint_t dpl            : 2;
88   uint_t present        : 1;
89   uint_t avail          : 1;
90   uint_t long_mode      : 1;
91   uint_t db             : 1;
92   uint_t granularity    : 1;
93 } __attribute__((packed));
94
95
96 struct v3_segments {
97   struct v3_segment cs;
98   struct v3_segment ds;
99   struct v3_segment es;
100   struct v3_segment fs;
101   struct v3_segment gs;
102   struct v3_segment ss;
103   struct v3_segment ldtr;
104   struct v3_segment gdtr;
105   struct v3_segment idtr;
106   struct v3_segment tr;
107 };
108
109 struct shadow_page_state;
110 struct v3_intr_state;
111 struct v3_profiler;
112
113
114
115
116 struct guest_info {
117   ullong_t rip;
118
119   uint_t cpl;
120
121   addr_t mem_size; // Probably in bytes for now....
122   v3_shdw_map_t mem_map;
123
124
125   struct vm_time time_state;
126
127   
128   v3_paging_mode_t shdw_pg_mode;
129   struct shadow_page_state shdw_pg_state;
130   addr_t direct_map_pt;
131   // nested_paging_t nested_page_state;
132
133
134   // This structure is how we get interrupts for the guest
135   struct v3_intr_state intr_state;
136
137   v3_io_map_t io_map;
138
139   struct v3_msr_map msr_map;
140
141   // device_map
142   struct vmm_dev_mgr  dev_mgr;
143
144   struct v3_host_events host_event_hooks;
145
146   v3_vm_cpu_mode_t cpu_mode;
147   v3_vm_mem_mode_t mem_mode;
148
149
150   struct v3_gprs vm_regs;
151   struct v3_ctrl_regs ctrl_regs;
152   struct v3_dbg_regs dbg_regs;
153   struct v3_segments segments;
154
155   v3_vm_operating_mode_t run_state;
156   void * vmm_data;
157
158
159   uint_t enable_profiler;
160   struct v3_profiler profiler;
161
162   void * decoder_state;
163
164   v3_msr_t guest_efer;
165
166   /* Do we need these ? */
167   v3_msr_t guest_star;
168   v3_msr_t guest_lstar;
169   v3_msr_t guest_cstar;
170   v3_msr_t guest_syscall_mask;
171   v3_msr_t guest_gs_base;
172
173
174   uint64_t fs;
175   uint64_t gs;
176
177
178
179 };
180
181
182 v3_vm_cpu_mode_t v3_get_cpu_mode(struct guest_info * info);
183 v3_vm_mem_mode_t v3_get_mem_mode(struct guest_info * info);
184
185
186 const uchar_t * v3_cpu_mode_to_str(v3_vm_cpu_mode_t mode);
187 const uchar_t * v3_mem_mode_to_str(v3_vm_mem_mode_t mode);
188
189
190 void v3_print_segments(struct guest_info * info);
191 void v3_print_ctrl_regs(struct guest_info * info);
192 void v3_print_GPRs(struct guest_info * info);
193
194 #endif // ! __V3VEE__
195
196
197
198 #endif