ANDROID: KVM: arm64: Introduce KVM_VM_TYPE_ARM_PROTECTED machine type for PVMs
Introduce a new virtual machine type, KVM_VM_TYPE_ARM_PROTECTED, which specifies that the guest memory pages are to be unmapped from the host stage-2 by the hypervisor. Bug: 357781595 Change-Id: Iabcd03865aed4a41637597ac247897fd185bfc4d Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
@@ -18,7 +18,7 @@
|
||||
|
||||
#define HYP_MEMBLOCK_REGIONS 128
|
||||
|
||||
int pkvm_init_host_vm(struct kvm *kvm);
|
||||
int pkvm_init_host_vm(struct kvm *kvm, unsigned long type);
|
||||
int pkvm_create_hyp_vm(struct kvm *kvm);
|
||||
void pkvm_destroy_hyp_vm(struct kvm *kvm);
|
||||
|
||||
|
||||
@@ -185,6 +185,9 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (type & ~KVM_VM_TYPE_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_init(&kvm->arch.config_lock);
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
@@ -201,7 +204,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pkvm_init_host_vm(kvm);
|
||||
ret = pkvm_init_host_vm(kvm, type);
|
||||
if (ret)
|
||||
goto err_unshare_kvm;
|
||||
|
||||
|
||||
@@ -888,9 +888,6 @@ static int kvm_init_ipa_range(struct kvm_s2_mmu *mmu, unsigned long type)
|
||||
u64 mmfr0, mmfr1;
|
||||
u32 phys_shift;
|
||||
|
||||
if (type & ~KVM_VM_TYPE_ARM_IPA_SIZE_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
phys_shift = KVM_VM_TYPE_ARM_IPA_SIZE(type);
|
||||
if (is_protected_kvm_enabled()) {
|
||||
phys_shift = kvm_ipa_limit;
|
||||
|
||||
@@ -247,8 +247,15 @@ void pkvm_destroy_hyp_vm(struct kvm *host_kvm)
|
||||
mutex_unlock(&host_kvm->arch.config_lock);
|
||||
}
|
||||
|
||||
int pkvm_init_host_vm(struct kvm *host_kvm)
|
||||
int pkvm_init_host_vm(struct kvm *host_kvm, unsigned long type)
|
||||
{
|
||||
if (!(type & KVM_VM_TYPE_ARM_PROTECTED))
|
||||
return 0;
|
||||
|
||||
if (!is_protected_kvm_enabled())
|
||||
return -EINVAL;
|
||||
|
||||
host_kvm->arch.pkvm.enabled = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -656,6 +656,12 @@ struct kvm_enable_cap {
|
||||
#define KVM_VM_TYPE_ARM_IPA_SIZE_MASK 0xffULL
|
||||
#define KVM_VM_TYPE_ARM_IPA_SIZE(x) \
|
||||
((x) & KVM_VM_TYPE_ARM_IPA_SIZE_MASK)
|
||||
|
||||
#define KVM_VM_TYPE_ARM_PROTECTED (1UL << 31)
|
||||
|
||||
#define KVM_VM_TYPE_MASK (KVM_VM_TYPE_ARM_IPA_SIZE_MASK | \
|
||||
KVM_VM_TYPE_ARM_PROTECTED)
|
||||
|
||||
/*
|
||||
* ioctls for /dev/kvm fds:
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user