#include <devices/8254.h>
#include <devices/nvram.h>
#include <devices/generic.h>
-#include <devices/ramdisk.h>
-#include <devices/cdrom.h>
+#include <devices/ide.h>
+#include <devices/ram_cd.h>
+#include <devices/ram_hd.h>
#include <devices/bochs_debug.h>
#include <devices/os_debug.h>
#include <devices/apic.h>
#include <devices/io_apic.h>
#include <devices/para_net.h>
#include <devices/pci.h>
-
+#include <devices/i440fx.h>
+#include <devices/piix3.h>
#include <palacios/vmm_host_events.h>
v3_init_hypercall_map(info);
-
- if (v3_cpu_type == V3_SVM_REV3_CPU) {
+ if ((v3_cpu_type == V3_SVM_REV3_CPU) &&
+ (config_ptr->enable_nested_paging == 1)) {
+ PrintDebug("Guest Page Mode: NESTED_PAGING\n");
info->shdw_pg_mode = NESTED_PAGING;
} else {
+ PrintDebug("Guest Page Mode: SHADOW_PAGING\n");
v3_init_shadow_page_state(info);
info->shdw_pg_mode = SHADOW_PAGING;
}
static int setup_devices(struct guest_info * info, struct v3_vm_config * config_ptr) {
+
+ struct vm_device * ide = NULL;
struct vm_device * ramdisk = NULL;
- struct vm_device * cdrom = NULL;
- struct vm_device * pci = v3_create_pci();
- struct vm_device * nvram = v3_create_nvram();
- //struct vm_device * timer = v3_create_timer();
+
+ struct vm_device * pci = NULL;
+ struct vm_device * northbridge = NULL;
+ struct vm_device * southbridge = NULL;
+
+ struct vm_device * nvram = NULL;
struct vm_device * pic = v3_create_pic();
struct vm_device * keyboard = v3_create_keyboard();
struct vm_device * pit = v3_create_pit();
struct vm_device * ioapic = v3_create_io_apic(apic);
struct vm_device * para_net = v3_create_para_net();
+
//struct vm_device * serial = v3_create_serial();
struct vm_device * generic = NULL;
- int use_ramdisk = config_ptr->use_ramdisk;
+
int use_generic = USE_GENERIC;
+ if (config_ptr->enable_pci == 1) {
+ pci = v3_create_pci();
+ northbridge = v3_create_i440fx(pci);
+ southbridge = v3_create_piix3(pci);
+ ide = v3_create_ide(pci, southbridge);
+ } else {
+ ide = v3_create_ide(NULL, NULL);
+ }
- if (use_ramdisk) {
- PrintDebug("Creating Ramdisk\n");
- ramdisk = v3_create_ramdisk();
- cdrom = v3_create_cdrom(ramdisk, config_ptr->ramdisk, config_ptr->ramdisk_size);
+
+
+ nvram = v3_create_nvram(ide);
+
+ if (config_ptr->use_ram_cd == 1) {
+ PrintDebug("Creating Ram CD\n");
+ ramdisk = v3_create_ram_cd(ide, 0, 0,
+ (addr_t)(config_ptr->ramdisk),
+ config_ptr->ramdisk_size);
+ } else if (config_ptr->use_ram_hd == 1) {
+ PrintDebug("Creating Ram HD\n");
+ ramdisk = v3_create_ram_hd(ide, 0, 0,
+ (addr_t)(config_ptr->ramdisk),
+ config_ptr->ramdisk_size);
}
generic = configure_generic(info, config_ptr);
}
- v3_attach_device(info, pci);
- v3_attach_device(info, nvram);
- //v3_attach_device(info, timer);
+
+
+
v3_attach_device(info, pic);
v3_attach_device(info, pit);
v3_attach_device(info, keyboard);
v3_attach_device(info, para_net);
- if (use_ramdisk) {
+ if (config_ptr->enable_pci == 1) {
+ PrintDebug("Attaching PCI\n");
+ v3_attach_device(info, pci);
+ PrintDebug("Attaching Northbridge\n");
+ v3_attach_device(info, northbridge);
+ PrintDebug("Attaching Southbridge\n");
+ v3_attach_device(info, southbridge);
+ }
+
+ PrintDebug("Attaching IDE\n");
+ v3_attach_device(info, ide);
+
+ if (ramdisk != NULL) {
v3_attach_device(info, ramdisk);
- v3_attach_device(info, cdrom);
}
if (use_generic) {
// Important that this be attached last!
v3_attach_device(info, generic);
}
-
- PrintDebugDevMgr(info);
-
- // give keyboard interrupts to vm
- // no longer needed since we have a keyboard device
- //hook_irq(&vm_info, 1);
-
-#if 0
- // give floppy controller to vm
- v3_hook_passthrough_irq(info, 6);
-#endif
-
-
- if (!use_ramdisk) {
- PrintDebug("Hooking IDE IRQs\n");
-
- //primary ide
- v3_hook_passthrough_irq(info, 14);
-
- // secondary ide
- v3_hook_passthrough_irq(info, 15);
- }
+ // This should go last because it contains the hardware state
+ v3_attach_device(info, nvram);
+ PrintDebugDevMgr(info);
return 0;
}
// Make the PCI bus invisible (at least it's configuration)
- v3_generic_add_port_range(generic, 0xcf8, 0xcf8, GENERIC_PRINT_AND_IGNORE); // PCI Config Address
- v3_generic_add_port_range(generic, 0xcfc, 0xcfc, GENERIC_PRINT_AND_IGNORE); // PCI Config Data
+ //v3_generic_add_port_range(generic, 0xcf8, 0xcf8, GENERIC_PRINT_AND_IGNORE); // PCI Config Address
+ //v3_generic_add_port_range(generic, 0xcfc, 0xcfc, GENERIC_PRINT_AND_IGNORE); // PCI Config Data