2026-01-29 22:25:33 +08:00

94 lines
2.1 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2024, The Linux Foundation. All rights reserved.
*/
#ifndef __ASM_KVM_TMM_H
#define __ASM_KVM_TMM_H
#include <uapi/linux/kvm.h>
enum cvm_state {
CVM_STATE_NONE,
CVM_STATE_NEW,
CVM_STATE_ACTIVE,
CVM_STATE_DYING
};
/*
* Many of these fields are smaller than u64 but all fields have u64
* alignment, so use u64 to ensure correct alignment.
*/
struct tmi_cvm_params {
u64 flags;
u64 s2sz;
u64 sve_vl;
u64 num_bps;
u64 num_wps;
u64 pmu_num_cnts;
u64 measurement_algo;
u64 vmid;
u64 ns_vtcr;
u64 vttbr_el2;
u64 ttt_base;
s64 ttt_level_start;
u64 ttt_num_start;
u8 rpv[64]; /* Bits 512 */
};
struct cvm {
enum cvm_state state;
u32 cvm_vmid;
u64 rd;
u64 loader_start;
u64 initrd_start;
u64 initrd_size;
u64 ram_size;
struct kvm_numa_info numa_info;
struct tmi_cvm_params *params;
bool is_cvm;
};
/*
* struct cvm_tec - Additional per VCPU data for a CVM
*/
struct cvm_tec {
u64 tec;
bool tec_created;
void *tec_run;
};
int kvm_init_tmm(void);
int kvm_cvm_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap);
int kvm_init_cvm_vm(struct kvm *kvm);
void kvm_destroy_cvm(struct kvm *kvm);
int kvm_create_tec(struct kvm_vcpu *vcpu);
void kvm_destroy_tec(struct kvm_vcpu *vcpu);
int kvm_tec_enter(struct kvm_vcpu *vcpu);
int handle_cvm_exit(struct kvm_vcpu *vcpu, int rec_run_status);
int kvm_arm_create_cvm(struct kvm *kvm);
void kvm_free_rd(struct kvm *kvm);
int cvm_create_rd(struct kvm *kvm);
int cvm_psci_complete(struct kvm_vcpu *calling, struct kvm_vcpu *target);
int kvm_arch_tec_init(struct kvm_vcpu *vcpu);
void kvm_cvm_unmap_destroy_range(struct kvm *kvm);
#define CVM_TTT_BLOCK_LEVEL 2
#define CVM_TTT_MAX_LEVEL 3
#define CVM_PAGE_SHIFT 12
#define CVM_PAGE_SIZE BIT(CVM_PAGE_SHIFT)
#define CVM_TTT_LEVEL_SHIFT(l) \
((CVM_PAGE_SHIFT - 3) * (4 - (l)) + 3)
#define CVM_L2_BLOCK_SIZE BIT(CVM_TTT_LEVEL_SHIFT(2))
static inline unsigned long cvm_ttt_level_mapsize(int level)
{
if (WARN_ON(level > CVM_TTT_BLOCK_LEVEL))
return CVM_PAGE_SIZE;
return (1UL << CVM_TTT_LEVEL_SHIFT(level));
}
#endif