|
@@ -4697,10 +4697,11 @@ static void vtd_init(IntelIOMMUState *s)
|
|
|
/* Should not reset address_spaces when reset because devices will still use
|
|
|
* the address space they got at first (won't ask the bus again).
|
|
|
*/
|
|
|
-static void vtd_reset(DeviceState *dev)
|
|
|
+static void vtd_reset_exit(Object *obj, ResetType type)
|
|
|
{
|
|
|
- IntelIOMMUState *s = INTEL_IOMMU_DEVICE(dev);
|
|
|
+ IntelIOMMUState *s = INTEL_IOMMU_DEVICE(obj);
|
|
|
|
|
|
+ trace_vtd_reset_exit();
|
|
|
vtd_init(s);
|
|
|
vtd_address_space_refresh_all(s);
|
|
|
}
|
|
@@ -4864,8 +4865,13 @@ static void vtd_class_init(ObjectClass *klass, void *data)
|
|
|
{
|
|
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
|
|
X86IOMMUClass *x86_class = X86_IOMMU_DEVICE_CLASS(klass);
|
|
|
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
|
|
|
|
|
|
- device_class_set_legacy_reset(dc, vtd_reset);
|
|
|
+ /*
|
|
|
+ * Use 'exit' reset phase to make sure all DMA requests
|
|
|
+ * have been quiesced during 'enter' or 'hold' phase
|
|
|
+ */
|
|
|
+ rc->phases.exit = vtd_reset_exit;
|
|
|
dc->vmsd = &vtd_vmstate;
|
|
|
device_class_set_props(dc, vtd_properties);
|
|
|
dc->hotpluggable = false;
|