qemu/hw-misc-support-tkm-use-mem2-memory.patch
Jiabo Feng dddaf7aa9e QEMU update to version 8.2.0-26:
- vdpa-dev: Fix initialisation order to restore VDUSE compatibility
- tcg: Allow top bit of SIMD_DATA_BITS to be set in simd_desc()
- migration: fix-possible-int-overflow
- target/m68k: Map FPU exceptions to FPSR register
- qemu-options: Fix CXL Fixed Memory Window interleave-granularity typo
- hvf: arm: Fix encodings for ID_AA64PFR1_EL1 and debug System registers
- hw/intc/arm_gic: Fix handling of NS view of GICC_APR<n>
- qio: Inherit follow_coroutine_ctx across TLS
- target/riscv: Fix the element agnostic function problem
- accel/tcg: Fix typo causing tb->page_addr[1] to not be recorded
- tcg/loongarch64: Fix tcg_out_movi vs some pcrel pointers
- migration: Fix file migration with fdset
- ui/vnc: don't return an empty SASL mechlist to the client
- target/arm: Fix FJCVTZS vs flush-to-zero
- hw/ppc/e500: Prefer QOM cast
- sphinx/qapidoc: Fix to generate doc for explicit, unboxed arguments
- hw/ppc/e500: Remove unused "irqs" parameter
- hw/ppc/e500: Add missing device tree properties to i2c controller node
- hw/i386/amd_iommu: Don't leak memory in amdvi_update_iotlb()
- hw/arm/mps2-tz.c: fix RX/TX interrupts order
- target/i386: csv: Add support to migrate the incoming context for CSV3 guest
- target/i386: csv: Add support to migrate the outgoing context for CSV3 guest
- target/i386: csv: Add support to migrate the incoming page for CSV3 guest
- target/i386: csv: Add support to migrate the outgoing page for CSV3 guest
- linux-headers: update kernel headers to include CSV3 migration cmds
- vfio: Only map shared region for CSV3 virtual machine
- vga: Force full update for CSV3 guest
- target/i386: csv: Load initial image to private memory for CSV3 guest
- target/i386: csv: Do not register/unregister guest secure memory for CSV3 guest
- target/i386: cpu: Populate CPUID 0x8000_001F when CSV3 is active
- target/i386: csv: Add command to load vmcb to CSV3 guest memory
- target/i386: csv: Add command to load data to CSV3 guest memory
- target/i386: csv: Add command to initialize CSV3 context
- target/i386: csv: Add CSV3 context
- next-kbd: convert to use qemu_input_handler_register()
- qemu/bswap: Undefine CPU_CONVERT() once done
- exec/memop: Remove unused memop_big_endian() helper
- hw/nvme: fix handling of over-committed queues
- 9pfs: fix crash on 'Treaddir' request
- hw/misc/psp: Pin the hugepage memory specified by mem2 during use for psp
- hw/misc: support tkm use mem2 memory
- hw/i386: add mem2 option for qemu
- kvm: add support for guest physical bits
- target/i386: add guest-phys-bits cpu property

Signed-off-by: Jiabo Feng <fengjiabo1@huawei.com>
(cherry picked from commit f45f35e88509a4ffa9f62332ee9601e9fe1f8d09)
2024-12-12 17:39:01 +08:00

124 lines
3.5 KiB
Diff

