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.


reformatting include files
[palacios.git] / palacios / include / palacios / vmm.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 __VMM_H__
21 #define __VMM_H__
22
23
24 #include <palacios/vm_guest.h>
25 #include <palacios/vmm_mem.h>
26 #include <palacios/vmm_types.h>
27 #include <devices/vnic.h>
28
29
30 #ifdef __V3VEE__
31
32 //#include <palacios/vmm_types.h>
33 #include <palacios/vmm_string.h>
34
35
36 //#include <palacios/vmm_paging.h>
37
38 /* utility definitions */
39
40
41 #define PrintDebug(fmt, args...)                        \
42     do {                                                \
43         extern struct v3_os_hooks * os_hooks;           \
44         if ((os_hooks) && (os_hooks)->print_debug) {    \
45             (os_hooks)->print_debug((fmt), ##args);     \
46         }                                               \
47     } while (0)                                         
48
49 #if 1
50 #else
51 #define PrintDebug(fmt,args ...)
52 #endif
53
54
55
56 #define PrintError(fmt, args...)                                        \
57     do {                                                                \
58         extern struct v3_os_hooks * os_hooks;                           \
59         if ((os_hooks) && (os_hooks)->print_debug) {                    \
60             (os_hooks)->print_debug("%s(%d): " fmt, __FILE__, __LINE__, ##args); \
61         }                                                               \
62     } while (0)                                         
63
64
65
66 #ifdef VMM_INFO
67 #define PrintInfo(fmt, args...)                         \
68     do {                                                \
69         extern struct v3_os_hooks * os_hooks;           \
70         if ((os_hooks) && (os_hooks)->print_info) {     \
71             (os_hooks)->print_info((fmt), ##args);      \
72         }                                               \
73     } while (0)                                         
74 #else
75 #define PrintInfo(fmt, args...)
76 #endif
77
78
79 #ifdef VMM_TRACE
80 #define PrintTrace(fmt, args...)                        \
81     do {                                                \
82         extern struct v3_os_hooks * os_hooks;           \
83         if ((os_hooks) && (os_hooks)->print_trace) {    \
84             (os_hooks)->print_trace(fmt, ##args);       \
85         }                                               \
86     } while (0)                                         
87 #else
88 #define PrintTrace(fmt, args...)
89 #endif
90
91
92 #define V3_AllocPages(num_pages)                                \
93     ({                                                          \
94         extern struct v3_os_hooks * os_hooks;                   \
95         void * ptr = 0;                                         \
96         if ((os_hooks) && (os_hooks)->allocate_pages) {         \
97             ptr = (os_hooks)->allocate_pages(num_pages);        \
98         }                                                       \
99         ptr;                                                    \
100     })
101
102
103 #define V3_FreePage(page)                               \
104     do {                                                \
105         extern struct v3_os_hooks * os_hooks;           \
106         if ((os_hooks) && (os_hooks)->free_page) {      \
107             (os_hooks)->free_page(page);                \
108         }                                               \
109     } while(0)
110
111
112 #define V3_VAddr(addr) ({                                       \
113             extern struct v3_os_hooks * os_hooks;               \
114             void * var = 0;                                     \
115             if ((os_hooks) && (os_hooks)->paddr_to_vaddr) {     \
116                 var = (os_hooks)->paddr_to_vaddr(addr);         \
117             }                                                   \
118             var;                                                \
119         })
120
121
122 #define V3_PAddr(addr) ({                                       \
123             extern struct v3_os_hooks * os_hooks;               \
124             void * var = 0;                                     \
125             if ((os_hooks) && (os_hooks)->vaddr_to_paddr) {     \
126                 var = (os_hooks)->vaddr_to_paddr(addr);         \
127             }                                                   \
128             var;                                                \
129         })
130
131
132
133 #define V3_Malloc(size) ({                              \
134             extern struct v3_os_hooks * os_hooks;       \
135             void * var = 0;                             \
136             if ((os_hooks) && (os_hooks)->malloc) {     \
137                 var = (os_hooks)->malloc(size);         \
138             }                                           \
139             var;                                        \
140         })
141
142 // We need to check the hook structure at runtime to ensure its SAFE
143 #define V3_Free(addr)                           \
144     do {                                        \
145         extern struct v3_os_hooks * os_hooks;   \
146         if ((os_hooks) && (os_hooks)->free) {   \
147             (os_hooks)->free(addr);             \
148         }                                       \
149     } while (0)
150
151 // uint_t V3_CPU_KHZ();
152 #define V3_CPU_KHZ() ({                                                 \
153             unsigned int khz = 0;                                       \
154             extern struct v3_os_hooks * os_hooks;                       \
155             if ((os_hooks) && (os_hooks)->get_cpu_khz) {                \
156                 khz = (os_hooks)->get_cpu_khz();                        \
157             }                                                           \
158             khz;                                                        \
159         })                                                              \
160         
161
162
163 #define V3_Hook_Interrupt(irq, opaque) ({                               \
164             int ret = 0;                                                \
165             extern struct v3_os_hooks * os_hooks;                       \
166             if ((os_hooks) && (os_hooks)->hook_interrupt) {             \
167                 ret = (os_hooks)->hook_interrupt(irq, opaque);          \
168             }                                                           \
169             ret;                                                        \
170         })                                                              \
171         
172 #define V3_Yield(addr)                                  \
173     do {                                                \
174         extern struct v3_os_hooks * os_hooks;           \
175         if ((os_hooks) && (os_hooks)->yield_cpu) {      \
176             (os_hooks)->yield_cpu();                    \
177         }                                               \
178     } while (0)                                         \
179                                                         \
180                                                         \
181                                                         \
182                                                         \
183                                                         \
184 /* ** */
185
186 #define V3_ASSERT(x)                                                    \
187     do {                                                                \
188         if (!(x)) {                                                     \
189             PrintDebug("Failed assertion in %s: %s at %s, line %d, RA=%lx\n", \
190                        __func__, #x, __FILE__, __LINE__,                \
191                        (ulong_t) __builtin_return_address(0));          \
192             while(1);                                                   \
193         }                                                               \
194     } while(0)                                                          \
195         
196
197 #define V3_REGISTER_PKT_DELIVERY(x) ({                                  \
198             int ret = 0;                                                \
199             extern struct v3_os_hooks * os_hooks;                       \
200             if ((os_hooks) && (os_hooks)->register_pkt_delivery) {      \
201                 ret = (os_hooks)->register_pkt_delivery(x);             \
202             }                                                           \
203             ret;                                                        \
204         })
205
206 #define V3_SEND_PKT(x, y) ({                                    \
207             int ret = 0;                                        \
208             extern struct v3_os_hooks * os_hooks;               \
209             if ((os_hooks) && (os_hooks)->ne2k_send_packet) {   \
210                 ret = (os_hooks)->ne2k_send_packet(x, y);       \
211             }                                                   \
212             ret;                                                \
213         })
214
215
216 #define VMM_INVALID_CPU 0
217 #define VMM_VMX_CPU 1
218 #define VMM_SVM_CPU 2
219
220
221 // Maybe make this a define....
222 typedef enum v3_cpu_arch {V3_INVALID_CPU, V3_SVM_CPU, V3_SVM_REV3_CPU, V3_VMX_CPU} v3_cpu_arch_t;
223
224
225 #endif //!__V3VEE__
226
227
228
229 struct guest_info;
230
231 /* This will contain function pointers that provide OS services */
232 struct v3_os_hooks {
233     void (*print_info)(const char * format, ...)
234         __attribute__ ((format (printf, 1, 2)));
235     void (*print_debug)(const char * format, ...)
236         __attribute__ ((format (printf, 1, 2)));
237     void (*print_trace)(const char * format, ...)
238         __attribute__ ((format (printf, 1, 2)));
239   
240     void *(*allocate_pages)(int numPages);
241     void (*free_page)(void * page);
242
243     void *(*malloc)(unsigned int size);
244     void (*free)(void * addr);
245
246     void *(*paddr_to_vaddr)(void *addr);
247     void *(*vaddr_to_paddr)(void *addr);
248
249     //  int (*hook_interrupt)(struct guest_info *s, int irq);
250
251     int (*hook_interrupt)(struct guest_info * vm, unsigned int irq);
252
253     int (*ack_irq)(int irq);
254
255
256     unsigned int (*get_cpu_khz)(void);
257
258
259     void (*start_kernel_thread)(void); // include pointer to function
260
261     void (*yield_cpu)(void);
262
263     //function by network card driver
264     int (*register_pkt_delivery)(int (*rcvd_fn)(uchar_t *packet, uint_t size));
265     int (*ne2k_send_packet)(uchar_t *packet, uint_t size);
266  
267 };
268
269
270 struct v3_vm_config {
271     void * rombios;
272     int rombios_size;
273
274     void * vgabios;
275     int vgabios_size;
276
277     unsigned long mem_size; // in bytes, var should be natural size of cpu
278     // so we can specify maximum physical address size
279     // (We're screwed if we want to do 32 bit host/64 bit guest)
280
281
282     int enable_profiling;
283
284     int use_ramdisk;
285     void * ramdisk;
286     int ramdisk_size;
287 };
288
289
290
291 /* This will contain Function pointers that control the VMs */
292 struct v3_ctrl_ops {
293     struct guest_info *(*allocate_guest)(void);
294
295     int (*config_guest)(struct guest_info * info, struct v3_vm_config * config_ptr);
296     int (*init_guest)(struct guest_info * info);
297     int (*start_guest)(struct guest_info * info);
298     //  int (*stop_vm)(uint_t vm_id);
299
300     int (*has_nested_paging)(void);
301
302     //  v3_cpu_arch_t (*get_cpu_arch)();
303 };
304
305
306
307
308 //
309 //
310 // This is the interrupt state that the VMM's interrupt handlers need to see
311 //
312 struct v3_interrupt {
313     unsigned int irq;
314     unsigned int error;
315
316     unsigned int should_ack;  // Should the vmm ack this interrupt, or will
317     // the host OS do it?
318 };
319
320
321
322
323 void Init_V3(struct v3_os_hooks * hooks, struct v3_ctrl_ops * vmm_ops);
324
325 int v3_deliver_irq(struct guest_info * vm, struct v3_interrupt * intr);
326 int v3_deliver_keyboard_evt(struct guest_info * vm);
327
328
329 #endif