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.


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