diff options
Diffstat (limited to 'arch/arm/include/asm/kvm_host.h')
| -rw-r--r-- | arch/arm/include/asm/kvm_host.h | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h index d1736a53b12d..0c4e643d939e 100644 --- a/arch/arm/include/asm/kvm_host.h +++ b/arch/arm/include/asm/kvm_host.h | |||
| @@ -80,6 +80,15 @@ struct kvm_mmu_memory_cache { | |||
| 80 | void *objects[KVM_NR_MEM_OBJS]; | 80 | void *objects[KVM_NR_MEM_OBJS]; |
| 81 | }; | 81 | }; |
| 82 | 82 | ||
| 83 | struct kvm_vcpu_fault_info { | ||
| 84 | u32 hsr; /* Hyp Syndrome Register */ | ||
| 85 | u32 hxfar; /* Hyp Data/Inst. Fault Address Register */ | ||
| 86 | u32 hpfar; /* Hyp IPA Fault Address Register */ | ||
| 87 | u32 hyp_pc; /* PC when exception was taken from Hyp mode */ | ||
| 88 | }; | ||
| 89 | |||
| 90 | typedef struct vfp_hard_struct kvm_kernel_vfp_t; | ||
| 91 | |||
| 83 | struct kvm_vcpu_arch { | 92 | struct kvm_vcpu_arch { |
| 84 | struct kvm_regs regs; | 93 | struct kvm_regs regs; |
| 85 | 94 | ||
| @@ -93,13 +102,11 @@ struct kvm_vcpu_arch { | |||
| 93 | u32 midr; | 102 | u32 midr; |
| 94 | 103 | ||
| 95 | /* Exception Information */ | 104 | /* Exception Information */ |
| 96 | u32 hsr; /* Hyp Syndrome Register */ | 105 | struct kvm_vcpu_fault_info fault; |
| 97 | u32 hxfar; /* Hyp Data/Inst Fault Address Register */ | ||
| 98 | u32 hpfar; /* Hyp IPA Fault Address Register */ | ||
| 99 | 106 | ||
| 100 | /* Floating point registers (VFP and Advanced SIMD/NEON) */ | 107 | /* Floating point registers (VFP and Advanced SIMD/NEON) */ |
| 101 | struct vfp_hard_struct vfp_guest; | 108 | kvm_kernel_vfp_t vfp_guest; |
| 102 | struct vfp_hard_struct *vfp_host; | 109 | kvm_kernel_vfp_t *vfp_host; |
| 103 | 110 | ||
| 104 | /* VGIC state */ | 111 | /* VGIC state */ |
| 105 | struct vgic_cpu vgic_cpu; | 112 | struct vgic_cpu vgic_cpu; |
| @@ -122,9 +129,6 @@ struct kvm_vcpu_arch { | |||
| 122 | /* Interrupt related fields */ | 129 | /* Interrupt related fields */ |
| 123 | u32 irq_lines; /* IRQ and FIQ levels */ | 130 | u32 irq_lines; /* IRQ and FIQ levels */ |
| 124 | 131 | ||
| 125 | /* Hyp exception information */ | ||
| 126 | u32 hyp_pc; /* PC when exception was taken from Hyp mode */ | ||
| 127 | |||
| 128 | /* Cache some mmu pages needed inside spinlock regions */ | 132 | /* Cache some mmu pages needed inside spinlock regions */ |
| 129 | struct kvm_mmu_memory_cache mmu_page_cache; | 133 | struct kvm_mmu_memory_cache mmu_page_cache; |
| 130 | 134 | ||
| @@ -181,4 +185,26 @@ struct kvm_one_reg; | |||
| 181 | int kvm_arm_coproc_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *); | 185 | int kvm_arm_coproc_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *); |
| 182 | int kvm_arm_coproc_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *); | 186 | int kvm_arm_coproc_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *); |
| 183 | 187 | ||
| 188 | int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run, | ||
| 189 | int exception_index); | ||
| 190 | |||
| 191 | static inline void __cpu_init_hyp_mode(unsigned long long pgd_ptr, | ||
| 192 | unsigned long hyp_stack_ptr, | ||
| 193 | unsigned long vector_ptr) | ||
| 194 | { | ||
| 195 | unsigned long pgd_low, pgd_high; | ||
| 196 | |||
| 197 | pgd_low = (pgd_ptr & ((1ULL << 32) - 1)); | ||
| 198 | pgd_high = (pgd_ptr >> 32ULL); | ||
| 199 | |||
| 200 | /* | ||
| 201 | * Call initialization code, and switch to the full blown | ||
| 202 | * HYP code. The init code doesn't need to preserve these registers as | ||
| 203 | * r1-r3 and r12 are already callee save according to the AAPCS. | ||
| 204 | * Note that we slightly misuse the prototype by casing the pgd_low to | ||
| 205 | * a void *. | ||
| 206 | */ | ||
| 207 | kvm_call_hyp((void *)pgd_low, pgd_high, hyp_stack_ptr, vector_ptr); | ||
| 208 | } | ||
| 209 | |||
| 184 | #endif /* __ARM_KVM_HOST_H__ */ | 210 | #endif /* __ARM_KVM_HOST_H__ */ |
