@@ -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);
@@ -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
@@ -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,
@@ -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 */
@@ -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