From 6bf70e3e35815eb04555c150176692b18eec2241 Mon Sep 17 00:00:00 2001 From: Yonghua Huang Date: Thu, 6 Jan 2022 17:27:43 +0300 Subject: [PATCH] dm: add ssram support for user VM Hook ssram init && de-init functions to vdev devices lifecycle management: 1) initialize ssram when vdev devices are initialized. 2) de-initialize ssram when vdev devices are reset or destroyed. notes: ssram configuration data can be released only when user VM shutdown, hence it can't be done in deinit_vssram(). - VM reboot: do deinit_vssram() only. - VM shutdown: do both deinit_vssram() and clean_vssram_config(). Tracked-On: #7010 Signed-off-by: Yonghua Huang Acked-by: Wang Yu1 --- devicemodel/core/main.c | 15 +++++++++++++++ devicemodel/hw/platform/vssram/vssram.c | 22 ++++++++++++++++++++++ devicemodel/include/vssram.h | 1 + 3 files changed, 38 insertions(+) diff --git a/devicemodel/core/main.c b/devicemodel/core/main.c index 65814a1b0..772b0d34c 100644 --- a/devicemodel/core/main.c +++ b/devicemodel/core/main.c @@ -484,6 +484,9 @@ vm_init_vdevs(struct vmctx *ctx) if (debugexit_enabled) init_debugexit(); + if ((ssram) && (init_vssram(ctx) < 0)) + goto ssram_fail; + ret = monitor_init(ctx); if (ret < 0) goto monitor_fail; @@ -505,6 +508,9 @@ pci_fail: deinit_mmio_devs(ctx); mmio_dev_fail: monitor_close(); +ssram_fail: + if (ssram) + deinit_vssram(ctx); monitor_fail: if (debugexit_enabled) deinit_debugexit(); @@ -539,6 +545,9 @@ vm_deinit_vdevs(struct vmctx *ctx) if (debugexit_enabled) deinit_debugexit(); + if (ssram) + deinit_vssram(ctx); + vhpet_deinit(ctx); vpit_deinit(ctx); vrtc_deinit(ctx); @@ -574,6 +583,9 @@ vm_reset_vdevs(struct vmctx *ctx) if (debugexit_enabled) deinit_debugexit(); + if (ssram) + deinit_vssram(ctx); + vhpet_deinit(ctx); vpit_deinit(ctx); vrtc_deinit(ctx); @@ -591,6 +603,9 @@ vm_reset_vdevs(struct vmctx *ctx) if (debugexit_enabled) init_debugexit(); + if (ssram) + init_vssram(ctx); + ioapic_init(ctx); init_pci(ctx); diff --git a/devicemodel/hw/platform/vssram/vssram.c b/devicemodel/hw/platform/vssram/vssram.c index 61e08849d..7a10a9a3a 100644 --- a/devicemodel/hw/platform/vssram/vssram.c +++ b/devicemodel/hw/platform/vssram/vssram.c @@ -1302,6 +1302,28 @@ exit: } return status; } + +/** + * @brief De-initialize software SRAM device + * + * @param ctx Pointer to context of user VM. + * + * @return void + */ +void deinit_vssram(struct vmctx *ctx) +{ + vssram_close_buffers(); + if (vssram_buffers) { + free(vssram_buffers); + vssram_buffers = NULL; + } + + if (vrtct_table != NULL) { + free(vrtct_table); + vrtct_table = NULL; + } +} + /** * @brief Cleanup vSSRAM configurations resource. * diff --git a/devicemodel/include/vssram.h b/devicemodel/include/vssram.h index f7b43a6ba..f31c8c1c7 100644 --- a/devicemodel/include/vssram.h +++ b/devicemodel/include/vssram.h @@ -52,6 +52,7 @@ uint64_t get_vssram_size(void); uint8_t *get_vssram_vrtct(void); void clean_vssram_configs(void); int init_vssram(struct vmctx *ctx); +void deinit_vssram(struct vmctx *ctx); int parse_vssram_buf_params(const char *opt); #endif /* RTCT_H */