diff options
Diffstat (limited to 'results/classifier/deepseek-2-tmp/output/device/1625216')
| -rw-r--r-- | results/classifier/deepseek-2-tmp/output/device/1625216 | 72 |
1 files changed, 0 insertions, 72 deletions
diff --git a/results/classifier/deepseek-2-tmp/output/device/1625216 b/results/classifier/deepseek-2-tmp/output/device/1625216 deleted file mode 100644 index 5bf49f9b..00000000 --- a/results/classifier/deepseek-2-tmp/output/device/1625216 +++ /dev/null @@ -1,72 +0,0 @@ - -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 |