This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Qemu-devel] GDB function call failing due to memory protection of stack page in QEMU


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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]