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.


fixed a ton of compile errors
[palacios.git] / palacios / src / palacios / vmm_config.c
1 #include <palacios/vmm_config.h>
2 #include <palacios/vmm.h>
3 #include <palacios/vmm_debug.h>
4
5
6 #include <devices/serial.h>
7 #include <devices/keyboard.h>
8 #include <devices/8259a.h>
9 #include <devices/8254.h>
10 #include <devices/nvram.h>
11 #include <devices/generic.h>
12
13
14
15 static int mem_test_read(addr_t guest_addr, void * dst, uint_t length, void * priv_data) {
16   int foo = 20;
17
18
19   memcpy(dst, &foo, length);
20
21   PrintDebug("Passthrough mem read returning: %d (length=%d)\n", foo + (guest_addr & 0xfff), length);
22   return length;
23 }
24
25 static int passthrough_mem_read(addr_t guest_addr, void * dst, uint_t length, void * priv_data) {
26     memcpy(dst, (void*)guest_addr, length);
27     return length;
28 }
29
30 static int passthrough_mem_write(addr_t guest_addr, void * src, uint_t length, void * priv_data) {
31   memcpy((void*)guest_addr, src, length);
32   return length;
33 }
34
35
36 /*static int IO_Read(ushort_t port, void * dst, uint_t length, void * priv_data) {
37
38   struct guest_info * info = priv_data;
39   ulong_t tsc_spread = 0;
40   ullong_t exit_tsc = 0;
41
42   
43   *(ulong_t *)(&exit_tsc) = info->vm_regs.rbx;
44   *(ulong_t *)((&exit_tsc) + 4) = info->vm_regs.rcx; 
45   tsc_spread = info->exit_tsc - exit_tsc;
46   
47   PrintError("IOREAD tsc diff = %lu\n",tsc_spread); 
48   info->rip += 3;
49
50
51   return 1;
52 }
53 */
54
55 int config_guest(struct guest_info * info, void * config_ptr) {
56
57   struct guest_mem_layout * layout = (struct guest_mem_layout *)config_ptr;
58   extern v3_cpu_arch_t v3_cpu_type;
59   void * region_start;
60   int i;
61
62   
63   v3_init_time(info);
64   init_shadow_map(info);
65   
66   if (v3_cpu_type == V3_SVM_REV3_CPU) {
67     info->shdw_pg_mode = NESTED_PAGING;
68   } else {
69     init_shadow_page_state(info);
70     info->shdw_pg_mode = SHADOW_PAGING;
71   }
72   
73   info->cpu_mode = REAL;
74   info->mem_mode = PHYSICAL_MEM;
75   
76  
77   init_vmm_io_map(info);
78   init_interrupt_state(info);
79   
80   dev_mgr_init(info);
81
82   init_emulator(info);
83   
84  
85   //     SerialPrint("Guest Mem Dump at 0x%x\n", 0x100000);
86   //PrintDebugMemDump((unsigned char *)(0x100000), 261 * 1024);
87   if (layout->magic != MAGIC_CODE) {
88     
89     PrintDebug("Layout Magic Mismatch (0x%x)\n", layout->magic);
90     return -1;
91   }
92   
93   PrintDebug("%d layout regions\n", layout->num_regions);
94   
95   region_start = (void *)&(layout->regions[layout->num_regions]);
96   
97   PrintDebug("region start = 0x%x\n", region_start);
98   
99   for (i = 0; i < layout->num_regions; i++) {
100     struct layout_region * reg = &(layout->regions[i]);
101     uint_t num_pages = (reg->length / PAGE_SIZE) + ((reg->length % PAGE_SIZE) ? 1 : 0);
102     void * guest_mem = V3_AllocPages(num_pages);
103     
104     PrintDebug("Layout Region %d bytes\n", reg->length);
105     memcpy(guest_mem, region_start, reg->length);
106     
107     PrintDebugMemDump((unsigned char *)(guest_mem), 16);
108     
109     add_shadow_region_passthrough(info, reg->final_addr, reg->final_addr + (num_pages * PAGE_SIZE), (addr_t)guest_mem);
110     
111     PrintDebug("Adding Shadow Region (0x%x-0x%x) -> 0x%x\n", reg->final_addr, reg->final_addr + (num_pages * PAGE_SIZE), guest_mem);
112     
113     region_start += reg->length;
114   }
115   
116       //     
117   add_shadow_region_passthrough(info, 0x0, 0xa0000, (addr_t)V3_AllocPages(160));
118   
119   if (1) {
120     add_shadow_region_passthrough(info, 0xa0000, 0xc0000, 0xa0000); 
121   } else {
122     hook_guest_mem(info, 0xa0000, 0xc0000, passthrough_mem_read, passthrough_mem_write, NULL);
123   }  
124   
125   // TEMP
126   //add_shadow_region_passthrough(info, 0xc0000, 0xc8000, 0xc0000);
127   
128   if (1) {
129     add_shadow_region_passthrough(info, 0xc7000, 0xc8000, (addr_t)V3_AllocPages(1));
130     if (add_shadow_region_passthrough(info, 0xc8000, 0xf0000, (addr_t)V3_AllocPages(40)) == -1) {
131       PrintDebug("Error adding shadow region\n");
132     }
133   } else {
134     add_shadow_region_passthrough(info, 0xc0000, 0xc8000, 0xc0000);
135     add_shadow_region_passthrough(info, 0xc8000, 0xf0000, 0xc8000);
136   }
137   
138   
139   if (1) {
140   add_shadow_region_passthrough(info, 0x100000, 0x1000000, (addr_t)V3_AllocPages(4096));
141   } else {
142     /* MEMORY HOOK TEST */
143     add_shadow_region_passthrough(info, 0x100000, 0xa00000, (addr_t)V3_AllocPages(2304));
144     hook_guest_mem(info, 0xa00000, 0xa01000, mem_test_read, passthrough_mem_write, NULL); 
145     add_shadow_region_passthrough(info, 0xa01000, 0x1000000, (addr_t)V3_AllocPages(1791));
146   }
147
148     add_shadow_region_passthrough(info, 0x1000000, 0x8000000, (addr_t)V3_AllocPages(32768));
149  
150   // test - give linux accesss to PCI space - PAD
151   add_shadow_region_passthrough(info, 0xc0000000,0xffffffff,0xc0000000);
152   
153   
154   print_shadow_map(&(info->mem_map));
155
156   
157   {
158     
159     struct vm_device * nvram = create_nvram();
160     //struct vm_device * timer = create_timer();
161     struct vm_device * pic = create_pic();
162     struct vm_device * keyboard = create_keyboard();
163     struct vm_device * pit = create_pit(); 
164     //struct vm_device * serial = create_serial();
165     
166     
167 #define GENERIC 1
168     
169 #if GENERIC
170     generic_port_range_type range[] = {
171 #if 1
172       // Make the DMA controller invisible
173
174       {0x00, 0x07, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channels 0,1,2,3 (address, counter)
175       {0xc0, 0xc7, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channels 4,5,6,7 (address, counter)
176       {0x87, 0x87, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 0 page register
177       {0x83, 0x83, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 1 page register
178       {0x81, 0x81, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 2 page register
179       {0x82, 0x82, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 3 page register
180       {0x8f, 0x8f, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 4 page register
181       {0x8b, 0x8b, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 5 page register
182       {0x89, 0x89, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 6 page register
183       {0x8a, 0x8a, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 7 page register
184       {0x08, 0x0f, GENERIC_PRINT_AND_IGNORE},   // DMA 1 misc registers (csr, req, smask,mode,clearff,reset,enable,mmask)
185       {0xd0, 0xde, GENERIC_PRINT_AND_IGNORE},   // DMA 2 misc registers
186 #endif
187       
188
189 #if 1      
190       // Make the Serial ports invisible 
191
192       {0x3f8, 0x3f8+7, GENERIC_PRINT_AND_IGNORE},      // COM 1
193       {0x2f8, 0x2f8+7, GENERIC_PRINT_AND_IGNORE},      // COM 2
194       {0x3e8, 0x3e8+7, GENERIC_PRINT_AND_IGNORE},      // COM 3
195       {0x2e8, 0x2e8+7, GENERIC_PRINT_AND_IGNORE},      // COM 4
196 #endif
197
198
199 #if 1
200       // Make the PCI bus invisible (at least it's configuration)
201
202       {0xcf8, 0xcf8, GENERIC_PRINT_AND_IGNORE}, // PCI Config Address
203       {0xcfc, 0xcfc, GENERIC_PRINT_AND_IGNORE}, // PCI Config Data
204 #endif
205  
206 #if 1
207
208       // Monitor the IDE controllers (very slow)
209
210       {0x170, 0x178, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 1
211       {0x376, 0x377, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 1
212       {0x1f0, 0x1f8, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 0
213       {0x3f6, 0x3f7, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 0
214 #endif
215       
216
217 #if 0
218
219       // Make the floppy controllers invisible
220
221       {0x3f0, 0x3f2, GENERIC_PRINT_AND_IGNORE}, // Primary floppy controller (base,statusa/statusb,DOR)
222       {0x3f4, 0x3f5, GENERIC_PRINT_AND_IGNORE}, // Primary floppy controller (mainstat/datarate,data)
223       {0x3f7, 0x3f7, GENERIC_PRINT_AND_IGNORE}, // Primary floppy controller (DIR)
224       {0x370, 0x372, GENERIC_PRINT_AND_IGNORE}, // Secondary floppy controller (base,statusa/statusb,DOR)
225       {0x374, 0x375, GENERIC_PRINT_AND_IGNORE}, // Secondary floppy controller (mainstat/datarate,data)
226       {0x377, 0x377, GENERIC_PRINT_AND_IGNORE}, // Secondary floppy controller (DIR)
227       
228 #endif
229
230 #if 1
231
232       // Make the parallel port invisible
233       
234       {0x378, 0x37f, GENERIC_PRINT_AND_IGNORE},
235
236 #endif
237
238 #if 1
239
240       // Monitor graphics card operations
241
242       {0x3b0, 0x3bb, GENERIC_PRINT_AND_PASSTHROUGH},
243       {0x3c0, 0x3df, GENERIC_PRINT_AND_PASSTHROUGH},
244       
245 #endif
246
247
248 #if 1
249       // Make the ISA PNP features invisible
250
251       {0x274, 0x277, GENERIC_PRINT_AND_IGNORE},
252       {0x279, 0x279, GENERIC_PRINT_AND_IGNORE},
253       {0xa79, 0xa79, GENERIC_PRINT_AND_IGNORE},
254 #endif
255
256
257 #if 1
258       // Monitor any network card (realtek ne2000) operations 
259       {0xc100, 0xc1ff, GENERIC_PRINT_AND_PASSTHROUGH},
260 #endif
261
262
263 #if 1
264       // Make any Bus master ide controller invisible
265       
266       {0xc000, 0xc00f, GENERIC_PRINT_AND_IGNORE},
267 #endif
268
269
270       //          {0x378, 0x400, GENERIC_PRINT_AND_IGNORE}
271       
272       {0,0,0},  // sentinal - must be last
273       
274     };
275     
276
277     struct vm_device * generic = create_generic(range, NULL, NULL);
278     
279 #endif
280     
281     v3_attach_device(info, nvram);
282     //v3_attach_device(info, timer);
283     v3_attach_device(info, pic);
284     v3_attach_device(info, pit);
285     v3_attach_device(info, keyboard);
286     // v3_attach_device(info, serial);
287
288
289 #if GENERIC
290     // Important that this be attached last!
291     v3_attach_device(info, generic);
292     
293 #endif
294     
295     PrintDebugDevMgr(info);
296   }
297   
298   // give keyboard interrupts to vm
299   // no longer needed since we have a keyboard device
300   //hook_irq(&vm_info, 1);
301   
302 #if 1
303   // give floppy controller to vm
304   v3_hook_irq_for_guest_injection(info, 6);
305 #endif
306   
307 #if 1
308   //primary ide
309   v3_hook_irq_for_guest_injection(info, 14);
310   
311   // secondary ide
312   v3_hook_irq_for_guest_injection(info, 15);
313 #endif
314   
315
316   //v3_hook_io_port(info, 1234, &IO_Read, NULL, info);
317
318   info->rip = 0xfff0;
319   info->vm_regs.rsp = 0x0;
320   
321
322   return 0;
323 }
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346 #if 0
347
348     
349     if (0) {
350       
351       //    add_shared_mem_range(&(vm_info.mem_layout), 0, 0x800000, 0x10000);    
352       //    add_shared_mem_range(&(vm_info.mem_layout), 0, 0x1000000, 0);
353       
354       rip = (ulong_t)(void*)&BuzzVM;
355       //  rip -= 0x10000;
356       //    rip = (addr_t)(void*)&exit_test;
357       //  rip -= 0x2000;
358       vm_info.rip = rip;
359       rsp = (addr_t)Alloc_Page();
360       
361       vm_info.vm_regs.rsp = (rsp +4092 );// - 0x2000;
362       
363             
364     } else if (0) {
365       //add_shared_mem_range(&(vm_info.mem_layout), 0x0, 0x1000, 0x100000);
366       //      add_shared_mem_range(&(vm_info.mem_layout), 0x0, 0x100000, 0x0);
367       
368       /*
369         shadow_region_t *ent = Malloc(sizeof(shadow_region_t));;
370         init_shadow_region_physical(ent,0,0x100000,GUEST_REGION_PHYSICAL_MEMORY,
371         0x100000, HOST_REGION_PHYSICAL_MEMORY);
372         add_shadow_region(&(vm_info.mem_map),ent);
373       */
374
375       add_shadow_region_passthrough(&vm_info, 0x0, 0x100000, 0x100000);
376
377       v3_hook_io_port(&vm_info, 0x61, &IO_Read, &IO_Write, NULL);
378       v3_hook_io_port(&vm_info, 0x05, &IO_Read, &IO_Write_to_Serial, NULL);
379       
380
381
382       /*
383         vm_info.cr0 = 0;
384         vm_info.cs.base=0xf000;
385         vm_info.cs.limit=0xffff;
386       */
387       //vm_info.rip = 0xfff0;
388
389       vm_info.rip = 0;
390       vm_info.vm_regs.rsp = 0x0;
391     } else {
392    
393     }
394
395 #endif