mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
ANDROID: KVM: arm64: Add current host and hyp vCPU lookup primitive
In order to be able to safely manipulate the loaded vCPU state, add a helper that always return the vcpu as mapped in the EL2 S1 address space as well as the pointer to the hyp vCPU if it exists. In case of failure, both pointers are returned as NULL values. Convert handle___kvm_vcpu_run() over to the new helper. Signed-off-by: Marc Zyngier <maz@kernel.org> Signed-off-by: Will Deacon <willdeacon@google.com> Bug: 233587962 Change-Id: I90ba58c0e73a0544878f6b8514e3f91a9f83083d
This commit is contained in:
committed by
Will Deacon
parent
3bd11c3908
commit
c61070ca67
@@ -172,19 +172,44 @@ static void handle___pkvm_vcpu_put(struct kvm_cpu_context *host_ctxt)
|
||||
pkvm_put_hyp_vcpu(hyp_vcpu);
|
||||
}
|
||||
|
||||
static void handle___kvm_vcpu_run(struct kvm_cpu_context *host_ctxt)
|
||||
static struct kvm_vcpu *__get_host_hyp_vcpus(struct kvm_vcpu *arg,
|
||||
struct pkvm_hyp_vcpu **hyp_vcpup)
|
||||
{
|
||||
DECLARE_REG(struct kvm_vcpu *, host_vcpu, host_ctxt, 1);
|
||||
int ret;
|
||||
struct kvm_vcpu *host_vcpu = kern_hyp_va(arg);
|
||||
struct pkvm_hyp_vcpu *hyp_vcpu = NULL;
|
||||
|
||||
if (unlikely(is_protected_kvm_enabled())) {
|
||||
struct pkvm_hyp_vcpu *hyp_vcpu = pkvm_get_loaded_hyp_vcpu();
|
||||
hyp_vcpu = pkvm_get_loaded_hyp_vcpu();
|
||||
|
||||
if (!hyp_vcpu) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
if (!hyp_vcpu || hyp_vcpu->host_vcpu != host_vcpu) {
|
||||
hyp_vcpu = NULL;
|
||||
host_vcpu = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
*hyp_vcpup = hyp_vcpu;
|
||||
return host_vcpu;
|
||||
}
|
||||
|
||||
#define get_host_hyp_vcpus(ctxt, regnr, hyp_vcpup) \
|
||||
({ \
|
||||
DECLARE_REG(struct kvm_vcpu *, __vcpu, ctxt, regnr); \
|
||||
__get_host_hyp_vcpus(__vcpu, hyp_vcpup); \
|
||||
})
|
||||
|
||||
static void handle___kvm_vcpu_run(struct kvm_cpu_context *host_ctxt)
|
||||
{
|
||||
struct pkvm_hyp_vcpu *hyp_vcpu;
|
||||
struct kvm_vcpu *host_vcpu;
|
||||
int ret;
|
||||
|
||||
host_vcpu = get_host_hyp_vcpus(host_ctxt, 1, &hyp_vcpu);
|
||||
if (!host_vcpu) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (unlikely(hyp_vcpu)) {
|
||||
flush_hyp_vcpu(hyp_vcpu);
|
||||
|
||||
ret = __kvm_vcpu_run(&hyp_vcpu->vcpu);
|
||||
@@ -192,7 +217,7 @@ static void handle___kvm_vcpu_run(struct kvm_cpu_context *host_ctxt)
|
||||
sync_hyp_vcpu(hyp_vcpu);
|
||||
} else {
|
||||
/* The host is fully trusted, run its vCPU directly. */
|
||||
ret = __kvm_vcpu_run(kern_hyp_va(host_vcpu));
|
||||
ret = __kvm_vcpu_run(host_vcpu);
|
||||
}
|
||||
out:
|
||||
cpu_reg(host_ctxt, 1) = ret;
|
||||
|
||||
Reference in New Issue
Block a user