On Wed, 26 Jan 2011, Anthony Liguori wrote:
> > +static void xen_init_fv(ram_addr_t ram_size,
> > + const char *boot_device,
> > + const char *kernel_filename,
> > + const char *kernel_cmdline,
> > + const char *initrd_filename,
> > + const char *cpu_model)
> > +{
> > + int i;
> > + ram_addr_t below_4g_mem_size, above_4g_mem_size = 0;
> > + PCIBus *pci_bus;
> > + PCII440FXState *i440fx_state;
> > + int piix3_devfn = -1;
> > + qemu_irq *cpu_irq;
> > + qemu_irq *isa_irq;
> > + qemu_irq *i8259;
> > + qemu_irq *cmos_s3;
> > + qemu_irq *smi_irq;
> > + IsaIrqState *isa_irq_state;
> > + DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
> > + FDCtrl *floppy_controller;
> > + BusState *idebus[MAX_IDE_BUS];
> > + ISADevice *rtc_state;
> > +
> > + CPUState *env;
> > +
> > + /* Initialize a dummy CPU */
> > + if (cpu_model == NULL) {
> > +#ifdef TARGET_X86_64
> > + cpu_model = "qemu64";
> > +#else
> > + cpu_model = "qemu32";
> > +#endif
> > + }
> > + env = cpu_init(cpu_model);
> > + env->halted = 1;
> > +
> > + cpu_irq = pc_allocate_cpu_irq();
> > + i8259 = i8259_init(cpu_irq[0]);
> > + isa_irq_state = qemu_mallocz(sizeof (*isa_irq_state));
> > + isa_irq_state->i8259 = i8259;
> > +
> > + isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 24);
> > +
> > + pci_bus = i440fx_init(&i440fx_state,&piix3_devfn, isa_irq, ram_size);
> > + isa_bus_irqs(isa_irq);
> > +
> > + pc_register_ferr_irq(isa_reserve_irq(13));
> > +
> > + pc_vga_init(pci_bus);
> > +
> > + /* init basic PC hardware */
> > + pc_basic_device_init(isa_irq,&floppy_controller,&rtc_state);
> > +
> > + for (i = 0; i< nb_nics; i++) {
> > + NICInfo *nd =&nd_table[i];
> > +
> > + if (nd->model&& strcmp(nd->model, "ne2k_isa") == 0)
> > + pc_init_ne2k_isa(nd);
> > + else
> > + pci_nic_init_nofail(nd, "e1000", NULL);
> > + }
> > +
> > + if (drive_get_max_bus(IF_IDE)>= MAX_IDE_BUS) {
> > + fprintf(stderr, "qemu: too many IDE bus\n");
> > + exit(1);
> > + }
> > +
> > + for (i = 0; i< MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
> > + hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
> > + }
> > +
> > + PCIDevice *dev = pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1);
> > + idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0");
> > + idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1");
> > +
> > + audio_init(isa_irq, pci_bus);
> > +
> > + if (ram_size>= 0xe0000000) {
> > + above_4g_mem_size = ram_size - 0xe0000000;
> > + below_4g_mem_size = 0xe0000000;
> > + } else {
> > + below_4g_mem_size = ram_size;
> > + }
> > + pc_cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device,
> > + idebus[0], idebus[1], floppy_controller, rtc_state);
> > +
> > + if (usb_enabled) {
> > + usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
> > + }
> > +
> > + if (acpi_enabled) {
> > + cmos_s3 = qemu_allocate_irqs(pc_cmos_set_s3_resume, rtc_state, 1);
> > + smi_irq = qemu_allocate_irqs(pc_acpi_smi_interrupt, first_cpu, 1);
> > + piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
> > + isa_reserve_irq(9), *cmos_s3, *smi_irq, 0);
> > + }
> > +
> > + if (i440fx_state) {
> > + i440fx_init_memory_mappings(i440fx_state);
> > + }
> > +
> > + pc_pci_device_init(pci_bus);
> > +}
> >
>
> It's not obvious to me why you can't make use of most of the normal pc
> code here.
I think we could, but we would need to add few "if (xen_available())".
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|