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.


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