vmem.c revision f5bc01c356e1fa924ed07aadf589b3663873593e
108c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych/* Copyright (C) 2007-2008 The Android Open Source Project
208c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych**
308c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych** This software is licensed under the terms of the GNU General Public
408c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych** License version 2, as published by the Free Software Foundation, and
508c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych** may be copied, distributed, and modified under those terms.
608c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych**
708c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych** This program is distributed in the hope that it will be useful,
808c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych** but WITHOUT ANY WARRANTY; without even the implied warranty of
908c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1008c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych** GNU General Public License for more details.
1108c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych*/
122ec695af7284adbedcdbc08a22d818b6bdd8990cDavid 'Digit' Turner#include "hw/hw.h"
13f5bc01c356e1fa924ed07aadf589b3663873593eDavid 'Digit' Turner#include "hw/android/goldfish/vmem.h"
1408c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych#ifdef TARGET_I386
1534c48ff1e3ad5cd2084ca40188754d45f423750bDavid 'Digit' Turner#include "sysemu/kvm.h"
1608c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych#endif
1708c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych
1808c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych
1908c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych// Both safe_memory_rw_debug and safe_get_phys_page_debug need to translate
2008c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych// virtual addresses to physical addresses. When running on KVM we need to
2108c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych// pull the cr registers and hflags from the VCPU. These functions wrap the
2208c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych// calls to kvm_get_sregs to pull these registers over when necessary.
2308c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych//
2408c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych// Note: we do not call the cpu_synchronize_state function because that pulls
2508c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych// all the VCPU registers. That equates to 4 ioctls on the KVM virtual device
2608c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych// and on AMD some of those ioctls (in particular KVM_GET_MSRS) are 10 to 100x
2708c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych// slower than on Intel chips.
2808c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych
2908c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knychint safe_memory_rw_debug(CPUState *env, target_ulong addr, uint8_t *buf,
3008c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych                         int len, int is_write)
3108c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych{
3208c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych#ifdef TARGET_I386
3308c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych    if (kvm_enabled()) {
3408c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych        kvm_get_sregs(env);
3508c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych    }
3608c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych#endif
3708c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych    return cpu_memory_rw_debug(env, addr, buf, len, is_write);
3808c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych}
3908c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych
4008c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knychtarget_phys_addr_t safe_get_phys_page_debug(CPUState *env, target_ulong addr)
4108c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych{
4208c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych#ifdef TARGET_I386
4308c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych    if (kvm_enabled()) {
4408c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych        kvm_get_sregs(env);
4508c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych    }
4608c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych#endif
4708c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych    return cpu_get_phys_page_debug(env, addr);
4808c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych}
4908c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych
50