From 884c4d6bc101454f0e0f3c779bc1155024b056c3 Mon Sep 17 00:00:00 2001
From: xiongmengbiao <xiongmengbiao@hygon.cn>
Date: Wed, 29 May 2024 15:18:55 +0800
Subject: [PATCH] hw/misc: support tkm use mem2 memory
Signed-off-by: xiongmengbiao <xiongmengbiao@hygon.cn>
---
hw/misc/psp.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 63 insertions(+), 1 deletion(-)
diff --git a/hw/misc/psp.c b/hw/misc/psp.c
index 6ff2ceec10..4eb5ca0e0b 100644
--- a/hw/misc/psp.c
+++ b/hw/misc/psp.c
@@ -15,6 +15,9 @@
#include "migration/vmstate.h"
#include "hw/qdev-properties.h"
#include "sysemu/runstate.h"
+#include "exec/memory.h"
+#include "exec/address-spaces.h"
+#include "hw/i386/e820_memory_layout.h"
#include <sys/ioctl.h>
#define TYPE_PSP_DEV "psp"
@@ -46,14 +49,24 @@ struct PSPDevState {
enum VPSP_DEV_CTRL_OPCODE {
VPSP_OP_VID_ADD,
VPSP_OP_VID_DEL,
+ VPSP_OP_SET_DEFAULT_VID_PERMISSION,
+ VPSP_OP_GET_DEFAULT_VID_PERMISSION,
+ VPSP_OP_SET_GPA,
};
struct psp_dev_ctrl {
unsigned char op;
+ unsigned char resv[3];
union {
unsigned int vid;
+ // Set or check the permissions for the default VID
+ unsigned int def_vid_perm;
+ struct {
+ uint64_t gpa_start;
+ uint64_t gpa_end;
+ } gpa;
unsigned char reserved[128];
- } data;
+ } __attribute__ ((packed)) data;
};
static void psp_dev_destroy(PSPDevState *state)
@@ -86,10 +99,32 @@ static void psp_dev_shutdown_notify(Notifier *notifier, void *data)
psp_dev_destroy(state);
}
+static MemoryRegion *find_memory_region_by_name(MemoryRegion *root, const char *name) {
+ MemoryRegion *subregion;
+ MemoryRegion *result;
+
+ if (strcmp(root->name, name) == 0)
+ return root;
+
+ QTAILQ_FOREACH(subregion, &root->subregions, subregions_link) {
+ result = find_memory_region_by_name(subregion, name);
+ if (result) {
+ return result;
+ }
+ }
+
+ return NULL;
+}
+
static void psp_dev_realize(DeviceState *dev, Error **errp)
{
+ int i;
+ char mr_name[128] = {0};
struct psp_dev_ctrl ctrl = { 0 };
PSPDevState *state = PSP_DEV(dev);
+ MemoryRegion *root_mr = get_system_memory();
+ MemoryRegion *find_mr = NULL;
+ uint64_t ram2_start = 0, ram2_end = 0;
state->dev_fd = qemu_open_old(PSP_DEV_PATH, O_RDWR);
if (state->dev_fd < 0) {
@@ -104,9 +139,36 @@ static void psp_dev_realize(DeviceState *dev, Error **errp)
goto end;
}
+ for (i = 0 ;; ++i) {
+ sprintf(mr_name, "mem2-%d", i);
+ find_mr = find_memory_region_by_name(root_mr, mr_name);
+ if (!find_mr)
+ break;
+
+ if (!ram2_start)
+ ram2_start = find_mr->addr;
+ ram2_end = find_mr->addr + find_mr->size - 1;
+ }
+
+ if (ram2_start != ram2_end) {
+ ctrl.op = VPSP_OP_SET_GPA;
+ ctrl.data.gpa.gpa_start = ram2_start;
+ ctrl.data.gpa.gpa_end = ram2_end;
+ if (ioctl(state->dev_fd, PSP_IOC_VPSP_OPT, &ctrl) < 0) {
+ error_setg(errp, "psp_dev_realize VPSP_OP_SET_GPA (start 0x%lx, end 0x%lx), return %d",
+ ram2_start, ram2_end, -errno);
+ goto del_vid;
+ }
+ }
+
state->enabled = true;
state->shutdown_notifier.notify = psp_dev_shutdown_notify;
qemu_register_shutdown_notifier(&state->shutdown_notifier);
+
+ return;
+del_vid:
+ ctrl.op = VPSP_OP_VID_DEL;
+ ioctl(state->dev_fd, PSP_IOC_VPSP_OPT, &ctrl);
end:
return;
}
--
2.41.0.windows.1