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.


VM reset capability
[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_mem_hook.h>
28 #include <palacios/vmm_io.h>
29 #include <palacios/vmm_shadow_paging.h>
30 #include <palacios/vmm_direct_paging.h>
31 #include <palacios/vmm_intr.h>
32 #include <palacios/vmm_excp.h>
33 #include <palacios/vmm_dev_mgr.h>
34 #include <palacios/vmm_time.h>
35 #include <palacios/vmm_host_events.h>
36 #include <palacios/vmm_msr.h>
37 #include <palacios/vmm_hypercall.h>
38 #include <palacios/vmm_cpuid.h>
39 #include <palacios/vmm_regs.h>
40 #include <palacios/vmm_extensions.h>
41 #include <palacios/vmm_barrier.h>
42 #include <palacios/vmm_subset.h>
43 #include <palacios/vmm_timeout.h>
44 #include <palacios/vmm_exits.h>
45 #include <palacios/vmm_events.h>
46 #include <palacios/vmm_scheduler.h>
47 #include <palacios/vmm_fw_cfg.h>
48 #include <palacios/vmm_fp.h>
49 #include <palacios/vmm_perftune.h>
50
51
52 #ifdef V3_CONFIG_TELEMETRY
53 #include <palacios/vmm_telemetry.h>
54 #endif
55
56 #ifdef V3_CONFIG_PMU_TELEMETRY
57 #include <palacios/vmm_pmu_telemetry.h>
58 #endif
59
60 #ifdef V3_CONFIG_PWRSTAT_TELEMETRY
61 #include <palacios/vmm_pwrstat_telemetry.h>
62 #endif
63
64 #ifdef V3_CONFIG_SYMBIOTIC
65 #include <palacios/vmm_symbiotic.h>
66 struct v3_sym_core_state;
67 #endif
68
69 #ifdef V3_CONFIG_MEM_TRACK
70 #include <palacios/vmm_mem_track.h>
71 #endif
72
73 #ifdef V3_CONFIG_MULTIBOOT
74 #include <palacios/vmm_multiboot.h>
75 #endif
76
77 #ifdef V3_CONFIG_HVM
78 #include <palacios/vmm_hvm.h>
79 #endif
80
81
82
83 #include <palacios/vmm_config.h>
84
85 struct v3_intr_state;
86
87
88
89
90 /* per-core state */
91 struct guest_info {
92     char exec_name[256];
93     
94     uint64_t rip;
95
96     uint_t cpl;
97
98     struct vm_core_time time_state;
99     struct v3_core_timeouts timeouts;
100     void * sched_priv_data;
101
102     v3_paging_mode_t shdw_pg_mode;
103     // arch-independent state of shadow pager
104     struct v3_shdw_pg_state shdw_pg_state;
105     // arch-indepedent state of the passthrough pager
106     addr_t direct_map_pt;
107     // arch-independent state of the nested pager (currently none)
108     // struct v3_nested_pg_state nested_pg_state;
109     // per-core state of the swapper (currently none)
110     //#ifdef V3_CONFIG_SWAPPING
111     //   struct v3_swap_impl_state swap_impl;
112     //#endif
113     
114
115     union {
116         uint32_t flags;
117         struct {
118             uint8_t use_large_pages        : 1;    /* Enable virtual page tables to use large pages */
119             uint8_t use_giant_pages        : 1;    /* Enable virtual page tables to use giant (1GB) pages */
120             uint32_t rsvd                  : 30;
121         } __attribute__((packed));
122     } __attribute__((packed));
123
124
125     /* This structure is how we get interrupts for the guest */
126     struct v3_intr_core_state intr_core_state;
127
128     /* This structure is how we get exceptions for the guest */
129     struct v3_excp_state excp_state;
130
131
132     v3_cpu_mode_t cpu_mode;
133     v3_mem_mode_t mem_mode;
134
135
136     struct v3_gprs vm_regs;
137     struct v3_ctrl_regs ctrl_regs;
138     struct v3_dbg_regs dbg_regs;
139     struct v3_segments segments;
140     struct v3_msrs     msrs;
141
142     struct v3_fp_state fp_state;
143
144     // the arch-dependent state (SVM or VMX)
145     void * vmm_data;
146
147     uint64_t yield_start_cycle;
148     
149     uint64_t num_exits;
150
151 #ifdef V3_CONFIG_TELEMETRY
152     struct v3_core_telemetry core_telem;
153 #endif
154
155 #ifdef V3_CONFIG_PMU_TELEMETRY
156     struct v3_core_pmu_telemetry pmu_telem;
157 #endif
158
159 #ifdef V3_CONFIG_PWRSTAT_TELEMETRY
160     struct v3_core_pwrstat_telemetry pwrstat_telem;
161 #endif
162
163 #ifdef V3_CONFIG_MEM_TRACK
164     struct v3_core_mem_track memtrack_state;
165 #endif
166
167 #ifdef V3_CONFIG_HVM
168     struct v3_core_hvm  hvm_state;
169 #endif
170
171
172     /* struct v3_core_dev_mgr core_dev_mgr; */
173
174     void * decoder_state;
175
176 #ifdef V3_CONFIG_SYMBIOTIC
177     /* Symbiotic state */
178     struct v3_sym_core_state sym_core_state;
179 #endif
180
181     /* Per-core config tree data. */
182     v3_cfg_tree_t * core_cfg_data;
183
184     struct v3_vm_info * vm_info;
185
186     v3_core_operating_mode_t core_run_state;
187
188     void * core_thread; /* thread struct for virtual core */
189
190     /* the logical cpu on which this core runs */
191     uint32_t pcpu_id;
192     
193     /* The virtual core # of this cpu (what the guest sees this core as) */
194     uint32_t vcpu_id;
195
196 };
197
198
199
200 /* shared state across cores */
201 struct v3_vm_info {
202     char name[128];
203
204     v3_vm_class_t vm_class;
205     struct v3_fw_cfg_state fw_cfg_state;
206
207     // This is always the total RAM (addresses 0...mem_size)
208     // in the VM.  
209     // With an HVM, this is partitioned as per hvm_state
210     addr_t mem_size; /* In bytes for now */
211     uint32_t mem_align;
212     struct v3_mem_map mem_map;
213
214     struct v3_mem_hooks mem_hooks;
215
216     // arch-indepentent state of shadow pager
217     struct v3_shdw_impl_state shdw_impl;
218     // arch-independent state of passthrough pager (currently none)
219     struct v3_passthrough_impl_state passthrough_impl;
220     // arch-independent state of the nested pager
221     struct v3_nested_impl_state nested_impl;
222 #ifdef V3_CONFIG_SWAPPING
223     // swapping state, if enabled
224     struct v3_swap_impl_state swap_state;
225 #endif
226
227     void * sched_priv_data;
228
229     struct v3_io_map io_map;
230     struct v3_msr_map msr_map;
231     struct v3_cpuid_map cpuid_map;
232     struct v3_exit_map exit_map;
233     struct v3_event_map event_map;
234
235     v3_hypercall_map_t hcall_map;
236
237
238     struct v3_intr_routers intr_routers;
239
240     /* device_map */
241     struct vmm_dev_mgr  dev_mgr;
242
243     struct v3_time time_state;
244
245     struct v3_host_events host_event_hooks;
246
247     struct v3_config * cfg_data;
248
249     v3_vm_operating_mode_t run_state;
250
251     struct v3_barrier barrier;
252
253
254     struct v3_extensions extensions;
255
256     struct v3_perf_options perf_options;
257
258 #ifdef V3_CONFIG_SYMBIOTIC
259     /* Symbiotic state */
260     struct v3_sym_vm_state sym_vm_state;
261 #endif
262
263 #ifdef V3_CONFIG_TELEMETRY
264     uint_t enable_telemetry;
265     struct v3_telemetry_state telemetry;
266 #endif
267
268 #ifdef V3_CONFIG_MEM_TRACK
269     struct v3_vm_mem_track memtrack_state;
270 #endif
271
272 #ifdef V3_CONFIG_MULTIBOOT
273     struct v3_vm_multiboot  mb_state;
274 #endif
275
276 #ifdef V3_CONFIG_HVM
277     struct v3_vm_hvm  hvm_state;
278 #endif
279
280     // used to implement reset of regular VM and ROS
281     v3_counting_barrier_t  reset_barrier;
282
283     uint64_t yield_cycle_period;  
284
285
286     void * host_priv_data;
287
288     // This is always the total number of vcores in the VM 
289     // With an HVM, these are partitioned as per hvm_state
290     int num_cores;
291
292     int avail_cores; // Available logical cores
293
294     // JRL: This MUST be the last entry...
295     struct guest_info cores[0];
296 };
297
298 int v3_init_vm(struct v3_vm_info * vm);
299 int v3_init_core(struct guest_info * core);
300
301 int v3_free_vm_internal(struct v3_vm_info * vm);
302 int v3_free_core(struct guest_info * core);
303
304
305 uint_t v3_get_addr_width(struct guest_info * info);
306 v3_cpu_mode_t v3_get_vm_cpu_mode(struct guest_info * info);
307 v3_mem_mode_t v3_get_vm_mem_mode(struct guest_info * info);
308
309
310 const uchar_t * v3_cpu_mode_to_str(v3_cpu_mode_t mode);
311 const uchar_t * v3_mem_mode_to_str(v3_mem_mode_t mode);
312
313
314
315 #endif /* ! __V3VEE__ */
316
317
318
319 #endif