ANDROID: KVM: arm64: Define pKVM HVCs for pvIOMMU
pKVM exposes a paravirtualized IOMMU(pvIOMMU) to guests through hypercall ARM_SMCCC_KVM_FUNC_PVIOMMU_OP, where the operation is passes in X1 as: - map pages: Map pages for a domain. - unmap pages: Unmap pages for a domain. - attach dev: Attach an endpoint to a domain. - detach dev: Detach an endpoint from a domain. - alloc_domain: Allocate a translation regime and return its ID. - free_domain: free a domain. Bug: 357781595 Bug: 348382247 Bug: 236685427 Change-Id: I6d42339cd365f090567a099953e6324af6eea7dc Signed-off-by: Mostafa Saleh <smostafa@google.com>
This commit is contained in:
committed by
Carlos Llamas
parent
f91d34f087
commit
80fccb233c
@@ -0,0 +1,11 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2024 Google LLC
|
||||
* Author: Mostafa Saleh <smostafa@google.com>
|
||||
*/
|
||||
#ifndef __ARM64_KVM_NVHE_PVIOMMU_H__
|
||||
#define __ARM64_KVM_NVHE_PVIOMMU_H__
|
||||
|
||||
bool kvm_handle_pviommu_hvc(struct kvm_vcpu *vcpu, u64 *exit_code);
|
||||
|
||||
#endif /* __ARM64_KVM_NVHE_PVIOMMU_H__ */
|
||||
@@ -10,7 +10,7 @@ hyp-obj-y := timer-sr.o sysreg-sr.o debug-sr.o switch.o tlb.o hyp-init.o host.o
|
||||
cache.o setup.o mm.o mem_protect.o sys_regs.o pkvm.o stacktrace.o ffa.o \
|
||||
serial.o alloc_mgt.o iommu/iommu.o power/hvc.o power/scmi.o device/device.o
|
||||
hyp-obj-y += ../vgic-v3-sr.o ../aarch32.o ../vgic-v2-cpuif-proxy.o ../entry.o \
|
||||
../fpsimd.o ../hyp-entry.o ../exception.o ../pgtable.o iommu/pviommu-host.o
|
||||
../fpsimd.o ../hyp-entry.o ../exception.o ../pgtable.o iommu/pviommu-host.o iommu/pviommu.o
|
||||
hyp-obj-$(CONFIG_LIST_HARDENED) += list_debug.o
|
||||
hyp-obj-$(CONFIG_TRACING) += clock.o events.o trace.o
|
||||
hyp-obj-$(CONFIG_PROTECTED_NVHE_FTRACE) += ftrace.o
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2024 Google LLC
|
||||
* Author: Mostafa Saleh <smostafa@google.com>
|
||||
*/
|
||||
|
||||
#include <kvm/arm_hypercalls.h>
|
||||
|
||||
#include <nvhe/mem_protect.h>
|
||||
#include <nvhe/pkvm.h>
|
||||
#include <nvhe/pviommu.h>
|
||||
|
||||
static bool pkvm_guest_iommu_map(struct pkvm_hyp_vcpu *hyp_vcpu)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool pkvm_guest_iommu_unmap(struct pkvm_hyp_vcpu *hyp_vcpu)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool pkvm_guest_iommu_attach_dev(struct pkvm_hyp_vcpu *hyp_vcpu)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool pkvm_guest_iommu_detach_dev(struct pkvm_hyp_vcpu *hyp_vcpu)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool pkvm_guest_iommu_alloc_domain(struct pkvm_hyp_vcpu *hyp_vcpu)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool pkvm_guest_iommu_free_domain(struct pkvm_hyp_vcpu *hyp_vcpu)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool kvm_handle_pviommu_hvc(struct kvm_vcpu *vcpu, u64 *exit_code)
|
||||
{
|
||||
u64 iommu_op = smccc_get_arg1(vcpu);
|
||||
struct pkvm_hyp_vcpu *hyp_vcpu = container_of(vcpu, struct pkvm_hyp_vcpu, vcpu);
|
||||
struct pkvm_hyp_vm *vm = pkvm_hyp_vcpu_to_hyp_vm(hyp_vcpu);
|
||||
|
||||
/*
|
||||
* Eagerly fill the vm iommu pool to avoid deadlocks from donation path while
|
||||
* doing IOMMU operations.
|
||||
*/
|
||||
refill_hyp_pool(&vm->iommu_pool, &hyp_vcpu->host_vcpu->arch.iommu_mc);
|
||||
switch (iommu_op) {
|
||||
case KVM_PVIOMMU_OP_ALLOC_DOMAIN:
|
||||
return pkvm_guest_iommu_alloc_domain(hyp_vcpu);
|
||||
case KVM_PVIOMMU_OP_FREE_DOMAIN:
|
||||
return pkvm_guest_iommu_free_domain(hyp_vcpu);
|
||||
case KVM_PVIOMMU_OP_ATTACH_DEV:
|
||||
return pkvm_guest_iommu_attach_dev(hyp_vcpu);
|
||||
case KVM_PVIOMMU_OP_DETACH_DEV:
|
||||
return pkvm_guest_iommu_detach_dev(hyp_vcpu);
|
||||
case KVM_PVIOMMU_OP_MAP_PAGES:
|
||||
return pkvm_guest_iommu_map(hyp_vcpu);
|
||||
case KVM_PVIOMMU_OP_UNMAP_PAGES:
|
||||
return pkvm_guest_iommu_unmap(hyp_vcpu);
|
||||
}
|
||||
|
||||
smccc_set_retval(vcpu, SMCCC_RET_NOT_SUPPORTED, 0, 0, 0);
|
||||
return true;
|
||||
}
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <nvhe/memory.h>
|
||||
#include <nvhe/mm.h>
|
||||
#include <nvhe/pkvm.h>
|
||||
#include <nvhe/pviommu.h>
|
||||
#include <nvhe/pviommu-host.h>
|
||||
#include <nvhe/rwlock.h>
|
||||
#include <nvhe/trap_handler.h>
|
||||
@@ -1754,6 +1755,8 @@ bool kvm_handle_pvm_hvc64(struct kvm_vcpu *vcpu, u64 *exit_code)
|
||||
if (smccc_trng_available)
|
||||
return pkvm_forward_trng(vcpu);
|
||||
break;
|
||||
case ARM_SMCCC_VENDOR_HYP_KVM_PVIOMMU_OP_FUNC_ID:
|
||||
return kvm_handle_pviommu_hvc(vcpu, exit_code);
|
||||
case ARM_SMCCC_VENDOR_HYP_KVM_DEV_REQ_MMIO_FUNC_ID:
|
||||
return pkvm_device_request_mmio(hyp_vcpu, exit_code);
|
||||
default:
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_59 59
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_60 60
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_61 61
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_62 62
|
||||
#define ARM_SMCCC_KVM_FUNC_PVIOMMU_OP 62
|
||||
#define ARM_SMCCC_KVM_FUNC_DEV_REQ_MMIO 63
|
||||
/* End of pKVM hypercall range */
|
||||
#define ARM_SMCCC_KVM_FUNC_FEATURES_2 127
|
||||
@@ -227,6 +227,19 @@
|
||||
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
||||
ARM_SMCCC_KVM_FUNC_MEM_RELINQUISH)
|
||||
|
||||
#define KVM_PVIOMMU_OP_ATTACH_DEV 0
|
||||
#define KVM_PVIOMMU_OP_DETACH_DEV 1
|
||||
#define KVM_PVIOMMU_OP_ALLOC_DOMAIN 2
|
||||
#define KVM_PVIOMMU_OP_FREE_DOMAIN 3
|
||||
#define KVM_PVIOMMU_OP_MAP_PAGES 4
|
||||
#define KVM_PVIOMMU_OP_UNMAP_PAGES 5
|
||||
|
||||
#define ARM_SMCCC_VENDOR_HYP_KVM_PVIOMMU_OP_FUNC_ID \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
ARM_SMCCC_SMC_64, \
|
||||
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
||||
ARM_SMCCC_KVM_FUNC_PVIOMMU_OP)
|
||||
|
||||
#define ARM_SMCCC_VENDOR_HYP_KVM_DEV_REQ_MMIO_FUNC_ID \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
ARM_SMCCC_SMC_64, \
|
||||
|
||||
Reference in New Issue
Block a user