]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - arch/arm/include/asm/kvm_emulate.h
ARM: KVM: abstract S1TW abort detection away
[mirror_ubuntu-artful-kernel.git] / arch / arm / include / asm / kvm_emulate.h
CommitLineData
749cf76c
CD
1/*
2 * Copyright (C) 2012 - Virtual Open Systems and Columbia University
3 * Author: Christoffer Dall <c.dall@virtualopensystems.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License, version 2, as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19#ifndef __ARM_KVM_EMULATE_H__
20#define __ARM_KVM_EMULATE_H__
21
22#include <linux/kvm_host.h>
23#include <asm/kvm_asm.h>
45e96ea6 24#include <asm/kvm_mmio.h>
7393b599 25#include <asm/kvm_arm.h>
749cf76c 26
db730d8d
MZ
27unsigned long *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num);
28unsigned long *vcpu_spsr(struct kvm_vcpu *vcpu);
749cf76c 29
5b3e5e5b
CD
30int kvm_handle_wfi(struct kvm_vcpu *vcpu, struct kvm_run *run);
31void kvm_skip_instr(struct kvm_vcpu *vcpu, bool is_wide_instr);
32void kvm_inject_undefined(struct kvm_vcpu *vcpu);
33void kvm_inject_dabt(struct kvm_vcpu *vcpu, unsigned long addr);
34void kvm_inject_pabt(struct kvm_vcpu *vcpu, unsigned long addr);
35
aa024c2f
MZ
36static inline bool vcpu_mode_is_32bit(struct kvm_vcpu *vcpu)
37{
38 return 1;
39}
40
db730d8d 41static inline unsigned long *vcpu_pc(struct kvm_vcpu *vcpu)
749cf76c 42{
db730d8d 43 return &vcpu->arch.regs.usr_regs.ARM_pc;
749cf76c
CD
44}
45
db730d8d 46static inline unsigned long *vcpu_cpsr(struct kvm_vcpu *vcpu)
749cf76c 47{
db730d8d 48 return &vcpu->arch.regs.usr_regs.ARM_cpsr;
749cf76c
CD
49}
50
aa024c2f
MZ
51static inline void vcpu_set_thumb(struct kvm_vcpu *vcpu)
52{
53 *vcpu_cpsr(vcpu) |= PSR_T_BIT;
54}
55
749cf76c
CD
56static inline bool mode_has_spsr(struct kvm_vcpu *vcpu)
57{
58 unsigned long cpsr_mode = vcpu->arch.regs.usr_regs.ARM_cpsr & MODE_MASK;
59 return (cpsr_mode > USR_MODE && cpsr_mode < SYSTEM_MODE);
60}
61
62static inline bool vcpu_mode_priv(struct kvm_vcpu *vcpu)
63{
64 unsigned long cpsr_mode = vcpu->arch.regs.usr_regs.ARM_cpsr & MODE_MASK;
65 return cpsr_mode > USR_MODE;;
66}
67
45e96ea6
CD
68static inline bool kvm_vcpu_reg_is_pc(struct kvm_vcpu *vcpu, int reg)
69{
70 return reg == 15;
71}
72
7393b599
MZ
73static inline u32 kvm_vcpu_get_hsr(struct kvm_vcpu *vcpu)
74{
75 return vcpu->arch.fault.hsr;
76}
77
78static inline unsigned long kvm_vcpu_get_hfar(struct kvm_vcpu *vcpu)
79{
80 return vcpu->arch.fault.hxfar;
81}
82
83static inline phys_addr_t kvm_vcpu_get_fault_ipa(struct kvm_vcpu *vcpu)
84{
85 return ((phys_addr_t)vcpu->arch.fault.hpfar & HPFAR_MASK) << 8;
86}
87
88static inline unsigned long kvm_vcpu_get_hyp_pc(struct kvm_vcpu *vcpu)
89{
90 return vcpu->arch.fault.hyp_pc;
91}
92
4a1df28a
MZ
93static inline bool kvm_vcpu_dabt_isvalid(struct kvm_vcpu *vcpu)
94{
95 return kvm_vcpu_get_hsr(vcpu) & HSR_ISV;
96}
97
023cc964
MZ
98static inline bool kvm_vcpu_dabt_iswrite(struct kvm_vcpu *vcpu)
99{
100 return kvm_vcpu_get_hsr(vcpu) & HSR_WNR;
101}
102
7c511b88
MZ
103static inline bool kvm_vcpu_dabt_issext(struct kvm_vcpu *vcpu)
104{
105 return kvm_vcpu_get_hsr(vcpu) & HSR_SSE;
106}
107
d0adf747
MZ
108static inline int kvm_vcpu_dabt_get_rd(struct kvm_vcpu *vcpu)
109{
110 return (kvm_vcpu_get_hsr(vcpu) & HSR_SRT_MASK) >> HSR_SRT_SHIFT;
111}
112
78abfcde
MZ
113static inline bool kvm_vcpu_dabt_isextabt(struct kvm_vcpu *vcpu)
114{
115 return kvm_vcpu_get_hsr(vcpu) & HSR_DABT_EA;
116}
117
b37670b0
MZ
118static inline bool kvm_vcpu_dabt_iss1tw(struct kvm_vcpu *vcpu)
119{
120 return kvm_vcpu_get_hsr(vcpu) & HSR_DABT_S1PTW;
121}
122
749cf76c 123#endif /* __ARM_KVM_EMULATE_H__ */