mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
hw/i386/pc: support '-nic' for xen-net-device
The default NIC creation seems a bit hackish to me. I don't understand why each platform has to call pci_nic_init_nofail() from a point in the code where it actually has a pointer to the PCI bus, and then we have the special cases for things like ne2k_isa. If qmp_device_add() can *find* the appropriate bus and instantiate the device on it, why can't we just do that from generic code for creating the default NICs too? But that isn't a yak I want to shave today. Add a xenbus field to the PCMachineState so that it can make its way from pc_basic_device_init() to pc_nic_init() and be handled as a special case like ne2k_isa is. Now we can launch emulated Xen guests with '-nic user'. Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> Reviewed-by: Paul Durrant <paul@xen.org>
This commit is contained in:
parent
25967ff69f
commit
c10b4b3c0d
6 changed files with 17 additions and 8 deletions
11
hw/i386/pc.c
11
hw/i386/pc.c
|
@ -1261,7 +1261,7 @@ void pc_basic_device_init(struct PCMachineState *pcms,
|
||||||
if (pcms->bus) {
|
if (pcms->bus) {
|
||||||
pci_create_simple(pcms->bus, -1, "xen-platform");
|
pci_create_simple(pcms->bus, -1, "xen-platform");
|
||||||
}
|
}
|
||||||
xen_bus_init();
|
pcms->xenbus = xen_bus_init();
|
||||||
xen_be_init();
|
xen_be_init();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1289,7 +1289,8 @@ void pc_basic_device_init(struct PCMachineState *pcms,
|
||||||
pcms->vmport != ON_OFF_AUTO_ON);
|
pcms->vmport != ON_OFF_AUTO_ON);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pc_nic_init(PCMachineClass *pcmc, ISABus *isa_bus, PCIBus *pci_bus)
|
void pc_nic_init(PCMachineClass *pcmc, ISABus *isa_bus, PCIBus *pci_bus,
|
||||||
|
BusState *xen_bus)
|
||||||
{
|
{
|
||||||
MachineClass *mc = MACHINE_CLASS(pcmc);
|
MachineClass *mc = MACHINE_CLASS(pcmc);
|
||||||
int i;
|
int i;
|
||||||
|
@ -1299,7 +1300,11 @@ void pc_nic_init(PCMachineClass *pcmc, ISABus *isa_bus, PCIBus *pci_bus)
|
||||||
NICInfo *nd = &nd_table[i];
|
NICInfo *nd = &nd_table[i];
|
||||||
const char *model = nd->model ? nd->model : mc->default_nic;
|
const char *model = nd->model ? nd->model : mc->default_nic;
|
||||||
|
|
||||||
if (g_str_equal(model, "ne2k_isa")) {
|
if (xen_bus && (!nd->model || g_str_equal(model, "xen-net-device"))) {
|
||||||
|
DeviceState *dev = qdev_new("xen-net-device");
|
||||||
|
qdev_set_nic_properties(dev, nd);
|
||||||
|
qdev_realize_and_unref(dev, xen_bus, &error_fatal);
|
||||||
|
} else if (g_str_equal(model, "ne2k_isa")) {
|
||||||
pc_init_ne2k_isa(isa_bus, nd);
|
pc_init_ne2k_isa(isa_bus, nd);
|
||||||
} else {
|
} else {
|
||||||
pci_nic_init_nofail(nd, pci_bus, model, NULL);
|
pci_nic_init_nofail(nd, pci_bus, model, NULL);
|
||||||
|
|
|
@ -342,7 +342,7 @@ static void pc_init1(MachineState *machine,
|
||||||
pc_basic_device_init(pcms, isa_bus, x86ms->gsi, rtc_state, true,
|
pc_basic_device_init(pcms, isa_bus, x86ms->gsi, rtc_state, true,
|
||||||
0x4);
|
0x4);
|
||||||
|
|
||||||
pc_nic_init(pcmc, isa_bus, pci_bus);
|
pc_nic_init(pcmc, isa_bus, pci_bus, pcms->xenbus);
|
||||||
|
|
||||||
if (pcmc->pci_enabled) {
|
if (pcmc->pci_enabled) {
|
||||||
pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
|
pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
|
||||||
|
|
|
@ -340,7 +340,7 @@ static void pc_q35_init(MachineState *machine)
|
||||||
|
|
||||||
/* the rest devices to which pci devfn is automatically assigned */
|
/* the rest devices to which pci devfn is automatically assigned */
|
||||||
pc_vga_init(isa_bus, host_bus);
|
pc_vga_init(isa_bus, host_bus);
|
||||||
pc_nic_init(pcmc, isa_bus, host_bus);
|
pc_nic_init(pcmc, isa_bus, host_bus, pcms->xenbus);
|
||||||
|
|
||||||
if (machine->nvdimms_state->is_enabled) {
|
if (machine->nvdimms_state->is_enabled) {
|
||||||
nvdimm_init_acpi_state(machine->nvdimms_state, system_io,
|
nvdimm_init_acpi_state(machine->nvdimms_state, system_io,
|
||||||
|
|
|
@ -1133,11 +1133,13 @@ static void xen_register_types(void)
|
||||||
|
|
||||||
type_init(xen_register_types)
|
type_init(xen_register_types)
|
||||||
|
|
||||||
void xen_bus_init(void)
|
BusState *xen_bus_init(void)
|
||||||
{
|
{
|
||||||
DeviceState *dev = qdev_new(TYPE_XEN_BRIDGE);
|
DeviceState *dev = qdev_new(TYPE_XEN_BRIDGE);
|
||||||
BusState *bus = qbus_new(TYPE_XEN_BUS, dev, NULL);
|
BusState *bus = qbus_new(TYPE_XEN_BUS, dev, NULL);
|
||||||
|
|
||||||
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
|
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
|
||||||
qbus_set_bus_hotplug_handler(bus);
|
qbus_set_bus_hotplug_handler(bus);
|
||||||
|
|
||||||
|
return bus;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ typedef struct PCMachineState {
|
||||||
|
|
||||||
/* Pointers to devices and objects: */
|
/* Pointers to devices and objects: */
|
||||||
PCIBus *bus;
|
PCIBus *bus;
|
||||||
|
BusState *xenbus;
|
||||||
I2CBus *smbus;
|
I2CBus *smbus;
|
||||||
PFlashCFI01 *flash[2];
|
PFlashCFI01 *flash[2];
|
||||||
ISADevice *pcspk;
|
ISADevice *pcspk;
|
||||||
|
@ -184,7 +185,8 @@ void pc_basic_device_init(struct PCMachineState *pcms,
|
||||||
void pc_cmos_init(PCMachineState *pcms,
|
void pc_cmos_init(PCMachineState *pcms,
|
||||||
BusState *ide0, BusState *ide1,
|
BusState *ide0, BusState *ide1,
|
||||||
ISADevice *s);
|
ISADevice *s);
|
||||||
void pc_nic_init(PCMachineClass *pcmc, ISABus *isa_bus, PCIBus *pci_bus);
|
void pc_nic_init(PCMachineClass *pcmc, ISABus *isa_bus, PCIBus *pci_bus,
|
||||||
|
BusState *xen_bus);
|
||||||
|
|
||||||
void pc_i8259_create(ISABus *isa_bus, qemu_irq *i8259_irqs);
|
void pc_i8259_create(ISABus *isa_bus, qemu_irq *i8259_irqs);
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ struct XenBusClass {
|
||||||
OBJECT_DECLARE_TYPE(XenBus, XenBusClass,
|
OBJECT_DECLARE_TYPE(XenBus, XenBusClass,
|
||||||
XEN_BUS)
|
XEN_BUS)
|
||||||
|
|
||||||
void xen_bus_init(void);
|
BusState *xen_bus_init(void);
|
||||||
|
|
||||||
void xen_device_backend_set_state(XenDevice *xendev,
|
void xen_device_backend_set_state(XenDevice *xendev,
|
||||||
enum xenbus_state state);
|
enum xenbus_state state);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue