vmem.c revision 08c7228c50f8b27acba312c4d2f0c07d0ab6a06b
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*/ 1208c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych#include "hw.h" 1308c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych#include "goldfish_vmem.h" 1408c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych#ifdef TARGET_I386 1508c7228c50f8b27acba312c4d2f0c07d0ab6a06bTom Knych#include "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