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