diff options
Diffstat (limited to 'results/classifier/accel-gemma3:12b/kvm/1625216')
| -rw-r--r-- | results/classifier/accel-gemma3:12b/kvm/1625216 | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/results/classifier/accel-gemma3:12b/kvm/1625216 b/results/classifier/accel-gemma3:12b/kvm/1625216 new file mode 100644 index 000000000..5bf49f9b2 --- /dev/null +++ b/results/classifier/accel-gemma3:12b/kvm/1625216 @@ -0,0 +1,72 @@ + +memory writes via gdb don't work for memory mapped hardware + +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_memory_write_rom(...). a function that writes to the +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 85bc2a15121e8bcd9f15eb75794a1eacca9d84bd HEAD ../exec.c +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_rw_debug(CPUState *cpu, target_ulong addr, + int l; + hwaddr phys_addr; + target_ulong page; ++ bool is_memcpy_access; + + while (len > 0) { + int asidx; +@@ -3691,13 +3692,32 @@ int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr, + 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_ases[asidx].as; ++ MemoryRegion *mr = address_space_translate(as, phys_addr, &addr1, &mr_len, is_write); ++ is_memcpy_access = memory_region_is_ram(mr) || memory_region_is_romd(mr); ++ if(mr_len < len) { ++ /* TODO, mimic more of the loop over mr chunks as ++ done in cpu_physical_memory_write_internal */ ++ 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) { + cpu_physical_memory_write_rom(cpu->cpu_ases[asidx].as, + phys_addr, buf, l); + } else { + address_space_rw(cpu->cpu_ases[asidx].as, phys_addr, + MEMTXATTRS_UNSPECIFIED, +- buf, l, 0); ++ buf, l, is_write); + } + len -= l; + buf += l; \ No newline at end of file |