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.


fixed all the printf style warnings/errors
[palacios.git] / palacios / src / palacios / vmm_config.c
1 /* 
2  * This file is part of the Palacios Virtual Machine Monitor developed
3  * by the V3VEE Project with funding from the United States National 
4  * Science Foundation and the Department of Energy.  
5  *
6  * The V3VEE Project is a joint project between Northwestern University
7  * and the University of New Mexico.  You can find out more at 
8  * http://www.v3vee.org
9  *
10  * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> 
11  * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org> 
12  * All rights reserved.
13  *
14  * Author: Jack Lange <jarusl@cs.northwestern.edu>
15  *
16  * This is free software.  You are permitted to use,
17  * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
18  */
19
20 #include <palacios/vmm_config.h>
21 #include <palacios/vmm.h>
22 #include <palacios/vmm_debug.h>
23
24
25 #include <devices/serial.h>
26 #include <devices/keyboard.h>
27 #include <devices/8259a.h>
28 #include <devices/8254.h>
29 #include <devices/nvram.h>
30 #include <devices/generic.h>
31 #include <devices/ramdisk.h>
32 #include <devices/cdrom.h>
33 #include <devices/bochs_debug.h>
34
35
36 #include <palacios/vmm_host_events.h>
37
38 #define USE_GENERIC 1
39
40
41 #define ROMBIOS_START 0x000f0000
42 #define VGABIOS_START 0x000c0000
43
44
45
46
47 static int mem_test_read(addr_t guest_addr, void * dst, uint_t length, void * priv_data) {
48   int foo = 20;
49
50
51   memcpy(dst, &foo, length);
52
53   PrintDebug("Passthrough mem read returning: %p (length=%d)\n", (void *)(foo + (guest_addr & 0xfff)), length);
54   return length;
55 }
56
57 static int passthrough_mem_read(addr_t guest_addr, void * dst, uint_t length, void * priv_data) {
58     memcpy(dst, (void*)guest_addr, length);
59     return length;
60 }
61
62 static int passthrough_mem_write(addr_t guest_addr, void * src, uint_t length, void * priv_data) {
63   memcpy((void*)guest_addr, src, length);
64   return length;
65 }
66
67
68
69 int v3_config_guest(struct guest_info * info, struct v3_vm_config * config_ptr) {
70   extern v3_cpu_arch_t v3_cpu_type;
71
72
73   int use_ramdisk = config_ptr->use_ramdisk;
74   int use_generic = USE_GENERIC;
75
76
77   v3_init_time(info);
78   init_shadow_map(info);
79   
80   if (v3_cpu_type == V3_SVM_REV3_CPU) {
81     info->shdw_pg_mode = NESTED_PAGING;
82   } else {
83     v3_init_shadow_page_state(info);
84     info->shdw_pg_mode = SHADOW_PAGING;
85   }
86   
87   info->cpu_mode = REAL;
88   info->mem_mode = PHYSICAL_MEM;
89   
90  
91   v3_init_vmm_io_map(info);
92   v3_init_interrupt_state(info);
93   
94   v3_init_dev_mgr(info);
95
96   v3_init_emulator(info);
97   
98   v3_init_host_events(info);
99
100  
101
102   /* layout rombios */
103   {
104     uint_t num_pages = (config_ptr->rombios_size + PAGE_SIZE - 1) / PAGE_SIZE;
105     void * guest_mem =  V3_AllocPages(num_pages);
106
107     PrintDebug("Layout Region %d bytes\n", config_ptr->rombios_size);
108     memcpy(V3_VAddr(guest_mem), config_ptr->rombios, config_ptr->rombios_size);
109
110     add_shadow_region_passthrough(info, ROMBIOS_START, ROMBIOS_START + (num_pages * PAGE_SIZE), (addr_t)guest_mem);
111     
112     PrintDebug("Adding Shadow Region (0x%p-0x%p) -> 0x%p\n", 
113                (void *)ROMBIOS_START, 
114                (void *)ROMBIOS_START + (num_pages * PAGE_SIZE), 
115                (void *)guest_mem);
116   }
117
118
119   /* layout vgabios */
120   {
121     uint_t num_pages = (config_ptr->vgabios_size + PAGE_SIZE - 1) / PAGE_SIZE;
122     void * guest_mem =  V3_AllocPages(num_pages);
123
124     PrintDebug("Layout Region %d bytes\n", config_ptr->vgabios_size);
125     memcpy(V3_VAddr(guest_mem), config_ptr->vgabios, config_ptr->vgabios_size);
126
127     add_shadow_region_passthrough(info, VGABIOS_START, VGABIOS_START + (num_pages * PAGE_SIZE), (addr_t)guest_mem);
128     
129     PrintDebug("Adding Shadow Region (0x%p-0x%p) -> 0x%p\n", 
130                (void *)VGABIOS_START, 
131                (void *)VGABIOS_START + (num_pages * PAGE_SIZE), 
132                (void *)guest_mem);
133   }
134
135       //     
136   add_shadow_region_passthrough(info, 0x0, 0xa0000, (addr_t)V3_AllocPages(160));
137   
138   if (1) {
139     add_shadow_region_passthrough(info, 0xa0000, 0xc0000, 0xa0000); 
140   } else {
141     hook_guest_mem(info, 0xa0000, 0xc0000, passthrough_mem_read, passthrough_mem_write, NULL);
142   }  
143   
144   // TEMP
145   //add_shadow_region_passthrough(info, 0xc0000, 0xc8000, 0xc0000);
146   
147   if (1) {
148     add_shadow_region_passthrough(info, 0xc7000, 0xc8000, (addr_t)V3_AllocPages(1));
149     if (add_shadow_region_passthrough(info, 0xc8000, 0xf0000, (addr_t)V3_AllocPages(40)) == -1) {
150       PrintDebug("Error adding shadow region\n");
151     }
152   } else {
153     add_shadow_region_passthrough(info, 0xc0000, 0xc8000, 0xc0000);
154     add_shadow_region_passthrough(info, 0xc8000, 0xf0000, 0xc8000);
155   }
156   
157   
158   if (1) {
159   add_shadow_region_passthrough(info, 0x100000, 0x1000000, (addr_t)V3_AllocPages(4096));
160   } else {
161     /* MEMORY HOOK TEST */
162     add_shadow_region_passthrough(info, 0x100000, 0xa00000, (addr_t)V3_AllocPages(2304));
163     hook_guest_mem(info, 0xa00000, 0xa01000, mem_test_read, passthrough_mem_write, NULL); 
164     add_shadow_region_passthrough(info, 0xa01000, 0x1000000, (addr_t)V3_AllocPages(1791));
165   }
166
167     add_shadow_region_passthrough(info, 0x1000000, 0x8000000, (addr_t)V3_AllocPages(32768));
168  
169   // test - give linux accesss to PCI space - PAD
170   add_shadow_region_passthrough(info, 0xc0000000,0xffffffff,0xc0000000);
171   
172   
173   print_shadow_map(&(info->mem_map));
174   
175   {
176     struct vm_device * ramdisk = NULL;
177     struct vm_device * cdrom = NULL;
178     struct vm_device * nvram = v3_create_nvram();
179     //struct vm_device * timer = v3_create_timer();
180     struct vm_device * pic = v3_create_pic();
181     struct vm_device * keyboard = v3_create_keyboard();
182     struct vm_device * pit = v3_create_pit(); 
183     struct vm_device * bochs_debug = v3_create_bochs_debug();
184
185     //struct vm_device * serial = v3_create_serial();
186     struct vm_device * generic = NULL;
187
188
189
190
191     if (use_ramdisk) {
192       PrintDebug("Creating Ramdisk\n");
193       ramdisk = v3_create_ramdisk();
194       cdrom = v3_create_cdrom(ramdisk, config_ptr->ramdisk, config_ptr->ramdisk_size); 
195     }
196     
197     
198     if (use_generic) {
199       PrintDebug("Creating Generic Device\n");
200       generic = v3_create_generic();
201       
202       // Make the DMA controller invisible
203       v3_generic_add_port_range(generic, 0x00, 0x07, GENERIC_PRINT_AND_IGNORE);   // DMA 1 channels 0,1,2,3 (address, counter)
204       v3_generic_add_port_range(generic, 0xc0, 0xc7, GENERIC_PRINT_AND_IGNORE);   // DMA 2 channels 4,5,6,7 (address, counter)
205       v3_generic_add_port_range(generic, 0x87, 0x87, GENERIC_PRINT_AND_IGNORE);   // DMA 1 channel 0 page register
206       v3_generic_add_port_range(generic, 0x83, 0x83, GENERIC_PRINT_AND_IGNORE);   // DMA 1 channel 1 page register
207       v3_generic_add_port_range(generic, 0x81, 0x81, GENERIC_PRINT_AND_IGNORE);   // DMA 1 channel 2 page register
208       v3_generic_add_port_range(generic, 0x82, 0x82, GENERIC_PRINT_AND_IGNORE);   // DMA 1 channel 3 page register
209       v3_generic_add_port_range(generic, 0x8f, 0x8f, GENERIC_PRINT_AND_IGNORE);   // DMA 2 channel 4 page register
210       v3_generic_add_port_range(generic, 0x8b, 0x8b, GENERIC_PRINT_AND_IGNORE);   // DMA 2 channel 5 page register
211       v3_generic_add_port_range(generic, 0x89, 0x89, GENERIC_PRINT_AND_IGNORE);   // DMA 2 channel 6 page register
212       v3_generic_add_port_range(generic, 0x8a, 0x8a, GENERIC_PRINT_AND_IGNORE);   // DMA 2 channel 7 page register
213       v3_generic_add_port_range(generic, 0x08, 0x0f, GENERIC_PRINT_AND_IGNORE);   // DMA 1 misc registers (csr, req, smask,mode,clearff,reset,enable,mmask)
214       v3_generic_add_port_range(generic, 0xd0, 0xde, GENERIC_PRINT_AND_IGNORE);   // DMA 2 misc registers
215       
216       
217       
218       
219       // Make the Serial ports invisible 
220       
221       v3_generic_add_port_range(generic, 0x3f8, 0x3f8+7, GENERIC_PRINT_AND_IGNORE);      // COM 1
222       v3_generic_add_port_range(generic, 0x2f8, 0x2f8+7, GENERIC_PRINT_AND_IGNORE);      // COM 2
223       
224
225       
226
227       v3_generic_add_port_range(generic, 0x3e8, 0x3e8+7, GENERIC_PRINT_AND_IGNORE);      // COM 3
228       v3_generic_add_port_range(generic, 0x2e8, 0x2e8+7, GENERIC_PRINT_AND_IGNORE);      // COM 4
229
230       
231       
232
233       // Make the PCI bus invisible (at least it's configuration)
234       
235       v3_generic_add_port_range(generic, 0xcf8, 0xcf8, GENERIC_PRINT_AND_IGNORE); // PCI Config Address
236       v3_generic_add_port_range(generic, 0xcfc, 0xcfc, GENERIC_PRINT_AND_IGNORE); // PCI Config Data
237
238       
239       
240 #if 0
241       if (!use_ramdisk) {
242         // Monitor the IDE controllers (very slow)
243         v3_generic_add_port_range(generic, 0x170, 0x178, GENERIC_PRINT_AND_PASSTHROUGH); // IDE 1
244         v3_generic_add_port_range(generic, 0x376, 0x377, GENERIC_PRINT_AND_PASSTHROUGH); // IDE 1
245       }
246       
247
248       v3_generic_add_port_range(generic, 0x1f0, 0x1f8, GENERIC_PRINT_AND_PASSTHROUGH); // IDE 0
249       v3_generic_add_port_range(generic, 0x3f6, 0x3f7, GENERIC_PRINT_AND_PASSTHROUGH); // IDE 0
250 #endif
251       
252       
253 #if 0
254       
255       // Make the floppy controllers invisible
256       
257       v3_generic_add_port_range(generic, 0x3f0, 0x3f2, GENERIC_PRINT_AND_IGNORE); // Primary floppy controller (base,statusa/statusb,DOR)
258       v3_generic_add_port_range(generic, 0x3f4, 0x3f5, GENERIC_PRINT_AND_IGNORE); // Primary floppy controller (mainstat/datarate,data)
259       v3_generic_add_port_range(generic, 0x3f7, 0x3f7, GENERIC_PRINT_AND_IGNORE); // Primary floppy controller (DIR)
260       v3_generic_add_port_range(generic, 0x370, 0x372, GENERIC_PRINT_AND_IGNORE); // Secondary floppy controller (base,statusa/statusb,DOR)
261       v3_generic_add_port_range(generic, 0x374, 0x375, GENERIC_PRINT_AND_IGNORE); // Secondary floppy controller (mainstat/datarate,data)
262       v3_generic_add_port_range(generic, 0x377, 0x377, GENERIC_PRINT_AND_IGNORE); // Secondary floppy controller (DIR)
263       
264 #endif
265
266 #if 1
267
268       // Make the parallel port invisible
269       
270       v3_generic_add_port_range(generic, 0x378, 0x37f, GENERIC_PRINT_AND_IGNORE);
271
272 #endif
273
274 #if 1
275
276       // Monitor graphics card operations
277
278       v3_generic_add_port_range(generic, 0x3b0, 0x3bb, GENERIC_PRINT_AND_PASSTHROUGH);
279       v3_generic_add_port_range(generic, 0x3c0, 0x3df, GENERIC_PRINT_AND_PASSTHROUGH);
280       
281 #endif
282
283
284 #if 1
285       // Make the ISA PNP features invisible
286
287       v3_generic_add_port_range(generic, 0x274, 0x277, GENERIC_PRINT_AND_IGNORE);
288       v3_generic_add_port_range(generic, 0x279, 0x279, GENERIC_PRINT_AND_IGNORE);
289       v3_generic_add_port_range(generic, 0xa79, 0xa79, GENERIC_PRINT_AND_IGNORE);
290 #endif
291
292
293 #if 1
294       // Monitor any network card (realtek ne2000) operations 
295       v3_generic_add_port_range(generic, 0xc100, 0xc1ff, GENERIC_PRINT_AND_PASSTHROUGH);
296 #endif
297
298
299 #if 1
300       // Make any Bus master ide controller invisible
301       
302       v3_generic_add_port_range(generic, 0xc000, 0xc00f, GENERIC_PRINT_AND_IGNORE);
303 #endif
304       
305     }
306       //  v3_generic_add_port_range(generic, 0x378, 0x400, GENERIC_PRINT_AND_IGNORE);
307       
308
309
310     
311
312     v3_attach_device(info, nvram);
313     //v3_attach_device(info, timer);
314     v3_attach_device(info, pic);
315     v3_attach_device(info, pit);
316     v3_attach_device(info, keyboard);
317     // v3_attach_device(info, serial);
318     v3_attach_device(info, bochs_debug);
319
320     if (use_ramdisk) {
321       v3_attach_device(info, ramdisk);
322       v3_attach_device(info, cdrom);
323     }
324
325     if (use_generic) {
326       // Important that this be attached last!
327       v3_attach_device(info, generic);
328     }
329     
330     PrintDebugDevMgr(info);
331   }
332   
333   // give keyboard interrupts to vm
334   // no longer needed since we have a keyboard device
335   //hook_irq(&vm_info, 1);
336   
337 #if 0
338   // give floppy controller to vm
339   v3_hook_passthrough_irq(info, 6);
340 #endif
341   
342
343   if (!use_ramdisk) {
344     PrintDebug("Hooking IDE IRQs\n");
345
346     //primary ide
347     v3_hook_passthrough_irq(info, 14);
348   
349     // secondary ide
350     v3_hook_passthrough_irq(info, 15);    
351   }  
352
353   //v3_hook_io_port(info, 1234, &IO_Read, NULL, info);
354
355   info->rip = 0xfff0;
356   info->vm_regs.rsp = 0x0;
357   
358
359   return 0;
360 }