From 6680208ed926bd2d5bec306da86698f0f6da6412 Mon Sep 17 00:00:00 2001 From: dongshen Date: Wed, 19 May 2021 17:33:03 -0700 Subject: [PATCH] dm: vmmapi: augment the vm_get_config() vmmapi to include a struct platform_info* parameter This allows users to retrieve and use the requested platform_info information from hypervisor Tracked-On: #6020 Reviewed-by: Wang, Yu1 Signed-off-by: dongshen --- devicemodel/core/vmmapi.c | 5 ++++- devicemodel/hw/platform/acpi/rtct.c | 2 +- devicemodel/include/public/vhm_ioctl_defs.h | 21 +++++++++++++++++++-- devicemodel/include/vmmapi.h | 2 +- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/devicemodel/core/vmmapi.c b/devicemodel/core/vmmapi.c index 9b53ad78c..7686b2cb7 100644 --- a/devicemodel/core/vmmapi.c +++ b/devicemodel/core/vmmapi.c @@ -712,7 +712,7 @@ vm_irqfd(struct vmctx *ctx, struct acrn_irqfd *args) } int -vm_get_config(struct vmctx *ctx, struct acrn_vm_config *vm_cfg) +vm_get_config(struct vmctx *ctx, struct acrn_vm_config *vm_cfg, struct platform_info *plat_info) { #define VM_CFG_BUFF_SIZE 0x8000 int i, err = 0; @@ -751,6 +751,9 @@ vm_get_config(struct vmctx *ctx, struct acrn_vm_config *vm_cfg) } memcpy((void *)vm_cfg, (void *)pcfg, sizeof(struct acrn_vm_config)); + if (plat_info != NULL) { + memcpy((void *)plat_info, (void *)&platform_info, sizeof(struct platform_info)); + } exit: free(configs_buff); diff --git a/devicemodel/hw/platform/acpi/rtct.c b/devicemodel/hw/platform/acpi/rtct.c index 357ce49f8..a77b94e42 100644 --- a/devicemodel/hw/platform/acpi/rtct.c +++ b/devicemodel/hw/platform/acpi/rtct.c @@ -337,7 +337,7 @@ uint8_t *build_vrtct(struct vmctx *ctx, void *cfg) vrtct->length = sizeof(struct acpi_table_hdr); vrtct->checksum = 0; - if (vm_get_config(ctx, &vm_cfg)) { + if (vm_get_config(ctx, &vm_cfg, NULL)) { pr_err("%s, get VM configuration fail.\n", __func__); goto error; } diff --git a/devicemodel/include/public/vhm_ioctl_defs.h b/devicemodel/include/public/vhm_ioctl_defs.h index cfb27f567..a5c7949f3 100644 --- a/devicemodel/include/public/vhm_ioctl_defs.h +++ b/devicemodel/include/public/vhm_ioctl_defs.h @@ -329,8 +329,25 @@ struct platform_info { /** version of this structure */ uint16_t version; - /** Align the size of version & hardware info to 128Bytes. */ - uint8_t reserved0[124]; + uint32_t l2_cat_shift; + uint32_t l3_cat_shift; + + #define MAX_PLATFORM_LAPIC_IDS 64U + /** pLAPIC ID list */ + uint8_t lapic_ids[MAX_PLATFORM_LAPIC_IDS]; + + /** + * sizeof(uint8_t reserved0[]) + sizeof(l2_cat_shift) + * + sizeof(l3_cat_shift) + sizeof(uint8_t lapic_ids[]) = 124 + * + * Note: + * 1. DM needs to use the same logic as hypervisor to calculate vLAPIC IDs + * based on physical APIC IDs and CPU affinity setting. + * + * 2. Can only support at most 116 cores. And it assumes LAPIC ID is 8bits + * (X2APIC mode supports 32 bits) + */ + uint8_t reserved0[116U - MAX_PLATFORM_LAPIC_IDS]; /** Configuration Information */ /** Maximum vCPU number for one VM. */ diff --git a/devicemodel/include/vmmapi.h b/devicemodel/include/vmmapi.h index 80b5b9c24..23f5c42a6 100644 --- a/devicemodel/include/vmmapi.h +++ b/devicemodel/include/vmmapi.h @@ -151,5 +151,5 @@ void vm_reset_watchdog(struct vmctx *ctx); int vm_ioeventfd(struct vmctx *ctx, struct acrn_ioeventfd *args); int vm_irqfd(struct vmctx *ctx, struct acrn_irqfd *args); -int vm_get_config(struct vmctx *ctx, struct acrn_vm_config *vm_cfg); +int vm_get_config(struct vmctx *ctx, struct acrn_vm_config *vm_cfg, struct platform_info *plat_info); #endif /* _VMMAPI_H_ */