/* * Copyright (c) 2018 Intel Corporation * Copyright (c) 2019 Red Hat, Inc. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2 or later, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ #ifndef HW_I386_MICROVM_H #define HW_I386_MICROVM_H #include "exec/hwaddr.h" #include "qemu/notify.h" #include "hw/boards.h" #include "hw/i386/x86.h" #include "hw/acpi/acpi_dev_interface.h" #include "hw/pci-host/gpex.h" #include "qom/object.h" /* * IRQ | pc | microvm (acpi=on) * --------+------------+------------------ * 0 | pit | * 1 | kbd | * 2 | cascade | * 3 | serial 1 | * 4 | serial 0 | serial * 5 | - | * 6 | floppy | * 7 | parallel | * 8 | rtc | rtc (rtc=on) * 9 | acpi | acpi (ged) * 10 | pci lnk | xhci (usb=on) * 11 | pci lnk | * 12 | ps2 | pcie * 13 | fpu | pcie * 14 | ide 0 | pcie * 15 | ide 1 | pcie * 16-23 | pci gsi | virtio */ /* Platform virtio definitions */ #define VIRTIO_MMIO_BASE 0xfeb00000 #define VIRTIO_CMDLINE_MAXLEN 64 #define GED_MMIO_BASE 0xfea00000 #define GED_MMIO_BASE_MEMHP (GED_MMIO_BASE + 0x100) #define GED_MMIO_BASE_REGS (GED_MMIO_BASE + 0x200) #define GED_MMIO_IRQ 9 #define MICROVM_XHCI_BASE 0xfe900000 #define MICROVM_XHCI_IRQ 10 #define PCIE_MMIO_BASE 0xc0000000 #define PCIE_MMIO_SIZE 0x20000000 #define PCIE_ECAM_BASE 0xe0000000 #define PCIE_ECAM_SIZE 0x10000000 /* Machine type options */ #define MICROVM_MACHINE_RTC "rtc" #define MICROVM_MACHINE_PCIE "pcie" #define MICROVM_MACHINE_IOAPIC2 "ioapic2" #define MICROVM_MACHINE_ISA_SERIAL "isa-serial" #define MICROVM_MACHINE_OPTION_ROMS "x-option-roms" #define MICROVM_MACHINE_AUTO_KERNEL_CMDLINE "auto-kernel-cmdline" struct MicrovmMachineClass { X86MachineClass parent; HotplugHandler *(*orig_hotplug_handler)(MachineState *machine, DeviceState *dev); void (*x86_load_linux)(X86MachineState *x86ms, FWCfgState *fw_cfg, int acpi_data_size, bool pvh_enabled); }; struct MicrovmMachineState { X86MachineState parent; /* Machine type options */ OnOffAuto rtc; OnOffAuto pcie; OnOffAuto ioapic2; bool isa_serial; bool option_roms; bool auto_kernel_cmdline; /* Machine state */ uint32_t pcie_irq_base; uint32_t virtio_irq_base; uint32_t virtio_num_transports; bool kernel_cmdline_fixed; Notifier machine_done; Notifier powerdown_req; struct GPEXConfig gpex; /* device tree */ void *fdt; uint32_t ioapic_phandle[2]; }; #define TYPE_MICROVM_MACHINE MACHINE_TYPE_NAME("microvm") OBJECT_DECLARE_TYPE(MicrovmMachineState, MicrovmMachineClass, MICROVM_MACHINE) #endif