iommu: Don't crash if machine is not PC_MACHINE
Currently it's possible to crash QEMU using "-device *-iommu" and "-machine none": $ qemu-system-x86_64 -machine none -device amd-iommu qemu/hw/i386/amd_iommu.c:1140:amdvi_realize: Object 0x55627dafbc90 is not an instance of type generic-pc-machine Aborted (core dumped) $ qemu-system-x86_64 -machine none -device intel-iommu qemu/hw/i386/intel_iommu.c:2972:vtd_realize: Object 0x56292ec0bc90 is not an instance of type generic-pc-machine Aborted (core dumped) Fix amd-iommu and intel-iommu to ensure the current machine is really a TYPE_PC_MACHINE instance at their realize methods. Resulting error messages: $ qemu-system-x86_64 -machine none -device amd-iommu qemu-system-x86_64: -device amd-iommu: Machine-type 'none' not supported by amd-iommu $ qemu-system-x86_64 -machine none -device intel-iommu qemu-system-x86_64: -device intel-iommu: Machine-type 'none' not supported by intel-iommu Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
465238d9f8
commit
ef0e8fc768
|
@ -21,6 +21,7 @@
|
||||||
*/
|
*/
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "hw/i386/amd_iommu.h"
|
#include "hw/i386/amd_iommu.h"
|
||||||
|
#include "qapi/error.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
|
||||||
|
@ -1137,7 +1138,19 @@ static void amdvi_realize(DeviceState *dev, Error **err)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
AMDVIState *s = AMD_IOMMU_DEVICE(dev);
|
AMDVIState *s = AMD_IOMMU_DEVICE(dev);
|
||||||
X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(dev);
|
X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(dev);
|
||||||
PCIBus *bus = PC_MACHINE(qdev_get_machine())->bus;
|
MachineState *ms = MACHINE(qdev_get_machine());
|
||||||
|
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||||
|
PCMachineState *pcms =
|
||||||
|
PC_MACHINE(object_dynamic_cast(OBJECT(ms), TYPE_PC_MACHINE));
|
||||||
|
PCIBus *bus;
|
||||||
|
|
||||||
|
if (!pcms) {
|
||||||
|
error_setg(err, "Machine-type '%s' not supported by amd-iommu",
|
||||||
|
mc->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bus = pcms->bus;
|
||||||
s->iotlb = g_hash_table_new_full(amdvi_uint64_hash,
|
s->iotlb = g_hash_table_new_full(amdvi_uint64_hash,
|
||||||
amdvi_uint64_equal, g_free, g_free);
|
amdvi_uint64_equal, g_free, g_free);
|
||||||
|
|
||||||
|
|
|
@ -2969,11 +2969,21 @@ static bool vtd_decide_config(IntelIOMMUState *s, Error **errp)
|
||||||
|
|
||||||
static void vtd_realize(DeviceState *dev, Error **errp)
|
static void vtd_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
PCMachineState *pcms = PC_MACHINE(qdev_get_machine());
|
MachineState *ms = MACHINE(qdev_get_machine());
|
||||||
PCIBus *bus = pcms->bus;
|
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||||
|
PCMachineState *pcms =
|
||||||
|
PC_MACHINE(object_dynamic_cast(OBJECT(ms), TYPE_PC_MACHINE));
|
||||||
|
PCIBus *bus;
|
||||||
IntelIOMMUState *s = INTEL_IOMMU_DEVICE(dev);
|
IntelIOMMUState *s = INTEL_IOMMU_DEVICE(dev);
|
||||||
X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(dev);
|
X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(dev);
|
||||||
|
|
||||||
|
if (!pcms) {
|
||||||
|
error_setg(errp, "Machine-type '%s' not supported by intel-iommu",
|
||||||
|
mc->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bus = pcms->bus;
|
||||||
VTD_DPRINTF(GENERAL, "");
|
VTD_DPRINTF(GENERAL, "");
|
||||||
x86_iommu->type = TYPE_INTEL;
|
x86_iommu->type = TYPE_INTEL;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue