All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Weil <weil@mail.berlios.de>
To: QEMU Developers <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [Bug][PATCH] Fatal error caused by wrong memory access
Date: Fri, 30 Nov 2007 23:46:56 +0100	[thread overview]
Message-ID: <475092E0.30308@mail.berlios.de> (raw)
In-Reply-To: <462682F7.30600@mail.berlios.de>

[-- Attachment #1: Type: text/plain, Size: 2427 bytes --]

What about my bug report? Up to now I got no replies.

Please include the patch in CVS HEAD - or tell me why you won't do so.

Kind regards
Stefan

Stefan Weil schrieb:
> Are there no comments?
> What is needed to get this fixed in QEMU CVS?
> Do you need additional information?
>
> Stefan
>
> Here is a quick hack patch for this problem:
>
> Index: cpu-exec.c
> ===================================================================
> RCS file: /sources/qemu/qemu/cpu-exec.c,v
> retrieving revision 1.100
> diff -u -b -B -r1.100 cpu-exec.c
> --- cpu-exec.c 9 Apr 2007 22:45:36 -0000 1.100
> +++ cpu-exec.c 18 Apr 2007 20:41:44 -0000
> @@ -140,8 +140,12 @@
> virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
> phys_page2 = -1;
> if ((pc & TARGET_PAGE_MASK) != virt_page2) {
> + if (tb->size == 0) {
> + printf("Bad code in QEMU %s:%u\n", __FILE__, __LINE__);
> + } else {
> phys_page2 = get_phys_addr_code(env, virt_page2);
>
> }
>
> + }
> tb_link_phys(tb, phys_pc, phys_page2);
>
> found:
>
> Stefan Weil schrieb:
>> When the program counter is at the very start of a memory block
>> and there is no page allocated before this block, QEMU may fail
>> with a fatal error ("Trying to execute code outside RAM or ROM").
>>
>> In my case, a MIPS system had code in flash starting at 0xb0000000.
>> I had a remote debugger attached to the emulated MIPS system and
>> set a breakpoint at 0xb0000000. When the breakpoint is reached,
>> QEMU terminates while accessing 0xaffff000 (start of page before
>> the breakpoint). No crash occurs when the breakpoint is set at
>> 0xb0000004 or higher addresses or without a breakpoint.
>>
>> A first workaround was to allocate a special page for the debugger
>> at 0xaffff000. Then I examined the problem and saw that it was not
>> caused by the debugger but by QEMU. This code at cpu-exec.c:138
>> triggers the fatal error:
>>
>> /* check next page if needed */
>> virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
>> phys_page2 = -1;
>> if ((pc & TARGET_PAGE_MASK) != virt_page2) {
>> phys_page2 = get_phys_addr_code(env, virt_page2);
>> }
>> tb_link_phys(tb, phys_pc, phys_page2);
>>
>> In my case, tb->size == 0, so virt_page2 is an invalid page just
>> before the first valid page. This triggers the fatal error in
>> get_phys_addr_code. This might occur for any architecture.
>>
>> A quick hack could check for tb->size == 0, but maybe there is a
>> better solution...
>>
>> Stefan

[-- Attachment #2: cpu-exec.patch --]
[-- Type: text/x-diff, Size: 652 bytes --]

Index: cpu-exec.c
===================================================================
RCS file: /sources/qemu/qemu/cpu-exec.c,v
retrieving revision 1.126
diff -u -r1.126 cpu-exec.c
--- cpu-exec.c	23 Nov 2007 02:11:10 -0000	1.126
+++ cpu-exec.c	30 Nov 2007 22:43:22 -0000
@@ -140,7 +140,11 @@
     virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
     phys_page2 = -1;
     if ((pc & TARGET_PAGE_MASK) != virt_page2) {
+      if (tb->size == 0) {
+        printf("Bad code in QEMU %s:%u\n", __FILE__, __LINE__);
+      } else {
         phys_page2 = get_phys_addr_code(env, virt_page2);
+      }
     }
     tb_link_phys(tb, phys_pc, phys_page2);
 

  reply	other threads:[~2007-11-30 22:47 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-01 17:01 [Qemu-devel] [Bug] Fatal error caused by wrong memory access Stefan Weil
2007-04-18 20:43 ` Stefan Weil
2007-11-30 22:46   ` Stefan Weil [this message]
2007-12-12  0:29     ` [Qemu-devel] [Bug][PATCH] " andrzej zaborowski
2007-12-12 19:36       ` Stefan Weil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=475092E0.30308@mail.berlios.de \
    --to=weil@mail.berlios.de \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.