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.


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