Loading arch/arm64/include/asm/kvm_pgtable.h +0 −3 Original line number Diff line number Diff line Loading @@ -53,9 +53,6 @@ enum kvm_pgtable_prot { KVM_PGTABLE_PROT_PBHA3 = BIT(62), }; #define TMI_NO_MEASURE_CONTENT U(0) #define TMI_MEASURE_CONTENT U(1) #define PAGE_HYP (KVM_PGTABLE_PROT_R | KVM_PGTABLE_PROT_W) #define PAGE_HYP_EXEC (KVM_PGTABLE_PROT_R | KVM_PGTABLE_PROT_X) #define PAGE_HYP_RO (KVM_PGTABLE_PROT_R) Loading arch/arm64/include/asm/kvm_tmi.h +5 −0 Original line number Diff line number Diff line Loading @@ -211,6 +211,9 @@ struct tmi_tec_run { #define U(_x) (_x##U) #define TMI_NO_MEASURE_CONTENT U(0) #define TMI_MEASURE_CONTENT U(1) /* * SMC_TMM_INIT_COMPLETE is the only function in the TMI that originates from * the CVM world and is handled by the SPMD. The remaining functions are Loading Loading @@ -384,6 +387,8 @@ unsigned long cvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu, unsigned long target_affinity, unsigned long lowest_affinity_level); int kvm_cvm_vcpu_set_events(struct kvm_vcpu *vcpu, bool serror_pending, bool ext_dabt_pending); int kvm_create_cvm_vm(struct kvm *kvm); int kvm_init_cvm_vm(struct kvm *kvm); #endif #endif arch/arm64/kvm/arm.c +0 −35 Original line number Diff line number Diff line Loading @@ -145,41 +145,6 @@ static void set_default_csv2(struct kvm *kvm) kvm->arch.pfr0_csv2 = 1; } static int kvm_create_cvm_vm(struct kvm *kvm) { struct cvm *cvm; if (!static_key_enabled(&kvm_cvm_is_available)) return -EFAULT; if (kvm->arch.cvm) { kvm_info("cvm already create.\n"); return 0; } kvm->arch.cvm = kzalloc(sizeof(struct cvm), GFP_KERNEL_ACCOUNT); if (!kvm->arch.cvm) return -ENOMEM; cvm = (struct cvm *)kvm->arch.cvm; cvm->is_cvm = true; return 0; } static int kvm_init_cvm_vm(struct kvm *kvm) { struct tmi_cvm_params *params; struct cvm *cvm = (struct cvm *)kvm->arch.cvm; params = kzalloc(PAGE_SIZE, GFP_KERNEL_ACCOUNT); if (!params) return -ENOMEM; cvm->params = params; return 0; } /** * kvm_arch_init_vm - initializes a VM data structure * @kvm: pointer to the KVM struct Loading arch/arm64/kvm/cvm.c +44 −5 Original line number Diff line number Diff line Loading @@ -158,8 +158,10 @@ int kvm_arm_create_cvm(struct kvm *kvm) if (!kvm_is_cvm(kvm) || kvm_cvm_state(kvm) != CVM_STATE_NONE) return 0; if (!cvm->params) return -EFAULT; if (!cvm->params) { ret = -EFAULT; goto out; } ret = cvm_vmid_reserve(); if (ret < 0) Loading @@ -184,12 +186,14 @@ int kvm_arm_create_cvm(struct kvm *kvm) } WRITE_ONCE(cvm->state, CVM_STATE_NEW); kfree(cvm->params); cvm->params = NULL; return ret; ret = 0; out: kfree(cvm->params); cvm->params = NULL; if (ret < 0) { kfree(cvm); kvm->arch.cvm = NULL; } return ret; } Loading Loading @@ -835,3 +839,38 @@ int kvm_cvm_vcpu_set_events(struct kvm_vcpu *vcpu, } return 0; } int kvm_create_cvm_vm(struct kvm *kvm) { struct cvm *cvm; if (!static_key_enabled(&kvm_cvm_is_available)) return -EFAULT; if (kvm->arch.cvm) { kvm_info("cvm already create.\n"); return 0; } kvm->arch.cvm = kzalloc(sizeof(struct cvm), GFP_KERNEL_ACCOUNT); if (!kvm->arch.cvm) return -ENOMEM; cvm = (struct cvm *)kvm->arch.cvm; cvm->is_cvm = true; return 0; } int kvm_init_cvm_vm(struct kvm *kvm) { struct tmi_cvm_params *params; struct cvm *cvm = (struct cvm *)kvm->arch.cvm; params = kzalloc(PAGE_SIZE, GFP_KERNEL_ACCOUNT); if (!params) return -ENOMEM; cvm->params = params; return 0; } arch/arm64/kvm/hyp/vgic-v3-sr.c +0 −19 Original line number Diff line number Diff line Loading @@ -229,25 +229,6 @@ void __vgic_v3_save_state(struct vgic_v3_cpu_if *cpu_if) } } #ifdef CONFIG_CVM_HOST void __vgic_v3_restore_tec_state(struct vgic_v3_cpu_if *cpu_if, u64 *entry_hcr, u64 *entry_lrs) { u64 used_lrs = cpu_if->used_lrs; int i; *entry_hcr = cpu_if->vgic_hcr; for (i = 0; i < kvm_vgic_global_state.nr_lr; ++i) { if (i < used_lrs) { entry_lrs[i] = cpu_if->vgic_lr[i]; } else { entry_lrs[i] = 0; } } } #endif void __vgic_v3_restore_state(struct vgic_v3_cpu_if *cpu_if) { u64 used_lrs = cpu_if->used_lrs; Loading Loading
arch/arm64/include/asm/kvm_pgtable.h +0 −3 Original line number Diff line number Diff line Loading @@ -53,9 +53,6 @@ enum kvm_pgtable_prot { KVM_PGTABLE_PROT_PBHA3 = BIT(62), }; #define TMI_NO_MEASURE_CONTENT U(0) #define TMI_MEASURE_CONTENT U(1) #define PAGE_HYP (KVM_PGTABLE_PROT_R | KVM_PGTABLE_PROT_W) #define PAGE_HYP_EXEC (KVM_PGTABLE_PROT_R | KVM_PGTABLE_PROT_X) #define PAGE_HYP_RO (KVM_PGTABLE_PROT_R) Loading
arch/arm64/include/asm/kvm_tmi.h +5 −0 Original line number Diff line number Diff line Loading @@ -211,6 +211,9 @@ struct tmi_tec_run { #define U(_x) (_x##U) #define TMI_NO_MEASURE_CONTENT U(0) #define TMI_MEASURE_CONTENT U(1) /* * SMC_TMM_INIT_COMPLETE is the only function in the TMI that originates from * the CVM world and is handled by the SPMD. The remaining functions are Loading Loading @@ -384,6 +387,8 @@ unsigned long cvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu, unsigned long target_affinity, unsigned long lowest_affinity_level); int kvm_cvm_vcpu_set_events(struct kvm_vcpu *vcpu, bool serror_pending, bool ext_dabt_pending); int kvm_create_cvm_vm(struct kvm *kvm); int kvm_init_cvm_vm(struct kvm *kvm); #endif #endif
arch/arm64/kvm/arm.c +0 −35 Original line number Diff line number Diff line Loading @@ -145,41 +145,6 @@ static void set_default_csv2(struct kvm *kvm) kvm->arch.pfr0_csv2 = 1; } static int kvm_create_cvm_vm(struct kvm *kvm) { struct cvm *cvm; if (!static_key_enabled(&kvm_cvm_is_available)) return -EFAULT; if (kvm->arch.cvm) { kvm_info("cvm already create.\n"); return 0; } kvm->arch.cvm = kzalloc(sizeof(struct cvm), GFP_KERNEL_ACCOUNT); if (!kvm->arch.cvm) return -ENOMEM; cvm = (struct cvm *)kvm->arch.cvm; cvm->is_cvm = true; return 0; } static int kvm_init_cvm_vm(struct kvm *kvm) { struct tmi_cvm_params *params; struct cvm *cvm = (struct cvm *)kvm->arch.cvm; params = kzalloc(PAGE_SIZE, GFP_KERNEL_ACCOUNT); if (!params) return -ENOMEM; cvm->params = params; return 0; } /** * kvm_arch_init_vm - initializes a VM data structure * @kvm: pointer to the KVM struct Loading
arch/arm64/kvm/cvm.c +44 −5 Original line number Diff line number Diff line Loading @@ -158,8 +158,10 @@ int kvm_arm_create_cvm(struct kvm *kvm) if (!kvm_is_cvm(kvm) || kvm_cvm_state(kvm) != CVM_STATE_NONE) return 0; if (!cvm->params) return -EFAULT; if (!cvm->params) { ret = -EFAULT; goto out; } ret = cvm_vmid_reserve(); if (ret < 0) Loading @@ -184,12 +186,14 @@ int kvm_arm_create_cvm(struct kvm *kvm) } WRITE_ONCE(cvm->state, CVM_STATE_NEW); kfree(cvm->params); cvm->params = NULL; return ret; ret = 0; out: kfree(cvm->params); cvm->params = NULL; if (ret < 0) { kfree(cvm); kvm->arch.cvm = NULL; } return ret; } Loading Loading @@ -835,3 +839,38 @@ int kvm_cvm_vcpu_set_events(struct kvm_vcpu *vcpu, } return 0; } int kvm_create_cvm_vm(struct kvm *kvm) { struct cvm *cvm; if (!static_key_enabled(&kvm_cvm_is_available)) return -EFAULT; if (kvm->arch.cvm) { kvm_info("cvm already create.\n"); return 0; } kvm->arch.cvm = kzalloc(sizeof(struct cvm), GFP_KERNEL_ACCOUNT); if (!kvm->arch.cvm) return -ENOMEM; cvm = (struct cvm *)kvm->arch.cvm; cvm->is_cvm = true; return 0; } int kvm_init_cvm_vm(struct kvm *kvm) { struct tmi_cvm_params *params; struct cvm *cvm = (struct cvm *)kvm->arch.cvm; params = kzalloc(PAGE_SIZE, GFP_KERNEL_ACCOUNT); if (!params) return -ENOMEM; cvm->params = params; return 0; }
arch/arm64/kvm/hyp/vgic-v3-sr.c +0 −19 Original line number Diff line number Diff line Loading @@ -229,25 +229,6 @@ void __vgic_v3_save_state(struct vgic_v3_cpu_if *cpu_if) } } #ifdef CONFIG_CVM_HOST void __vgic_v3_restore_tec_state(struct vgic_v3_cpu_if *cpu_if, u64 *entry_hcr, u64 *entry_lrs) { u64 used_lrs = cpu_if->used_lrs; int i; *entry_hcr = cpu_if->vgic_hcr; for (i = 0; i < kvm_vgic_global_state.nr_lr; ++i) { if (i < used_lrs) { entry_lrs[i] = cpu_if->vgic_lr[i]; } else { entry_lrs[i] = 0; } } } #endif void __vgic_v3_restore_state(struct vgic_v3_cpu_if *cpu_if) { u64 used_lrs = cpu_if->used_lrs; Loading