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.


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