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.


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