1/* Copyright (C) 2007-2008 The Android Open Source Project
2**
3** This software is licensed under the terms of the GNU General Public
4** License version 2, as published by the Free Software Foundation, and
5** may be copied, distributed, and modified under those terms.
6**
7** This program is distributed in the hope that it will be useful,
8** but WITHOUT ANY WARRANTY; without even the implied warranty of
9** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10** GNU General Public License for more details.
11*/
12#include "hw/hw.h"
13#include "hw/android/goldfish/vmem.h"
14#ifdef TARGET_I386
15#include "sysemu/kvm.h"
16#endif
17
18
19// Both safe_memory_rw_debug and safe_get_phys_page_debug need to translate
20// virtual addresses to physical addresses. When running on KVM we need to
21// pull the cr registers and hflags from the VCPU. These functions wrap the
22// calls to kvm_get_sregs to pull these registers over when necessary.
23//
24// Note: we do not call the cpu_synchronize_state function because that pulls
25// all the VCPU registers. That equates to 4 ioctls on the KVM virtual device
26// and on AMD some of those ioctls (in particular KVM_GET_MSRS) are 10 to 100x
27// slower than on Intel chips.
28
29int safe_memory_rw_debug(CPUState *cpu, target_ulong addr, uint8_t *buf,
30                         int len, int is_write)
31{
32#ifdef TARGET_I386
33    if (kvm_enabled()) {
34        kvm_get_sregs(cpu);
35    }
36#endif
37    return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
38}
39
40hwaddr safe_get_phys_page_debug(CPUState *cpu, target_ulong addr)
41{
42    CPUArchState *env = cpu->env_ptr;
43
44#ifdef TARGET_I386
45    if (kvm_enabled()) {
46        kvm_get_sregs(cpu);
47    }
48#endif
49    return cpu_get_phys_page_debug(env, addr);
50}
51
52