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.


more clean up changes
[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       {0x00, 0x07, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channels 0,1,2,3 (address, counter)
122       {0xc0, 0xc7, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channels 4,5,6,7 (address, counter)
123       {0x87, 0x87, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 0 page register
124       {0x83, 0x83, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 1 page register
125       {0x81, 0x81, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 2 page register
126       {0x82, 0x82, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 3 page register
127       {0x8f, 0x8f, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 4 page register
128       {0x8b, 0x8b, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 5 page register
129       {0x89, 0x89, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 6 page register
130       {0x8a, 0x8a, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 7 page register
131       {0x08, 0x0f, GENERIC_PRINT_AND_IGNORE},   // DMA 1 misc registers (csr, req, smask,mode,clearff,reset,enable,mmask)
132       {0xd0, 0xde, GENERIC_PRINT_AND_IGNORE},   // DMA 2 misc registers
133 #endif
134       
135       
136       {0x3f8, 0x3f8+7, GENERIC_PRINT_AND_IGNORE},      // COM 1
137       {0x2f8, 0x2f8+7, GENERIC_PRINT_AND_IGNORE},      // COM 2
138       {0x3e8, 0x3e8+7, GENERIC_PRINT_AND_IGNORE},      // COM 3
139       {0x2e8, 0x2e8+7, GENERIC_PRINT_AND_IGNORE},      // COM 4
140       
141 #if 0
142       {0x170, 0x178, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 1
143       {0x376, 0x377, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 1
144       {0x1f0, 0x1f8, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 0
145       {0x3f6, 0x3f7, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 0
146 #endif
147       
148
149 #if 0
150       {0x3f0, 0x3f2, GENERIC_PRINT_AND_IGNORE}, // Primary floppy controller (base,statusa/statusb,DOR)
151       {0x3f4, 0x3f5, GENERIC_PRINT_AND_IGNORE}, // Primary floppy controller (mainstat/datarate,data)
152       {0x3f7, 0x3f7, GENERIC_PRINT_AND_IGNORE}, // Primary floppy controller (DIR)
153       {0x370, 0x372, GENERIC_PRINT_AND_IGNORE}, // Secondary floppy controller (base,statusa/statusb,DOR)
154       {0x374, 0x375, GENERIC_PRINT_AND_IGNORE}, // Secondary floppy controller (mainstat/datarate,data)
155       {0x377, 0x377, GENERIC_PRINT_AND_IGNORE}, // Secondary floppy controller (DIR)
156       
157 #endif
158
159       //          {0x378, 0x400, GENERIC_PRINT_AND_IGNORE}
160       
161       {0,0,0},  // sentinal - must be last
162       
163     };
164     
165
166     struct vm_device * generic = create_generic(range, NULL, NULL);
167     
168 #endif
169     
170     v3_attach_device(info, nvram);
171     //v3_attach_device(info, timer);
172     v3_attach_device(info, pic);
173     v3_attach_device(info, pit);
174     v3_attach_device(info, keyboard);
175     // v3_attach_device(info, serial);
176
177
178 #if GENERIC
179     // Important that this be attached last!
180     v3_attach_device(info, generic);
181     
182 #endif
183     
184     PrintDebugDevMgr(info);
185   }
186   
187   // give keyboard interrupts to vm
188   // no longer needed since we have a keyboard device
189   //hook_irq(&vm_info, 1);
190   
191 #if 1
192   // give floppy controller to vm
193   v3_hook_irq_for_guest_injection(info, 6);
194 #endif
195   
196 #if 1
197   //primary ide
198   v3_hook_irq_for_guest_injection(info, 14);
199   
200   // secondary ide
201   v3_hook_irq_for_guest_injection(info, 15);
202 #endif
203   
204
205   info->rip = 0xfff0;
206   info->vm_regs.rsp = 0x0;
207   
208
209   return 0;
210 }
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233 #if 0
234
235     
236     if (0) {
237       
238       //    add_shared_mem_range(&(vm_info.mem_layout), 0, 0x800000, 0x10000);    
239       //    add_shared_mem_range(&(vm_info.mem_layout), 0, 0x1000000, 0);
240       
241       rip = (ulong_t)(void*)&BuzzVM;
242       //  rip -= 0x10000;
243       //    rip = (addr_t)(void*)&exit_test;
244       //  rip -= 0x2000;
245       vm_info.rip = rip;
246       rsp = (addr_t)Alloc_Page();
247       
248       vm_info.vm_regs.rsp = (rsp +4092 );// - 0x2000;
249       
250             
251     } else if (0) {
252       //add_shared_mem_range(&(vm_info.mem_layout), 0x0, 0x1000, 0x100000);
253       //      add_shared_mem_range(&(vm_info.mem_layout), 0x0, 0x100000, 0x0);
254       
255       /*
256         shadow_region_t *ent = Malloc(sizeof(shadow_region_t));;
257         init_shadow_region_physical(ent,0,0x100000,GUEST_REGION_PHYSICAL_MEMORY,
258         0x100000, HOST_REGION_PHYSICAL_MEMORY);
259         add_shadow_region(&(vm_info.mem_map),ent);
260       */
261
262       add_shadow_region_passthrough(&vm_info, 0x0, 0x100000, 0x100000);
263
264       v3_hook_io_port(&vm_info, 0x61, &IO_Read, &IO_Write, NULL);
265       v3_hook_io_port(&vm_info, 0x05, &IO_Read, &IO_Write_to_Serial, NULL);
266       
267       /*
268         vm_info.cr0 = 0;
269         vm_info.cs.base=0xf000;
270         vm_info.cs.limit=0xffff;
271       */
272       //vm_info.rip = 0xfff0;
273
274       vm_info.rip = 0;
275       vm_info.vm_regs.rsp = 0x0;
276     } else {
277    
278     }
279
280 #endif