From bc08940ad3c75da49e05c596f79e9e0164573709 Mon Sep 17 00:00:00 2001 From: gongchangsui Date: Mon, 17 Mar 2025 02:56:40 -0400 Subject: [PATCH] backends: VirtCCA: cvm_gpa_start supports both 1GB and 3GB For TMM versions 2.1 and above, `cvm_gpa_start` is 1GB, while for versions prior to 2.1, `cvm_gpa_start` is 3GB. Shared huge page memory supports both `cvm_gpa_start` values. Signed-off-by: gongchangsui --- backends/hostmem-file.c | 17 ++++++++++++++--- hw/arm/virt.c | 1 + hw/core/numa.c | 2 +- include/exec/memory.h | 11 +++++++---- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c index 891fe4ac4a..ce63a372a3 100644 --- a/backends/hostmem-file.c +++ b/backends/hostmem-file.c @@ -27,6 +27,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(HostMemoryBackendFile, MEMORY_BACKEND_FILE) bool virtcca_shared_hugepage_mapped = false; uint64_t virtcca_cvm_ram_size = 0; +uint64_t virtcca_cvm_gpa_start = 0; struct HostMemoryBackendFile { HostMemoryBackend parent_obj; @@ -101,8 +102,16 @@ virtcca_shared_backend_memory_alloc(char *mem_path, uint32_t ram_flags, Error ** error_report("parse virtcca share memory path failed"); exit(1); } - if (virtcca_cvm_ram_size >= VIRTCCA_SHARED_HUGEPAGE_MAX_SIZE) { - size = VIRTCCA_SHARED_HUGEPAGE_MAX_SIZE; + + /* + * 1) CVM_GPA_START = 3GB --> fix size = 1GB + * 2) CVM_GPA_START = 1GB && ram_size >= 3GB --> size = 3GB + * 3) CVM_GPA_START = 1GB && ram_size < 3GB --> size = ram_size + */ + if (virtcca_cvm_gpa_start != DEFAULT_VM_GPA_START) { + size = VIRTCCA_SHARED_HUGEPAGE_ADDR_LIMIT - virtcca_cvm_gpa_start; + } else if (virtcca_cvm_ram_size >= VIRTCCA_SHARED_HUGEPAGE_ADDR_LIMIT - DEFAULT_VM_GPA_START) { + size = VIRTCCA_SHARED_HUGEPAGE_ADDR_LIMIT - DEFAULT_VM_GPA_START; } virtcca_shared_hugepage = g_new(MemoryRegion, 1); @@ -172,7 +181,9 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) fb->mem_path, fb->offset, errp); g_free(name); - if (virtcca_cvm_enabled() && backend->share && !virtcca_shared_hugepage_mapped) { + if (virtcca_cvm_enabled() && backend->share && + (strcmp(fb->mem_path, "/dev/shm") != 0) && + !virtcca_shared_hugepage_mapped) { virtcca_shared_backend_memory_alloc(fb->mem_path, ram_flags, errp); } #endif diff --git a/hw/arm/virt.c b/hw/arm/virt.c index 6c5611826c..3c31d3667e 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -2063,6 +2063,7 @@ static void virt_set_memmap(VirtMachineState *vms, int pa_bits) if (tmi_version < MIN_TMI_VERSION_FOR_UEFI_BOOTED_CVM) { vms->memmap[VIRT_MEM].base = 3 * GiB; } + virtcca_cvm_gpa_start = vms->memmap[VIRT_MEM].base; vms->memmap[VIRT_MEM].size = ms->ram_size; info_report("[qemu] fix VIRT_MEM range 0x%llx - 0x%llx\n", (unsigned long long)(vms->memmap[VIRT_MEM].base), (unsigned long long)(vms->memmap[VIRT_MEM].base + ms->ram_size)); diff --git a/hw/core/numa.c b/hw/core/numa.c index c691578ef5..98d896e687 100644 --- a/hw/core/numa.c +++ b/hw/core/numa.c @@ -655,7 +655,7 @@ static void virtcca_shared_memory_configuration(MachineState *ms) memory_region_init_alias(alias_mr, NULL, "alias-mr", virtcca_shared_hugepage, 0, int128_get64(virtcca_shared_hugepage->size)); memory_region_add_subregion(address_space_virtcca_shared_memory.root, - VIRTCCA_GPA_START, alias_mr); + virtcca_cvm_gpa_start, alias_mr); } void numa_complete_configuration(MachineState *ms) diff --git a/include/exec/memory.h b/include/exec/memory.h index 33778f5c64..c14dc69d27 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -243,14 +243,17 @@ typedef struct IOMMUTLBEvent { /* RAM FD is opened read-only */ #define RAM_READONLY_FD (1 << 11) -/* The GPA range of the VirtCCA bounce buffer is from 1GB to 4GB. */ -#define VIRTCCA_SHARED_HUGEPAGE_MAX_SIZE 0xc0000000ULL +/* The address limit of the VirtCCA bounce buffer is 4GB. */ +#define VIRTCCA_SHARED_HUGEPAGE_ADDR_LIMIT 0x100000000ULL /* The VirtCCA shared hugepage memory granularity is 1GB */ #define VIRTCCA_SHARED_HUGEPAGE_ALIGN 0x40000000ULL -/* The GPA starting address of the VirtCCA CVM is 1GB */ -#define VIRTCCA_GPA_START 0x40000000ULL +/* The default GPA starting address of VM is 1GB */ +#define DEFAULT_VM_GPA_START 0x40000000ULL + +/* The GPA starting address of the VirtCCA CVM is 1GB or 3GB */ +extern uint64_t virtcca_cvm_gpa_start; extern uint64_t virtcca_cvm_ram_size; -- 2.41.0.windows.1