162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2021 Google LLC
462306a36Sopenharmony_ci * Author: Fuad Tabba <tabba@google.com>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef __ARM64_KVM_NVHE_PKVM_H__
862306a36Sopenharmony_ci#define __ARM64_KVM_NVHE_PKVM_H__
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <asm/kvm_pkvm.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <nvhe/gfp.h>
1362306a36Sopenharmony_ci#include <nvhe/spinlock.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/*
1662306a36Sopenharmony_ci * Holds the relevant data for maintaining the vcpu state completely at hyp.
1762306a36Sopenharmony_ci */
1862306a36Sopenharmony_cistruct pkvm_hyp_vcpu {
1962306a36Sopenharmony_ci	struct kvm_vcpu vcpu;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	/* Backpointer to the host's (untrusted) vCPU instance. */
2262306a36Sopenharmony_ci	struct kvm_vcpu *host_vcpu;
2362306a36Sopenharmony_ci};
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/*
2662306a36Sopenharmony_ci * Holds the relevant data for running a protected vm.
2762306a36Sopenharmony_ci */
2862306a36Sopenharmony_cistruct pkvm_hyp_vm {
2962306a36Sopenharmony_ci	struct kvm kvm;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	/* Backpointer to the host's (untrusted) KVM instance. */
3262306a36Sopenharmony_ci	struct kvm *host_kvm;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	/* The guest's stage-2 page-table managed by the hypervisor. */
3562306a36Sopenharmony_ci	struct kvm_pgtable pgt;
3662306a36Sopenharmony_ci	struct kvm_pgtable_mm_ops mm_ops;
3762306a36Sopenharmony_ci	struct hyp_pool pool;
3862306a36Sopenharmony_ci	hyp_spinlock_t lock;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	/*
4162306a36Sopenharmony_ci	 * The number of vcpus initialized and ready to run.
4262306a36Sopenharmony_ci	 * Modifying this is protected by 'vm_table_lock'.
4362306a36Sopenharmony_ci	 */
4462306a36Sopenharmony_ci	unsigned int nr_vcpus;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	/* Array of the hyp vCPU structures for this VM. */
4762306a36Sopenharmony_ci	struct pkvm_hyp_vcpu *vcpus[];
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic inline struct pkvm_hyp_vm *
5162306a36Sopenharmony_cipkvm_hyp_vcpu_to_hyp_vm(struct pkvm_hyp_vcpu *hyp_vcpu)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	return container_of(hyp_vcpu->vcpu.kvm, struct pkvm_hyp_vm, kvm);
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_civoid pkvm_hyp_vm_table_init(void *tbl);
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ciint __pkvm_init_vm(struct kvm *host_kvm, unsigned long vm_hva,
5962306a36Sopenharmony_ci		   unsigned long pgd_hva);
6062306a36Sopenharmony_ciint __pkvm_init_vcpu(pkvm_handle_t handle, struct kvm_vcpu *host_vcpu,
6162306a36Sopenharmony_ci		     unsigned long vcpu_hva);
6262306a36Sopenharmony_ciint __pkvm_teardown_vm(pkvm_handle_t handle);
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct pkvm_hyp_vcpu *pkvm_load_hyp_vcpu(pkvm_handle_t handle,
6562306a36Sopenharmony_ci					 unsigned int vcpu_idx);
6662306a36Sopenharmony_civoid pkvm_put_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#endif /* __ARM64_KVM_NVHE_PKVM_H__ */
69