All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bob Breuer <breuerr@mc.net>
To: Blue Swirl <blauwirbel@gmail.com>
Cc: qemu-devel <qemu-devel@nongnu.org>,
	Artyom Tarasenko <atar4qemu@gmail.com>
Subject: Re: [Qemu-devel] Re: phys_page_find bug?
Date: Sun, 09 Jan 2011 21:57:17 -0600	[thread overview]
Message-ID: <4D2A839D.2050407@mc.net> (raw)
In-Reply-To: <AANLkTimKfUMg7CNb64vWYZhmxafk=eVtyXJQSG4txnuG@mail.gmail.com>

Blue Swirl wrote:
> On Mon, Nov 8, 2010 at 6:55 PM, Artyom Tarasenko <atar4qemu@gmail.com> wrote:
>   
>> On Fri, May 7, 2010 at 6:26 PM, Artyom Tarasenko
>> <atar4qemu@googlemail.com> wrote:
>>     
>>> phys_page_find (exec.c) returns sometimes a page for addresses where
>>> nothing is connected.
>>>
>>> One example, done with qemu-system-sparc -M SS-20
>>>
>>> ok f13ffff0 2f spacec@ .
>>>
>>> // The address translates correctly, in cpu_physical_memory_rw
>>> // addr== 0xff13ffff0 (where nothing is connected)
>>> // but then phys_page_find returns a nonzero and produces
>>>
>>> Unassigned mem read access of 1 byte to 0000000ff15ffff0 from xxxxx
>>>
>>> (note the "5" in the line above where "3" is expected)
>>>
>>> I wonder if this is only true for non-wired addresses, or whether
>>> phys_page_find can also
>>> find wrong pages for the addresses where something is connected?
>>>
>>> Or is my assumption is wrong and phys_page_find can return a page for
>>> not-connected
>>> addresses and the bug is actually in cpu_physical_memory_rw ?
>>>
>>> Is the qemu algorithm of working with the physical address space
>>> described somewhere?
>>>       
>> I tried to switch devices off and found that the bug is triggered by
>> registering escc.
>> It's harder to debug without escc, so I can't tell whether something
>> else is causing
>> the problem too.
>>
>> Is escc addressing somehow special?
>>     
>
> I don't think so, except that it lies close to the top of the physical
> address space.
>
>   
>>> Is the qemu algorithm of working with the physical address space described somewhere?
>>>       
>> I guess no one knows it anymore, since no-one cared to answer within a
>> half year :-/.
>>     
>
> There's of course good old exec.c, plenty of code and even some comments. ;-)
>   

You can also see this in SS-20 when OBP probes all the sbus slots.  Slot
2 with the tcx graphics shows an unexpected address:
Unassigned mem read access of 1 byte to 0000000e00000000 from ffd3f5e4
Unassigned mem read access of 1 byte to 0000000e10000000 from ffd3f5e4
Unassigned mem read access of 1 byte to 0000000020200000 from ffd3f5e4
Unassigned mem read access of 1 byte to 0000000e30000000 from ffd3f5e4

The 0202 should be e200 instead.

There's two bugs in phys_page_find_alloc().  When the bottom level L2
table is populated with IO_MEM_UNASSIGNED, region_offset is then used
for reporting the physical address.  First, region_offset may not be
aligned to the base address of the L2 region.  And second, region_offset
won't hold the full 36-bit address on a 32-bit host.

It seems that both can be fixed by returning NULL for unassigned
addresses from phys_page_find().  All callers already handle a NULL
return value.  Would this allow any further optimizations to be made?

Here's a patch to try:

diff --git a/exec.c b/exec.c
index 49c28b1..77b49c8 100644
--- a/exec.c
+++ b/exec.c
@@ -434,7 +434,11 @@ static PhysPageDesc
*phys_page_find_alloc(target_phys_addr_t index, int alloc)
 
 static inline PhysPageDesc *phys_page_find(target_phys_addr_t index)
 {
-    return phys_page_find_alloc(index, 0);
+    PhysPageDesc *pd = phys_page_find_alloc(index, 0);
+    if (pd && pd->phys_offset == IO_MEM_UNASSIGNED) {
+        return NULL;
+    }
+    return pd;
 }
 
 static void tlb_protect_code(ram_addr_t ram_addr);

  reply	other threads:[~2011-01-10  3:49 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-07 16:26 [Qemu-devel] phys_page_find bug? Artyom Tarasenko
2010-05-20 20:00 ` [Qemu-devel] " Artyom Tarasenko
2010-11-08 18:55 ` Artyom Tarasenko
2010-11-09 17:53   ` Blue Swirl
2011-01-10  3:57     ` Bob Breuer [this message]
2011-01-10 21:39       ` Blue Swirl
2011-01-11  6:49         ` Bob Breuer
2011-01-11  9:22         ` Artyom Tarasenko
2011-01-11 15:46           ` Bob Breuer
2011-02-04 11:44       ` Artyom Tarasenko

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=4D2A839D.2050407@mc.net \
    --to=breuerr@mc.net \
    --cc=atar4qemu@gmail.com \
    --cc=blauwirbel@gmail.com \
    --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.