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



Reply via email to