All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Weil <sw@weilnetz.de>
To: Michael Tokarev <mjt@tls.msk.ru>, Alexander Graf <agraf@suse.de>
Cc: QEMU Developers <qemu-devel@nongnu.org>,
	qemu-stable <qemu-stable@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH] x86: only allow real mode to access 32bit without LMA
Date: Fri, 06 Dec 2013 19:57:05 +0100	[thread overview]
Message-ID: <52A21E01.8020603@weilnetz.de> (raw)
In-Reply-To: <52A21BE9.2070201@msgid.tls.msk.ru>

Am 06.12.2013 19:48, schrieb Michael Tokarev:
> 06.12.2013 16:52, Alexander Graf wrote:
>> When we're running in non-64bit mode with qemu-system-x86_64 we can
>> still end up with virtual addresses that are above the 32bit boundary
>> if a segment offset is set up.
>>
>> GNU Hurd does exactly that. It sets the segment offset to 0x80000000 and
>> puts its EIP value to 0x8xxxxxxx to access low memory.
>>
>> This doesn't hit us when we enable paging, as there we just mask away the
>> unused bits. But with real mode, we assume that vaddr == paddr which is
>> wrong in this case. Real hardware wraps the virtual address around at the
>> 32bit boundary. So let's do the same.
>>
>> This fixes booting GNU Hurd in qemu-system-x86_64 for me.
>>
>> Reported-by: Michael Tokarev <mjt@tls.msk.ru>
>> Signed-off-by: Alexander Graf <agraf@suse.de>
>> ---
>>  target-i386/helper.c | 6 ++++++
>>  1 file changed, 6 insertions(+)
>>
>> diff --git a/target-i386/helper.c b/target-i386/helper.c
>> index 7c196ff..ed965d6 100644
>> --- a/target-i386/helper.c
>> +++ b/target-i386/helper.c
>> @@ -531,6 +531,12 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,
>>  
>>      if (!(env->cr[0] & CR0_PG_MASK)) {
>>          pte = addr;
>> +#ifdef TARGET_X86_64
>> +        if (!(env->hflags & HF_LMA_MASK)) {
>> +            /* Without long mode we can only address 32bits in real mode */
>> +            pte = (uint32_t)pte;
>> +        }
>> +#endif
>>          virt_addr = addr & TARGET_PAGE_MASK;
>>          prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
>>          page_size = 4096;
>
> Tested-by: Michael Tokarev <mjt@tls.msk.ru>
>
> Well, it isn't much of testing, I too just run hurd image and see that
> it can work in qemu-x86_64 tcg mode, while without this patch it
> segfaults.
>
> Should I apply this to trivial queue? :)
>
> Thanks,
>
> /mjt

Maybe your trivial queue would be the fasted way to get it into the
official repository. :-)

I added qemu-stable to the addressees, because this is useful for the
stable branches as well.

Regards,

Stefan

  reply	other threads:[~2013-12-06 18:57 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-06 12:52 [Qemu-devel] [PATCH] x86: only allow real mode to access 32bit without LMA Alexander Graf
2013-12-06 17:46 ` Richard Henderson
2013-12-06 18:48 ` Michael Tokarev
2013-12-06 18:57   ` Stefan Weil [this message]
2013-12-07 18:49 ` [Qemu-trivial] " Michael Tokarev
2013-12-07 18:49   ` [Qemu-devel] " Michael Tokarev

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=52A21E01.8020603@weilnetz.de \
    --to=sw@weilnetz.de \
    --cc=agraf@suse.de \
    --cc=mjt@tls.msk.ru \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@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.