[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC][PATCH v1 08/10] Introduce debug version of physical memory read/wr
From: |
Yuan Yao |
Subject: |
[RFC][PATCH v1 08/10] Introduce debug version of physical memory read/write API |
Date: |
Thu, 6 May 2021 09:40:35 +0800 |
From: Yuan Yao <yuan.yao@intel.com>
Add below APIs for reading/writing the physical memory, subsequent
patch will use them in monitor commands and gdbstub to support
encrypted guest debugging.
uint32_t x86_ldl_phys_debug(CPUState *cs, hwaddr addr);
uint64_t x86_ldq_phys_debug(CPUState *cs, hwaddr addr);
void cpu_physical_memory_rw_debug(hwaddr addr, void *buf,
hwaddr len, bool is_write);
void cpu_physical_memory_read_debug(hwaddr addr,
void *buf,
hwaddr len);
void cpu_physical_memory_write_debug(hwaddr addr,
const void *buf,
hwaddr len);
Signed-off-by: Yuan Yao <yuan.yao@intel.com>
diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
index 5a0a2d93e0..f77a9ecb60 100644
--- a/include/exec/cpu-common.h
+++ b/include/exec/cpu-common.h
@@ -69,6 +69,8 @@ size_t qemu_ram_pagesize_largest(void);
void cpu_physical_memory_rw(hwaddr addr, void *buf,
hwaddr len, bool is_write);
+void cpu_physical_memory_rw_debug(hwaddr addr, void *buf,
+ hwaddr len, bool is_write);
static inline void cpu_physical_memory_read(hwaddr addr,
void *buf, hwaddr len)
{
@@ -79,6 +81,18 @@ static inline void cpu_physical_memory_write(hwaddr addr,
{
cpu_physical_memory_rw(addr, (void *)buf, len, true);
}
+
+static inline void cpu_physical_memory_read_debug(hwaddr addr,
+ void *buf, hwaddr len)
+{
+ cpu_physical_memory_rw_debug(addr, buf, len, false);
+}
+static inline void cpu_physical_memory_write_debug(hwaddr addr,
+ const void *buf, hwaddr len)
+{
+ cpu_physical_memory_rw_debug(addr, (void *)buf, len, true);
+}
+
void *cpu_physical_memory_map(hwaddr addr,
hwaddr *plen,
bool is_write);
diff --git a/include/exec/memattrs.h b/include/exec/memattrs.h
index c8b56389d6..6d223ea196 100644
--- a/include/exec/memattrs.h
+++ b/include/exec/memattrs.h
@@ -60,6 +60,9 @@ typedef struct MemTxAttrs {
*/
#define MEMTXATTRS_UNSPECIFIED ((MemTxAttrs) { .unspecified = 1 })
+// Same as MEMTXATTRS_UNSPECIFIED but enable debug
+#define MEMTXATTRS_UNSPECIFIED_DEBUG ((MemTxAttrs) { .unspecified = 1, .debug
= 1 })
+
/* New-style MMIO accessors can indicate that the transaction failed.
* A zero (MEMTX_OK) response means success; anything else is a failure
* of some kind. The memory subsystem will bitwise-OR together results
diff --git a/softmmu/physmem.c b/softmmu/physmem.c
index 0fde02d325..ff6e215a3a 100644
--- a/softmmu/physmem.c
+++ b/softmmu/physmem.c
@@ -2910,6 +2910,19 @@ void cpu_physical_memory_rw(hwaddr addr, void *buf,
buf, len, is_write);
}
+void cpu_physical_memory_rw_debug(hwaddr addr, void *buf,
+ hwaddr len, bool is_write)
+{
+ if (is_write)
+ physical_memory_debug_ops->write(&address_space_memory,
+ addr, MEMTXATTRS_UNSPECIFIED_DEBUG,
+ buf, len);
+ else
+ physical_memory_debug_ops->read(&address_space_memory,
+ addr, MEMTXATTRS_UNSPECIFIED_DEBUG,
+ buf, len);
+}
+
enum write_rom_type {
WRITE_DATA,
FLUSH_CACHE,
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index e5dbe84d3a..7a8a1386fb 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -1960,6 +1960,8 @@ void x86_stl_phys_notdirty(CPUState *cs, hwaddr addr,
uint32_t val);
void x86_stw_phys(CPUState *cs, hwaddr addr, uint32_t val);
void x86_stl_phys(CPUState *cs, hwaddr addr, uint32_t val);
void x86_stq_phys(CPUState *cs, hwaddr addr, uint64_t val);
+uint32_t x86_ldl_phys_debug(CPUState *cs, hwaddr addr);
+uint64_t x86_ldq_phys_debug(CPUState *cs, hwaddr addr);
#endif
/* will be suppressed */
diff --git a/target/i386/helper.c b/target/i386/helper.c
index 618ad1c409..21edcb9204 100644
--- a/target/i386/helper.c
+++ b/target/i386/helper.c
@@ -663,4 +663,30 @@ void x86_stq_phys(CPUState *cs, hwaddr addr, uint64_t val)
address_space_stq(as, addr, val, attrs, NULL);
}
+
+uint32_t x86_ldl_phys_debug(CPUState *cs, hwaddr addr)
+{
+ uint32_t ret;
+ MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED_DEBUG;
+ int as_id = cpu_asidx_from_attrs(cs, attrs);
+ struct AddressSpace *as = cpu_get_address_space(cs, as_id);
+
+ physical_memory_debug_ops->read(as, addr, attrs,
+ &ret, sizeof(ret));
+
+ return tswap32(ret);
+}
+
+uint64_t x86_ldq_phys_debug(CPUState *cs, hwaddr addr)
+{
+ uint64_t ret;
+ MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED_DEBUG;
+ int as_id = cpu_asidx_from_attrs(cs, attrs);
+ struct AddressSpace *as = cpu_get_address_space(cs, as_id);
+
+ physical_memory_debug_ops->read(as, addr, attrs,
+ &ret, sizeof(ret));
+
+ return tswap64(ret);
+}
#endif
--
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, 2021/05/05
- [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 <=
- [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