Implement tpm_ppi_uninit and use it for proper teardown of the PPI in tpm_crb_unrealize.
Signed-off-by: Stefan Berger <[email protected]> --- hw/tpm/tpm_crb.c | 3 +++ hw/tpm/tpm_ppi.c | 10 ++++++++++ hw/tpm/tpm_ppi.h | 10 ++++++++++ 3 files changed, 23 insertions(+) diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c index cd46b2e888..5c50a79936 100644 --- a/hw/tpm/tpm_crb.c +++ b/hw/tpm/tpm_crb.c @@ -16,6 +16,7 @@ #include "qemu/osdep.h" +#include "qemu/memalign.h" #include "qemu/module.h" #include "qemu/error-report.h" #include "qapi/error.h" @@ -527,6 +528,8 @@ static void tpm_crb_unrealize(DeviceState *dev) if (s->migration_blocker) { migrate_del_blocker(&s->migration_blocker); } + + tpm_ppi_uninit(&s->ppi, get_system_memory(), OBJECT(s)); } static void tpm_crb_class_init(ObjectClass *klass, const void *data) diff --git a/hw/tpm/tpm_ppi.c b/hw/tpm/tpm_ppi.c index f0c34291dc..35baa083f2 100644 --- a/hw/tpm/tpm_ppi.c +++ b/hw/tpm/tpm_ppi.c @@ -57,3 +57,13 @@ void tpm_ppi_init(TPMPPI *tpmppi, MemoryRegion *m, memory_region_add_subregion(m, addr, &tpmppi->ram); } + +void tpm_ppi_uninit(TPMPPI *tpmppi, MemoryRegion *m, Object *obj) +{ + memory_region_del_subregion(m, &tpmppi->ram); + + vmstate_unregister_ram(&tpmppi->ram, DEVICE(obj)); + + qemu_vfree(tpmppi->buf); + tpmppi->buf = NULL; +} diff --git a/hw/tpm/tpm_ppi.h b/hw/tpm/tpm_ppi.h index 88f316ee95..c173889033 100644 --- a/hw/tpm/tpm_ppi.h +++ b/hw/tpm/tpm_ppi.h @@ -32,6 +32,16 @@ typedef struct TPMPPI { void tpm_ppi_init(TPMPPI *tpmppi, MemoryRegion *m, hwaddr addr, Object *obj); +/** + * tpm_ppi_uninit: + * @tpmppi: a TPMPPI + * @m: the address-space / MemoryRegion to use + * @obj: the owner object + * + * Function to unregister the TPM PPI region. + */ +void tpm_ppi_uninit(TPMPPI *tpmppi, MemoryRegion *m, Object *obj); + /** * tpm_ppi_reset: * @tpmppi: a TPMPPI -- 2.55.0
