114 lines
4.7 KiB
Diff
114 lines
4.7 KiB
Diff
|
|
From bc08940ad3c75da49e05c596f79e9e0164573709 Mon Sep 17 00:00:00 2001
|
||
|
|
From: gongchangsui <gongchangsui@outlook.com>
|
||
|
|
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 <gongchangsui@outlook.com>
|
||
|
|
---
|
||
|
|
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
|
||
|
|
|