qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Ian Molton <ian.molton@collabora.co.uk>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] Address translation - virt->phys->ram
Date: Mon, 22 Feb 2010 13:59:30 +0000	[thread overview]
Message-ID: <4B828DC2.3000609@collabora.co.uk> (raw)

Hi folks,

I've been updating some old patches which make use of a function to
translate guest virtual addresses into pointers into the guest RAM.

As I understand it qemu has guest virtual and physical addresses, the
latter of which map somehow to host ram addresses.

The function which the code had been using appears not to work under
kvm, which leads me to think that qemu doesnt emulate the MMU (or at
least not in the same manner) when it is using kvm as opposed to pure
emulation.

If I turn off kvm, the patch works, albeit slowly. If I enable it, the
code takes the path which looks for the magic value (below).

Is there a 'proper' way to translate guest virtual addresses into host
RAM addresses?

Here is the code:-

static /*inline*/ void *get_phys_mem_addr(CPUState *env, target_ulong addr)
{
    int mmu_idx;
    int index;
        int i;

    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
    mmu_idx = cpu_mmu_index(env);

    if (__builtin_expect
        (env->tlb_table[mmu_idx][index].addr_code !=
         (addr & TARGET_PAGE_MASK), 0)) {
        target_ulong ret = cpu_get_phys_page_debug((CPUState *) env, addr);
        if (ret == -1) {
            fprintf(stderr,
                    "not in phys mem " TARGET_FMT_lx "(" TARGET_FMT_lx " "
                    TARGET_FMT_lx ")\n", addr,
                    env->tlb_table[mmu_idx][index].addr_code,
                    addr & TARGET_PAGE_MASK);
            fprintf(stderr, "cpu_x86_handle_mmu_fault = %d\n",
                    cpu_x86_handle_mmu_fault((CPUState *) env, addr, 0,
mmu_idx, 1));
            return NULL;
        } else {
            if (ret + TARGET_PAGE_SIZE <= ram_size) {
                return qemu_get_ram_ptr((ret + (((target_ulong) addr) &
(TARGET_PAGE_SIZE - 1))));
            } else {
                fprintf(stderr,
                        "cpu_get_phys_page_debug(env, " TARGET_FMT_lx ")
== "
                        TARGET_FMT_lx "\n", addr, ret);
                fprintf(stderr,
                        "ram_size= " TARGET_FMT_lx "\n", ret,
(target_ulong) ram_size);

        for(i = 0 ; i < ram_size-10 ; i++) {
                char *ptr = qemu_get_ram_ptr(i);
                if(!strncmp("magic_string", ptr, 10)) {
                        fprintf(stderr, "found magic_string at: %lx
%lx\n", i, ptr);
                        break;
                }
        }

                return qemu_get_ram_ptr(i-128); //Evil horrible hack
            }
        }
    } else
        return (void *) addr + env->tlb_table[mmu_idx][index].addend;
}

             reply	other threads:[~2010-02-22 14:00 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-22 13:59 Ian Molton [this message]
2010-02-22 14:35 ` [Qemu-devel] Address translation - virt->phys->ram Anthony Liguori
2010-02-22 16:46   ` Ian Molton
2010-02-22 16:52     ` Anthony Liguori
2010-02-22 17:47       ` Ian Molton
2010-02-22 18:56         ` Alexander Graf
2010-02-23 15:46           ` Ian Molton
2010-02-23 15:54             ` Alexander Graf
2010-02-23 16:21         ` Anthony Liguori

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=4B828DC2.3000609@collabora.co.uk \
    --to=ian.molton@collabora.co.uk \
    --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).