9 #include <asm/pgtable-types.h>
10 #include <asm/kvm_asm.h>
11 #include <asm/kvm_emulate.h>
12 #include <asm/kvm_host.h>
13 #include <asm/kvm_hyp.h>
14 #include <asm/kvm_mmu.h>
28 struct kvm_vcpu *host_vcpu = hyp_vcpu->
host_vcpu;
30 hyp_vcpu->
vcpu.arch.ctxt = host_vcpu->arch.ctxt;
32 hyp_vcpu->
vcpu.arch.sve_state = kern_hyp_va(host_vcpu->arch.sve_state);
33 hyp_vcpu->
vcpu.arch.sve_max_vl = host_vcpu->arch.sve_max_vl;
35 hyp_vcpu->
vcpu.arch.hw_mmu = host_vcpu->arch.hw_mmu;
37 hyp_vcpu->
vcpu.arch.hcr_el2 = host_vcpu->arch.hcr_el2;
38 hyp_vcpu->
vcpu.arch.mdcr_el2 = host_vcpu->arch.mdcr_el2;
39 hyp_vcpu->
vcpu.arch.cptr_el2 = host_vcpu->arch.cptr_el2;
41 hyp_vcpu->
vcpu.arch.iflags = host_vcpu->arch.iflags;
42 hyp_vcpu->
vcpu.arch.fp_state = host_vcpu->arch.fp_state;
44 hyp_vcpu->
vcpu.arch.debug_ptr = kern_hyp_va(host_vcpu->arch.debug_ptr);
45 hyp_vcpu->
vcpu.arch.host_fpsimd_state = host_vcpu->arch.host_fpsimd_state;
47 hyp_vcpu->
vcpu.arch.vsesr_el2 = host_vcpu->arch.vsesr_el2;
49 hyp_vcpu->
vcpu.arch.vgic_cpu.vgic_v3 = host_vcpu->arch.vgic_cpu.vgic_v3;
54 struct kvm_vcpu *host_vcpu = hyp_vcpu->
host_vcpu;
56 struct vgic_v3_cpu_if *host_cpu_if = &host_vcpu->arch.vgic_cpu.vgic_v3;
59 host_vcpu->arch.ctxt = hyp_vcpu->
vcpu.arch.ctxt;
61 host_vcpu->arch.hcr_el2 = hyp_vcpu->
vcpu.arch.hcr_el2;
62 host_vcpu->arch.cptr_el2 = hyp_vcpu->
vcpu.arch.cptr_el2;
64 host_vcpu->arch.fault = hyp_vcpu->
vcpu.arch.fault;
66 host_vcpu->arch.iflags = hyp_vcpu->
vcpu.arch.iflags;
67 host_vcpu->arch.fp_state = hyp_vcpu->
vcpu.arch.fp_state;
70 for (i = 0; i < hyp_cpu_if->
used_lrs; ++i)
76 DECLARE_REG(
struct kvm_vcpu *, host_vcpu, host_ctxt, 1);
79 host_vcpu = kern_hyp_va(host_vcpu);
81 if (unlikely(is_protected_kvm_enabled())) {
85 host_kvm = kern_hyp_va(host_vcpu->kvm);
110 DECLARE_REG(
struct kvm_vcpu *, vcpu, host_ctxt, 1);
122 DECLARE_REG(
struct kvm_s2_mmu *, mmu, host_ctxt, 1);
131 DECLARE_REG(
struct kvm_s2_mmu *, mmu, host_ctxt, 1);
141 DECLARE_REG(
struct kvm_s2_mmu *, mmu, host_ctxt, 1);
150 DECLARE_REG(
struct kvm_s2_mmu *, mmu, host_ctxt, 1);
157 DECLARE_REG(
struct kvm_s2_mmu *, mmu, host_ctxt, 1);
171 tmp = read_sysreg_el2(SYS_SCTLR);
172 tmp |= SCTLR_ELx_DSSBS;
173 write_sysreg_el2(tmp, SYS_SCTLR);
220 DECLARE_REG(
unsigned long *, per_cpu_base, host_ctxt, 4);
234 DECLARE_REG(
enum arm64_hyp_spectre_vector, slot, host_ctxt, 1);
257 DECLARE_REG(
enum kvm_pgtable_prot, prot, host_ctxt, 3);
273 haddr = (
unsigned long)ERR_PTR(err);
285 DECLARE_REG(
struct kvm_vcpu *, vcpu, host_ctxt, 1);
296 host_kvm = kern_hyp_va(host_kvm);
303 DECLARE_REG(
struct kvm_vcpu *, host_vcpu, host_ctxt, 2);
304 DECLARE_REG(
unsigned long, vcpu_hva, host_ctxt, 3);
306 host_vcpu = kern_hyp_va(host_vcpu);
317 typedef void (*
hcall_t)(
struct kvm_cpu_context *);
319 #define HANDLE_FUNC(x) [__KVM_HOST_SMCCC_FUNC_##x] = (hcall_t)handle_##x
356 unsigned long hcall_min = 0;
368 if (static_branch_unlikely(&kvm_protected_mode_initialized))
369 hcall_min = __KVM_HOST_SMCCC_FUNC___pkvm_prot_finalize;
371 id &= ~ARM_SMCCC_CALL_HINTS;
372 id -= KVM_HOST_SMCCC_ID(0);
374 if (unlikely(id < hcall_min || id >= ARRAY_SIZE(
host_hcall)))
381 cpu_reg(host_ctxt, 0) = SMCCC_RET_SUCCESS;
386 cpu_reg(host_ctxt, 0) = SMCCC_RET_NOT_SUPPORTED;
399 func_id &= ~ARM_SMCCC_CALL_HINTS;
413 u64 esr = read_sysreg_el2(SYS_ESR);
415 switch (ESR_ELx_EC(esr)) {
416 case ESR_ELx_EC_HVC64:
419 case ESR_ELx_EC_SMC64:
424 sysreg_clear_set(cpacr_el1, 0, (CPACR_EL1_ZEN_EL1EN |
425 CPACR_EL1_ZEN_EL0EN));
427 sysreg_clear_set(cptr_el2, CPTR_EL2_TZ, 0);
429 sve_cond_update_zcr_vq(ZCR_ELx_LEN_MASK, SYS_ZCR_EL2);
431 case ESR_ELx_EC_IABT_LOW:
432 case ESR_ELx_EC_DABT_LOW:
static void kvm_skip_host_instr(void)
void __kvm_adjust_pc(struct kvm_vcpu *vcpu)
bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt, u32 func_id)
static void handle___pkvm_vcpu_init_traps(struct kvm_cpu_context *host_ctxt)
static void handle___vgic_v3_init_lrs(struct kvm_cpu_context *host_ctxt)
static void handle___pkvm_cpu_set_vector(struct kvm_cpu_context *host_ctxt)
static void handle___vgic_v3_write_vmcr(struct kvm_cpu_context *host_ctxt)
static void handle___pkvm_init(struct kvm_cpu_context *host_ctxt)
static void handle___pkvm_host_unshare_hyp(struct kvm_cpu_context *host_ctxt)
static void handle_host_smc(struct kvm_cpu_context *host_ctxt)
static void handle___pkvm_init_vm(struct kvm_cpu_context *host_ctxt)
DEFINE_PER_CPU(struct kvm_nvhe_init_params, kvm_init_params)
static void handle___kvm_vcpu_run(struct kvm_cpu_context *host_ctxt)
static void handle___pkvm_prot_finalize(struct kvm_cpu_context *host_ctxt)
static void handle___vgic_v3_restore_aprs(struct kvm_cpu_context *host_ctxt)
static void handle___kvm_adjust_pc(struct kvm_cpu_context *host_ctxt)
static void handle___kvm_flush_cpu_context(struct kvm_cpu_context *host_ctxt)
static void handle___pkvm_host_share_hyp(struct kvm_cpu_context *host_ctxt)
static void handle___pkvm_create_private_mapping(struct kvm_cpu_context *host_ctxt)
static const hcall_t host_hcall[]
void handle_trap(struct kvm_cpu_context *host_ctxt)
static void handle___kvm_enable_ssbs(struct kvm_cpu_context *host_ctxt)
static void handle___vgic_v3_get_gic_config(struct kvm_cpu_context *host_ctxt)
void(* hcall_t)(struct kvm_cpu_context *)
static void handle___kvm_get_mdcr_el2(struct kvm_cpu_context *host_ctxt)
static void flush_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu)
static void handle___kvm_tlb_flush_vmid_ipa(struct kvm_cpu_context *host_ctxt)
static void handle___vgic_v3_save_aprs(struct kvm_cpu_context *host_ctxt)
static void handle___kvm_tlb_flush_vmid_range(struct kvm_cpu_context *host_ctxt)
static void sync_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu)
static void handle___pkvm_teardown_vm(struct kvm_cpu_context *host_ctxt)
static void handle___kvm_flush_vm_context(struct kvm_cpu_context *host_ctxt)
void __kvm_hyp_host_forward_smc(struct kvm_cpu_context *host_ctxt)
static void handle___vgic_v3_read_vmcr(struct kvm_cpu_context *host_ctxt)
static void handle___kvm_tlb_flush_vmid(struct kvm_cpu_context *host_ctxt)
static void handle___pkvm_init_vcpu(struct kvm_cpu_context *host_ctxt)
static void handle_host_hcall(struct kvm_cpu_context *host_ctxt)
static void handle___kvm_tlb_flush_vmid_ipa_nsh(struct kvm_cpu_context *host_ctxt)
static void handle___kvm_timer_set_cntvoff(struct kvm_cpu_context *host_ctxt)
static void default_host_smc_handler(struct kvm_cpu_context *host_ctxt)
int __pkvm_host_unshare_hyp(u64 pfn)
void handle_host_mem_abort(struct kvm_cpu_context *host_ctxt)
int __pkvm_host_share_hyp(u64 pfn)
int __pkvm_prot_finalize(void)
int pkvm_cpu_set_vector(enum arm64_hyp_spectre_vector slot)
int __pkvm_create_private_mapping(phys_addr_t phys, size_t size, enum kvm_pgtable_prot prot, unsigned long *haddr)
u64 __kvm_get_mdcr_el2(void)
int __kvm_vcpu_run(struct kvm_vcpu *vcpu)
void __kvm_timer_set_cntvoff(u64 cntvoff)
void __kvm_tlb_flush_vmid_range(struct kvm_s2_mmu *mmu, phys_addr_t start, unsigned long pages)
void __kvm_tlb_flush_vmid_ipa_nsh(struct kvm_s2_mmu *mmu, phys_addr_t ipa, int level)
void __kvm_tlb_flush_vmid_ipa(struct kvm_s2_mmu *mmu, phys_addr_t ipa, int level)
void __kvm_tlb_flush_vmid(struct kvm_s2_mmu *mmu)
void __kvm_flush_cpu_context(struct kvm_s2_mmu *mmu)
void __kvm_flush_vm_context(void)
struct pkvm_hyp_vcpu * pkvm_load_hyp_vcpu(pkvm_handle_t handle, unsigned int vcpu_idx)
int __pkvm_init_vm(struct kvm *host_kvm, unsigned long vm_hva, unsigned long pgd_hva)
int __pkvm_init_vcpu(pkvm_handle_t handle, struct kvm_vcpu *host_vcpu, unsigned long vcpu_hva)
int __pkvm_teardown_vm(pkvm_handle_t handle)
void pkvm_put_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu)
bool kvm_host_psci_handler(struct kvm_cpu_context *host_ctxt, u32 func_id)
int __pkvm_init(phys_addr_t phys, unsigned long size, unsigned long nr_cpus, unsigned long *per_cpu_base, u32 hyp_va_bits)
struct kvm_vcpu * host_vcpu
u64 vgic_lr[VGIC_V3_MAX_LRS]
void __pkvm_vcpu_init_traps(struct kvm_vcpu *vcpu)
#define DECLARE_REG(type, name, ctxt, reg)
void __vgic_v3_restore_aprs(struct vgic_v3_cpu_if *cpu_if)
void __vgic_v3_init_lrs(void)
u64 __vgic_v3_read_vmcr(void)
void __vgic_v3_save_aprs(struct vgic_v3_cpu_if *cpu_if)
void __vgic_v3_write_vmcr(u32 vmcr)
u64 __vgic_v3_get_gic_config(void)