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.


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