[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC][PATCH v1 06/10] Introduce new MemoryDebugOps which hook into guest
From: |
Yuan Yao |
Subject: |
[RFC][PATCH v1 06/10] Introduce new MemoryDebugOps which hook into guest virtual and physical memory debug interfaces such as cpu_memory_rw_debug, to allow vendor specific assist/hooks for debugging and delegating accessing the guest memory. This is required for example in case of AMD SEV platform where the guest memory is encrypted and a SEV specific debug assist/hook will be required to access the guest memory. |
Date: |
Thu, 6 May 2021 09:40:33 +0800 |
From: Ashish Kalra <ashish.kalra@amd.com>
The MemoryDebugOps are used by cpu_memory_rw_debug() and default to
address_space_read and address_space_write_rom.
Yuan Yao: Exports the physical_memory_debug_ops variable for functions
in target/i386/helper.c
Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
Signed-off-by: Yuan Yao <yuan.yao@intel.com>
diff --git a/include/exec/memory.h b/include/exec/memory.h
index 7e6fdcb8e4..0250b50beb 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -2498,6 +2498,20 @@ MemTxResult
address_space_write_cached_slow(MemoryRegionCache *cache,
hwaddr addr, const void *buf,
hwaddr len);
+typedef struct MemoryDebugOps {
+ MemTxResult (*read)(AddressSpace *as, hwaddr phys_addr,
+ MemTxAttrs attrs, void *buf,
+ hwaddr len);
+ MemTxResult (*write)(AddressSpace *as, hwaddr phys_addr,
+ MemTxAttrs attrs, const void *buf,
+ hwaddr len);
+} MemoryDebugOps;
+
+// Export for functions in target/i386/helper.c
+extern const MemoryDebugOps *physical_memory_debug_ops;
+
+void address_space_set_debug_ops(const MemoryDebugOps *ops);
+
static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)
{
if (is_write) {
diff --git a/softmmu/physmem.c b/softmmu/physmem.c
index 85034d9c11..c8029f69ad 100644
--- a/softmmu/physmem.c
+++ b/softmmu/physmem.c
@@ -171,6 +171,18 @@ struct DirtyBitmapSnapshot {
unsigned long dirty[];
};
+static const MemoryDebugOps default_debug_ops = {
+ .read = address_space_read,
+ .write = address_space_write_rom
+};
+
+const MemoryDebugOps *physical_memory_debug_ops = &default_debug_ops;
+
+void address_space_set_debug_ops(const MemoryDebugOps *ops)
+{
+ physical_memory_debug_ops = ops;
+}
+
static void phys_map_node_reserve(PhysPageMap *map, unsigned nodes)
{
static unsigned alloc_hint = 16;
@@ -3396,6 +3408,10 @@ int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
page = addr & TARGET_PAGE_MASK;
phys_addr = cpu_get_phys_page_attrs_debug(cpu, page, &attrs);
asidx = cpu_asidx_from_attrs(cpu, attrs);
+
+ /* set debug attrs to indicate memory access is from the debugger */
+ attrs.debug = 1;
+
/* if no physical page mapped, return an error */
if (phys_addr == -1)
return -1;
@@ -3404,11 +3420,13 @@ int cpu_memory_rw_debug(CPUState *cpu, target_ulong
addr,
l = len;
phys_addr += (addr & ~TARGET_PAGE_MASK);
if (is_write) {
- res = address_space_write_rom(cpu->cpu_ases[asidx].as, phys_addr,
- attrs, buf, l);
+ res = physical_memory_debug_ops->write(cpu->cpu_ases[asidx].as,
+ phys_addr,
+ attrs, buf, l);
} else {
- res = address_space_read(cpu->cpu_ases[asidx].as, phys_addr,
- attrs, buf, l);
+ res = physical_memory_debug_ops->read(cpu->cpu_ases[asidx].as,
+ phys_addr,
+ attrs, buf, l);
}
if (res != MEMTX_OK) {
return -1;
--
2.20.1
- [RFC][PATCH v1 00/10] Enable encrypted guest memory access in QEMU, Yuan Yao, 2021/05/05
- [RFC][PATCH v1 01/10] Extend the MemTxAttrs to include a 'debug' flag. The flag can be used as general indicator that operation was triggered by the debugger., Yuan Yao, 2021/05/05
- [RFC][PATCH v1 02/10] Currently, guest memory access for debugging purposes is performed using memcpy(). Extend the 'struct MemoryRegion' to include new callbacks that can be used to override the use of memcpy() with something else., Yuan Yao, 2021/05/05
- [RFC][PATCH v1 03/10] Introduce new interface KVMState::set_mr_debug_ops and its wrapper, Yuan Yao, 2021/05/05
- [RFC][PATCH v1 04/10] Implements the common MemoryRegion::ram_debug_ops for encrypted guests, Yuan Yao, 2021/05/05
- [RFC][PATCH v1 05/10] Set the RAM's MemoryRegion::debug_ops for INTEL TD guests, Yuan Yao, 2021/05/05
- [RFC][PATCH v1 06/10] Introduce new MemoryDebugOps which hook into guest virtual and physical memory debug interfaces such as cpu_memory_rw_debug, to allow vendor specific assist/hooks for debugging and delegating accessing the guest memory. This is required for example in case of AMD SEV platform where the guest memory is encrypted and a SEV specific debug assist/hook will be required to access the guest memory.,
Yuan Yao <=
- [RFC][PATCH v1 07/10] Add new address_space_read and address_space_write debug helper interfaces which can be invoked by vendor specific guest memory debug assist/hooks to do guest RAM memory accesses using the added MemoryRegion callbacks., Yuan Yao, 2021/05/05
- [RFC][PATCH v1 08/10] Introduce debug version of physical memory read/write API, Yuan Yao, 2021/05/05
- [RFC][PATCH v1 09/10] Change the monitor and other commands and gdbstub to use the debug API, Yuan Yao, 2021/05/05
- [RFC][PATCH v1 10/10] Introduce new CPUClass::get_phys_page_attrs_debug implementation for encrypted guests, Yuan Yao, 2021/05/05