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.


Add Virtual PCI and Virtual NIC
[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
152 // uint_t V3_CPU_KHZ();
153 #define V3_CPU_KHZ()                                    \
154   ({                                                    \
155     unsigned int khz = 0;                               \
156     extern struct v3_os_hooks * os_hooks;               \
157     if ((os_hooks) && (os_hooks)->get_cpu_khz) {        \
158       khz = (os_hooks)->get_cpu_khz();                  \
159     }                                                   \
160     khz;                                                \
161   })                                                    \
162     
163
164
165 #define V3_Hook_Interrupt(irq, opaque)                          \
166   ({                                                            \
167     int ret = 0;                                                \
168     extern struct v3_os_hooks * os_hooks;                       \
169     if ((os_hooks) && (os_hooks)->hook_interrupt) {             \
170       ret = (os_hooks)->hook_interrupt(irq, opaque);            \
171     }                                                           \
172     ret;                                                        \
173   })                                                            \
174
175 #define V3_Yield(addr)                                  \
176   do {                                                  \
177     extern struct v3_os_hooks * os_hooks;               \
178     if ((os_hooks) && (os_hooks)->yield_cpu) {          \
179       (os_hooks)->yield_cpu();                          \
180     }                                                   \
181   } while (0)                                           \
182
183
184
185
186
187 /* ** */
188
189 #define V3_ASSERT(x)                                                    \
190   do {                                                                  \
191     if (!(x)) {                                                         \
192       PrintDebug("Failed assertion in %s: %s at %s, line %d, RA=%lx\n", \
193                  __func__, #x, __FILE__, __LINE__,                      \
194                  (ulong_t) __builtin_return_address(0));                \
195       while(1);                                                         \
196     }                                                                   \
197   } while(0)                                                            \
198     
199
200 #define V3_REGISTER_PKT_DELIVERY(x) \
201   ({\
202     int ret = 0;\
203     extern struct v3_os_hooks * os_hooks;               \
204     if ((os_hooks) && (os_hooks)->register_pkt_delivery) {              \
205      ret = (os_hooks)->register_pkt_delivery(x);                                \
206     }\
207     ret; \
208   } )           
209
210 #define V3_SEND_PKT(x, y) \
211   ({\
212     int ret=0; \
213     extern struct v3_os_hooks * os_hooks;               \
214     if ((os_hooks) && (os_hooks)->ne2k_send_packet) {           \
215       ret = (os_hooks)->ne2k_send_packet(x, y);                         \
216     }\
217     ret; \
218   })
219   
220
221 #define VMM_INVALID_CPU 0
222 #define VMM_VMX_CPU 1
223 #define VMM_SVM_CPU 2
224
225
226 // Maybe make this a define....
227 typedef enum v3_cpu_arch {V3_INVALID_CPU, V3_SVM_CPU, V3_SVM_REV3_CPU, V3_VMX_CPU} v3_cpu_arch_t;
228
229
230 #endif //!__V3VEE__
231
232
233
234 struct guest_info;
235
236 /* This will contain function pointers that provide OS services */
237 struct v3_os_hooks {
238   void (*print_info)(const char * format, ...)
239         __attribute__ ((format (printf, 1, 2)));
240   void (*print_debug)(const char * format, ...)
241         __attribute__ ((format (printf, 1, 2)));
242   void (*print_trace)(const char * format, ...)
243         __attribute__ ((format (printf, 1, 2)));
244   
245   void *(*allocate_pages)(int numPages);
246   void (*free_page)(void * page);
247
248   void *(*malloc)(unsigned int size);
249   void (*free)(void * addr);
250
251   void *(*paddr_to_vaddr)(void *addr);
252   void *(*vaddr_to_paddr)(void *addr);
253
254   //  int (*hook_interrupt)(struct guest_info *s, int irq);
255
256   int (*hook_interrupt)(struct guest_info * vm, unsigned int irq);
257
258   int (*ack_irq)(int irq);
259
260
261   unsigned int (*get_cpu_khz)(void);
262
263
264   void (*start_kernel_thread)(void); // include pointer to function
265
266   void (*yield_cpu)(void);
267
268   //function by network card driver
269   int (*register_pkt_delivery)(int (*rcvd_fn)(uchar_t *packet, uint_t size));
270   int (*ne2k_send_packet)(uchar_t *packet, uint_t size);
271  
272 };
273
274
275 struct v3_vm_config {
276   void * rombios;
277   int rombios_size;
278
279   void * vgabios;
280   int vgabios_size;
281
282   unsigned long mem_size; // in bytes, var should be natural size of cpu
283                           // so we can specify maximum physical address size
284                           // (We're screwed if we want to do 32 bit host/64 bit guest)
285
286
287   int enable_profiling;
288
289   int use_ramdisk;
290   void * ramdisk;
291   int ramdisk_size;
292 };
293
294
295
296 /* This will contain Function pointers that control the VMs */
297 struct v3_ctrl_ops {
298   struct guest_info *(*allocate_guest)(void);
299
300   int (*config_guest)(struct guest_info * info, struct v3_vm_config * config_ptr);
301   int (*init_guest)(struct guest_info * info);
302   int (*start_guest)(struct guest_info * info);
303   //  int (*stop_vm)(uint_t vm_id);
304
305   int (*has_nested_paging)(void);
306
307   //  v3_cpu_arch_t (*get_cpu_arch)();
308 };
309
310
311
312
313 //
314 //
315 // This is the interrupt state that the VMM's interrupt handlers need to see
316 //
317 struct v3_interrupt {
318   unsigned int irq;
319   unsigned int error;
320
321   unsigned int should_ack;  // Should the vmm ack this interrupt, or will
322                       // the host OS do it?
323 };
324
325
326
327
328 void Init_V3(struct v3_os_hooks * hooks, struct v3_ctrl_ops * vmm_ops);
329
330 int v3_deliver_irq(struct guest_info * vm, struct v3_interrupt * intr);
331 int v3_deliver_keyboard_evt(struct guest_info * vm);
332
333
334 #endif