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

Abid, Hafiz hafiz_abid@mentor.com
Thu Apr 18 09:28:00 GMT 2013


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
> 



More information about the Gdb mailing list