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 configuration routine
[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
20   PrintDebug("Time Init\n");
21   v3_init_time(info);
22
23   PrintDebug("Shadow map Init\n");
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   
43   int i;
44
45   
46   //     SerialPrint("Guest Mem Dump at 0x%x\n", 0x100000);
47   //PrintDebugMemDump((unsigned char *)(0x100000), 261 * 1024);
48   if (layout->magic != MAGIC_CODE) {
49     
50     PrintDebug("Layout Magic Mismatch (0x%x)\n", layout->magic);
51     return -1;
52   }
53   
54   PrintDebug("%d layout regions\n", layout->num_regions);
55   
56   region_start = (void *)&(layout->regions[layout->num_regions]);
57   
58   PrintDebug("region start = 0x%x\n", region_start);
59   
60   for (i = 0; i < layout->num_regions; i++) {
61     struct layout_region * reg = &(layout->regions[i]);
62     uint_t num_pages = (reg->length / PAGE_SIZE) + ((reg->length % PAGE_SIZE) ? 1 : 0);
63     void * guest_mem = V3_AllocPages(num_pages);
64     
65     PrintDebug("Layout Region %d bytes\n", reg->length);
66     memcpy(guest_mem, region_start, reg->length);
67     
68     PrintDebugMemDump((unsigned char *)(guest_mem), 16);
69     
70     add_shadow_region_passthrough(info, reg->final_addr, reg->final_addr + (num_pages * PAGE_SIZE), (addr_t)guest_mem);
71     
72     PrintDebug("Adding Shadow Region (0x%x-0x%x) -> 0x%x\n", reg->final_addr, reg->final_addr + (num_pages * PAGE_SIZE), guest_mem);
73     
74     region_start += reg->length;
75   }
76   
77       //     
78   add_shadow_region_passthrough(info, 0x0, 0xa0000, (addr_t)V3_AllocPages(160));
79   
80   add_shadow_region_passthrough(info, 0xa0000, 0xc0000, 0xa0000); 
81   //hook_guest_mem(info, 0xa0000, 0xc0000, passthrough_mem_read, passthrough_mem_write, NULL);
82   
83   
84   // TEMP
85   //add_shadow_region_passthrough(info, 0xc0000, 0xc8000, 0xc0000);
86   
87   if (1) {
88     add_shadow_region_passthrough(info, 0xc7000, 0xc8000, (addr_t)V3_AllocPages(1));
89     if (add_shadow_region_passthrough(info, 0xc8000, 0xf0000, (addr_t)V3_AllocPages(40)) == -1) {
90       PrintDebug("Error adding shadow region\n");
91     }
92   } else {
93     add_shadow_region_passthrough(info, 0xc0000, 0xc8000, 0xc0000);
94     add_shadow_region_passthrough(info, 0xc8000, 0xf0000, 0xc8000);
95   }
96   
97   
98   //add_shadow_region_passthrough(info, 0x100000, 0x2000000, (addr_t)Allocate_VMM_Pages(8192));
99   add_shadow_region_passthrough(info, 0x100000, 0x1000000, (addr_t)V3_AllocPages(4096));
100   
101   add_shadow_region_passthrough(info, 0x1000000, 0x8000000, (addr_t)V3_AllocPages(32768));
102   
103   // test - give linux accesss to PCI space - PAD
104   add_shadow_region_passthrough(info, 0xc0000000,0xffffffff,0xc0000000);
105   
106   
107   print_shadow_map(&(info->mem_map));
108
109   
110   {
111     
112     struct vm_device * nvram = create_nvram();
113     //struct vm_device * timer = create_timer();
114     struct vm_device * pic = create_pic();
115     struct vm_device * keyboard = create_keyboard();
116     struct vm_device * pit = create_pit(); 
117     //struct vm_device * serial = create_serial();
118     
119     
120 #define GENERIC 1
121     
122 #if GENERIC
123     generic_port_range_type range[] = {
124 #if 1
125       {0x00, 0x07, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channels 0,1,2,3 (address, counter)
126       {0xc0, 0xc7, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channels 4,5,6,7 (address, counter)
127       {0x87, 0x87, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 0 page register
128       {0x83, 0x83, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 1 page register
129       {0x81, 0x81, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 2 page register
130       {0x82, 0x82, GENERIC_PRINT_AND_IGNORE},   // DMA 1 channel 3 page register
131       {0x8f, 0x8f, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 4 page register
132       {0x8b, 0x8b, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 5 page register
133       {0x89, 0x89, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 6 page register
134       {0x8a, 0x8a, GENERIC_PRINT_AND_IGNORE},   // DMA 2 channel 7 page register
135       {0x08, 0x0f, GENERIC_PRINT_AND_IGNORE},   // DMA 1 misc registers (csr, req, smask,mode,clearff,reset,enable,mmask)
136       {0xd0, 0xde, GENERIC_PRINT_AND_IGNORE},   // DMA 2 misc registers
137 #endif
138       
139       
140       {0x3f8, 0x3f8+7, GENERIC_PRINT_AND_IGNORE},      // COM 1
141       {0x2f8, 0x2f8+7, GENERIC_PRINT_AND_IGNORE},      // COM 2
142       {0x3e8, 0x3e8+7, GENERIC_PRINT_AND_IGNORE},      // COM 3
143       {0x2e8, 0x2e8+7, GENERIC_PRINT_AND_IGNORE},      // COM 4
144       
145 #if 0
146       {0x170, 0x178, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 1
147       {0x376, 0x377, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 1
148       {0x1f0, 0x1f8, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 0
149       {0x3f6, 0x3f7, GENERIC_PRINT_AND_PASSTHROUGH}, // IDE 0
150 #endif
151       
152
153 #if 0
154       {0x3f0, 0x3f2, GENERIC_PRINT_AND_IGNORE}, // Primary floppy controller (base,statusa/statusb,DOR)
155       {0x3f4, 0x3f5, GENERIC_PRINT_AND_IGNORE}, // Primary floppy controller (mainstat/datarate,data)
156       {0x3f7, 0x3f7, GENERIC_PRINT_AND_IGNORE}, // Primary floppy controller (DIR)
157       {0x370, 0x372, GENERIC_PRINT_AND_IGNORE}, // Secondary floppy controller (base,statusa/statusb,DOR)
158       {0x374, 0x375, GENERIC_PRINT_AND_IGNORE}, // Secondary floppy controller (mainstat/datarate,data)
159       {0x377, 0x377, GENERIC_PRINT_AND_IGNORE}, // Secondary floppy controller (DIR)
160       
161 #endif
162
163       //          {0x378, 0x400, GENERIC_PRINT_AND_IGNORE}
164       
165       {0,0,0},  // sentinal - must be last
166       
167     };
168     
169
170     struct vm_device * generic = create_generic(range, NULL, NULL);
171     
172 #endif
173     
174     v3_attach_device(info, nvram);
175     //v3_attach_device(info, timer);
176     v3_attach_device(info, pic);
177     v3_attach_device(info, pit);
178     v3_attach_device(info, keyboard);
179     // v3_attach_device(info, serial);
180
181
182 #if GENERIC
183     // Important that this be attached last!
184     v3_attach_device(info, generic);
185     
186 #endif
187     
188     PrintDebugDevMgr(info);
189   }
190   
191   // give keyboard interrupts to vm
192   // no longer needed since we have a keyboard device
193   //hook_irq(&vm_info, 1);
194   
195 #if 1
196   // give floppy controller to vm
197   v3_hook_irq_for_guest_injection(info, 6);
198 #endif
199   
200 #if 1
201   //primary ide
202   v3_hook_irq_for_guest_injection(info, 14);
203   
204   // secondary ide
205   v3_hook_irq_for_guest_injection(info, 15);
206 #endif
207   
208
209   info->rip = 0xfff0;
210   info->vm_regs.rsp = 0x0;
211   
212
213   return 0;
214 }
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237 #if 0
238
239     
240     if (0) {
241       
242       //    add_shared_mem_range(&(vm_info.mem_layout), 0, 0x800000, 0x10000);    
243       //    add_shared_mem_range(&(vm_info.mem_layout), 0, 0x1000000, 0);
244       
245       rip = (ulong_t)(void*)&BuzzVM;
246       //  rip -= 0x10000;
247       //    rip = (addr_t)(void*)&exit_test;
248       //  rip -= 0x2000;
249       vm_info.rip = rip;
250       rsp = (addr_t)Alloc_Page();
251       
252       vm_info.vm_regs.rsp = (rsp +4092 );// - 0x2000;
253       
254             
255     } else if (0) {
256       //add_shared_mem_range(&(vm_info.mem_layout), 0x0, 0x1000, 0x100000);
257       //      add_shared_mem_range(&(vm_info.mem_layout), 0x0, 0x100000, 0x0);
258       
259       /*
260         shadow_region_t *ent = Malloc(sizeof(shadow_region_t));;
261         init_shadow_region_physical(ent,0,0x100000,GUEST_REGION_PHYSICAL_MEMORY,
262         0x100000, HOST_REGION_PHYSICAL_MEMORY);
263         add_shadow_region(&(vm_info.mem_map),ent);
264       */
265
266       add_shadow_region_passthrough(&vm_info, 0x0, 0x100000, 0x100000);
267
268       v3_hook_io_port(&vm_info, 0x61, &IO_Read, &IO_Write, NULL);
269       v3_hook_io_port(&vm_info, 0x05, &IO_Read, &IO_Write_to_Serial, NULL);
270       
271       /*
272         vm_info.cr0 = 0;
273         vm_info.cs.base=0xf000;
274         vm_info.cs.limit=0xffff;
275       */
276       //vm_info.rip = 0xfff0;
277
278       vm_info.rip = 0;
279       vm_info.vm_regs.rsp = 0x0;
280     } else {
281    
282     }
283
284 #endif