qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Fabrice Bellard <fabrice.bellard@free.fr>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] simulated memory instead of host memory
Date: Mon, 09 Jun 2003 22:18:16 +0200	[thread overview]
Message-ID: <3EE4EB88.5000203@free.fr> (raw)
In-Reply-To: 20030609213710.03f5677b.jrydberg@night.trouble.net

Johan Rydberg wrote:

> This is what my code generator emits for a memory store.  The value that
> should be stores is located in %ebx.  The virtual address in %eax.
> %ecx must be pushed on the stack to free a register.  
> 
>   40017160: 0000005b: push   %ecx
>   40017161: 0000005c: mov    0x805cce4,%ebp        pointer to mtcache
>   40017167: 00000062: mov    %eax,%ecx
>   40017169: 00000064: shr    $0xc,%ecx
>   4001716c: 00000067: and    $0xff,%ecx            256 entries
>   40017172: 0000006d: lea    0x0(%ebp,%ecx,8),%esi mtcache entry at %esi
>   40017176: 00000071: mov    %eax,%ecx
>   40017178: 00000073: and    $0xfffff000,%ecx      make tag
>   4001717e: 00000079: cmp    %ecx,0x0(%esi)        and compare
>   40017181: 0000007c: jne    0x00000439            miss -> slow way
>   40017187: 00000082: mov    0x4(%esi),%esi
>   4001718a: 00000085: add    %eax,%esi
>   4001718c: 00000087: mov    %ebx,0x0(%esi)        do the store
>   4001718f: 0000008a: pop    %ecx
> 
> Can you come to thing of a faster way to do it?  Note that I generate
> the code by hand (not using GCC).

Using a cache as you do is a good idea. You can save some insns, and 
more if you use differents bits of the address (do a mask with 0x7f8), 
but you would have less cache hits.

40017160: 0000005b: push   %ecx
40017167: 00000062: mov    %eax,%esi
40017169: 00000064: shr    $0xc,%esi
                     movl   %esi, %ecx
4001716c: 00000067: and    $0xff,%esi            256 entries
4001717e: 00000079: cmp    %ecx,0x805cee4(%esi,8)   compare
40017181: 0000007c: jne    0x00000439            miss -> slow way
40017187: 00000082: add    0x805cee8(%esi,8),%eax
4001718c: 00000087: mov    %ebx,0x0(%eax)        do the store
4001718f: 0000008a: pop    %ecx

I guess GCC should give nearly optimal code.

> : 3) An even faster solution is to use Linux memory mappings to emulate 
> : the MMU. The Linux MM state of the process would be considered as a TLB 
> : of the virtual x86 MMU state. It works only if the host has <= 4KB page 
> : size and if the guest OS don't do any mapping in memory >= 0xc0000000. 
> : With Linux as guest it would work as you can easily change the base 
> : address of the kernel. The restriction about mappings >= 0xc0000000 
> : could be suppressed with a small (but tricky) kernel patch which would 
> : allow to mmap() at addresses >= 0xc0000000.
> 
> Since it isn't very portable I don't think it is an option.

Well, if you generate code it is already not portable :-)

Fabrice.

  reply	other threads:[~2003-06-09 20:18 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-06-09 18:31 [Qemu-devel] simulated memory instead of host memory Johan Rydberg
2003-06-09 19:09 ` Fabrice Bellard
2003-06-09 19:37   ` Johan Rydberg
2003-06-09 20:18     ` Fabrice Bellard [this message]
2003-06-09 20:43       ` Johan Rydberg

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=3EE4EB88.5000203@free.fr \
    --to=fabrice.bellard@free.fr \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).