memory writes via gdb don't work for memory mapped hardware
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
QEMU |
Expired
|
Undecided
|
Unassigned |
Bug Description
When I remote-debug a qemu-guest and attempt to write to a memory mapped location, the
write-handler for the concerned device will not be called. All write-requiests from
gdb are delegated to cpu_physical_
underlying ram-block.
I believe requests to memory mapped hardware should be delegated to
address_space_rw().
example:
;; a memory mapped device. No effect, the write-handler is not called
(gdb) set *0xfff3c000 = 48
;; a ram or rom-block. Thos works. The value is changed.
(gdb) set *0x100000 = 48
-------
Here's my suggested patch. As noted in the comment, it could perhaps be
improved for the (rare) case when the write-request from gdb spans multiple
memory regions.
$ git diff 85bc2a15121e8bc
diff --git a/exec.c b/exec.c
index c4f9036..45ef896 100644
--- a/exec.c
+++ b/exec.c
@@ -3676,6 +3676,7 @@ int cpu_memory_
int l;
hwaddr phys_addr;
target_ulong page;
+ bool is_memcpy_access;
while (len > 0) {
int asidx;
@@ -3691,13 +3692,32 @@ int cpu_memory_
if (l > len)
l = len;
phys_addr += (addr & ~TARGET_PAGE_MASK);
+
if (is_write) {
+ /* if ram/rom region we access the memory
+ via memcpy instead of via the cpu */
+ hwaddr mr_len, addr1;
+ AddressSpace *as = cpu->cpu_
+ MemoryRegion *mr = address_
+ is_memcpy_access = memory_
+ if(mr_len < len) {
+ /* TODO, mimic more of the loop over mr chunks as
+ done in cpu_physical_
+ printf("warning: we dont know whether all bytes "
+ "to be written are ram/rom or io\n");
+ }
+ }
+ else {
+ is_memcpy_access = false;
+ }
+
+ if (is_write && is_memcpy_access) {
} else {
- buf, l, 0);
+ buf, l, is_write);
}
len -= l;
buf += l;
tags: | added: gdbstub |
The code has moved around somewhat, but it's still true that writes by gdb don't go to devices -- cpu_memory_ rw_debug( ) calls address_ space_write_ rom() which calls address_ space_write_ rom_internal( ) which simply skips writing for non-ram/rom regions.
I'm not sure if the gdb accesses should be special cased or if we should just make address_ space_write_ rom() write to devices (which would also affect eg ELF file loading, which is useful in some odd corner cases).