On 18/04/13 09:36:55, Peter Maydell wrote:
> There are 2 possible solution in my mind. One was to allow writing
memory if
> this page originally had write access. This is a single line fix
and a patch
> is below.
My worry here is that this will mean that writes by the
debugger won't trigger the "code area has been written, QEMU
must throw away any cached translated code for that region"
check. This is a tricky area of the code...
Thanks for your comments. I have observed that in this case, code does
end up calling
tb_invalidate_phys_page() which should invalidate the translated code.
Please see the call
stack below.
Also the comments in the page_unprotect() and page_check_range() seem
to suggest that code
was written with similar case in mind.
page_check_range()
/* unprotect the page if it was put read-only because it
contains translated code */
if (!(p->flags & PAGE_WRITE)) {
if (!page_unprotect(addr, 0, NULL)) {
return -1;
}
page_unprotect()
/* if the page was really writable, then we change its
protection back to writable */
if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) {
Having said that, I am open to other ideas to solve this problem. The
2nd idea I have was to not add
write protection to a page if it meets certain condition as I described
in my original email. Does that look
like a better solution to you?
tb_invalidate_phys_page() at translate-all.c:1,157 0x800d1321
page_unprotect() at translate-all.c:1,811 0x800d1f8c
page_check_range() at translate-all.c:1,768 0x800d20a9
access_ok() at qemu.h:286 0x8002ab7c
lock_user() at qemu.h:397 0x8002ab7c
cpu_memory_rw_debug() at exec.c:1,851 0x8002ab7c
target_memory_rw_debug() at gdbstub.c:49 0x8004610a
gdb_handle_packet() at gdbstub.c:2,273 0x8004610a
gdb_read_byte() at gdbstub.c:2,728 0x80046ef5
page_unprotect() at translate-all.c:1,811 0x800d1f87
page_check_range() at translate-all.c:1,768 0x800d20a9
access_ok() at qemu.h:286 0x8002ab7c
lock_user() at qemu.h:397 0x8002ab7c
cpu_memory_rw_debug() at exec.c:1,851 0x8002ab7c
target_memory_rw_debug() at gdbstub.c:49 0x8004610a
gdb_handle_packet() at gdbstub.c:2,273 0x8004610a
gdb_read_byte() at gdbstub.c:2,728 0x80046ef5
gdb_handlesig() at gdbstub.c:2,812 0x80046ef5
Regards,
Abid
thanks
-- PMM