Add SEV-SNP CipherTextHiding feature support
Subsystems (4)
v8 cover Add SEV-SNP CipherTextHiding feature support
From: Ashish Kalra <[email protected]>
Ciphertext hiding prevents host accesses from reading the ciphertext of SNP guest private memory. Instead of reading ciphertext, the host will see constant default values (0xff).
The SEV ASID space is split into SEV and SEV-ES/SNP ASID ranges. Enabling ciphertext hiding further splits the SEV-ES/SEV-SNP ASID space into separate ASID ranges for SEV-ES and SEV-SNP guests.
Add new module parameter to the KVM module to enable ciphertext hiding support and a user configurable system-wide maximum SNP ASID value. If the module parameter value is '-1' then the complete SEV-ES/SEV-SNP space is allocated to SEV-SNP guests.
Based on linux-next.
Depends on the CCP driver patch-series for SEV-SNP ciphertext hiding feature support:
https://lore.kernel.org/lkml/[email protected]/T/#m1100d65b99cbb022c8a2d04ec88082d3ba68a219
v8:
- Change module parameter to enable ciphertext hiding to use '-1' instead of the string "max" to assign complete SEV-ES/SEV-SNP ASID space to SEV-SNP guests, this simplifies the implementation and moves most error checking to the module loader itself.
v7:
- Fix comments.
- Move the check for module parameter ciphertext_hiding_asids inside check_and_enable_sev_snp_ciphertext_hiding(), this keeps all the logic related to the parameter in a single function.
v6:
- Fix module parameter ciphertext_hiding_asids=0 case.
- Coalesce multiple cases of handling invalid module parameter ciphertext_hiding_asids into a single branch/label.
- Fix commit logs.
- Fix Documentation.
v5:
- Add pre-patch to cache SEV platform status and use this cached information to set api_major/api_minor/build.
- Since the SEV platform status and SNP platform status differ, remove the state field from sev_device structure and instead track SEV platform state from cached SEV platform status.
- If SNP is enabled then cached SNP platform status is used for api_major/api_minor/build.
- Fix using sev_do_cmd() instead of __sev_do_cmd_locked().
- Fix commit logs.
- Fix kernel-parameters documentation.
- Modify KVM module parameter to enable CipherTextHiding to support "max" option to allow complete SEV-ES+ ASID space to be allocated to SEV-SNP guests.
- Do not enable ciphertext hiding if module parameter to specify maximum SNP ASID is invalid.
v4:
- Fix buffer allocation for SNP_FEATURE_INFO command to correctly handle page boundary check requirements.
- Return correct length for SNP_FEATURE_INFO command from sev_cmd_buffer_len().
- Switch to using SNP platform status instead of SEV platform status if SNP is enabled and cache SNP platform status and feature information. Modify sev_get_api_version() accordingly.
- Fix commit logs.
- Expand the comments on why both the feature info and the platform status fields have to be checked for CipherTextHiding feature detection and enablement.
- Add new preperation patch for CipherTextHiding feature which introduces new {min,max}_{sev_es,snp}_asid variables along with existing {min,max}_sev_asid variable to simplify partitioning of the SEV and SEV-ES+ ASID space.
- Switch to single KVM module parameter to enable CipherTextHiding feature and the maximum SNP ASID usable for SNP guests when CipherTextHiding feature is enabled.
v3:
- rebase to linux-next.
- rebase on top of support to move SEV-SNP initialization to KVM module from CCP driver.
- Split CipherTextHiding support between CCP driver and KVM module with KVM module calling into CCP driver to initialize SNP with CipherTextHiding enabled and MAX ASID usable for SNP guest if KVM is enabling CipherTextHiding feature.
- Move module parameters to enable CipherTextHiding feature and MAX ASID usable for SNP guests from CCP driver to KVM module which allows KVM to be responsible for enabling CipherTextHiding feature if end-user requests it.
v2:
- Fix and add more description to commit logs.
- Rename sev_cache_snp_platform_status_and_discover_features() to snp_get_platform_data().
- Add check in snp_get_platform_data to guard against being called after SNP_INIT_EX.
- Fix comments for new structure field definitions being added.
- Fix naming for new structure being added.
- Add new vm-type parameter to sev_asid_new().
- Fix identation.
- Rename CCP module parameters psp_cth_enabled to cipher_text_hiding and psp_max_snp_asid to max_snp_asid.
- Rename max_snp_asid to snp_max_snp_asid.
Ashish Kalra (2):
KVM: SEV: Introduce new min,max sev_es and sev_snp asid variables
KVM: SEV: Add SEV-SNP CipherTextHiding support
.../admin-guide/kernel-parameters.txt | 18 +++++ arch/x86/kvm/svm/sev.c | 80 ++++++++++++++++--- 2 files changed, 88 insertions(+), 10 deletions(-)
Signature · 1 line
2.34.1
PATCH v8 1/2 KVM: SEV: Introduce new min,max sev_es and sev_snp asid variables
From: Ashish Kalra <[email protected]>
Introduce new min, max sev_es_asid and sev_snp_asid variables.
The new {min,max}_{sev_es,snp}_asid variables along with existing {min,max}_sev_asid variable simplifies partitioning of the SEV and SEV-ES+ ASID space.
--- arch/x86/kvm/svm/sev.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-)
arch/x86/kvm/svm/sev.c +27 -9
@@ -85,6 +85,10 @@ static DECLARE_RWSEM(sev_deactivate_lock);static DEFINE_MUTEX (sev_bitmap_lock);unsigned int max_sev_asid;static unsigned int min_sev_asid; +static unsigned int max_sev_es_asid; +static unsigned int min_sev_es_asid; +static unsigned int max_snp_asid; +static unsigned int min_snp_asid;static unsigned long sev_me_mask;static unsigned int nr_asids;static unsigned long *sev_asid_bitmap;
@@ -173,20 +177,31 @@ static void sev_misc_cg_uncharge(struct kvm_sev_info *sev)misc_cg_uncharge (type, sev->misc_cg,1 ); } -static int sev_asid_new (struct kvm_sev_info *sev) +static int sev_asid_new (struct kvm_sev_info *sev,unsigned long vm_type) {/* * SEV-enabled guests must use asid from min_sev_asid to max_sev_asid. * SEV-ES-enabled guest can use from 1 to min_sev_asid - 1. -* Note: min ASID can end up larger than the max if basic SEV support is -* effectively disabled by disallowing use of ASIDs for SEV guests. */ -unsigned int min_asid = sev->es_active ?1 : min_sev_asid; -unsigned int max_asid = sev->es_active ? min_sev_asid -1 : max_sev_asid; -unsigned int asid; +unsigned int min_asid, max_asid, asid;bool retry = true;int ret; +if (vm_type ==KVM_X86_SNP_VM ) { + min_asid = min_snp_asid; + max_asid = max_snp_asid; + }else if (sev->es_active) { + min_asid = min_sev_es_asid; + max_asid = max_sev_es_asid; + }else { + min_asid = min_sev_asid; + max_asid = max_sev_asid; + } + +/* +* The min ASID can end up larger than the max if basic SEV support is +* effectively disabled by disallowing use of ASIDs for SEV guests. +*/ if (min_asid > max_asid)return -ENOTTY ;
@@ -440,7 +455,7 @@ static int __sev_guest_init(struct kvm *kvm, struct kvm_sev_cmd *argp,if (vm_type ==KVM_X86_SNP_VM ) sev->vmsa_features |=SVM_SEV_FEAT_SNP_ACTIVE ; - ret =sev_asid_new (sev); + ret =sev_asid_new (sev, vm_type);if (ret) goto e_no_asid;
@@ -3038,6 +3053,9 @@ void __init sev_hardware_setup(void)if (min_sev_asid ==1 ) goto out; + min_sev_es_asid = min_snp_asid =1 ; + max_sev_es_asid = max_snp_asid = min_sev_asid -1 ; + sev_es_asid_count = min_sev_asid -1 ;WARN_ON_ONCE (misc_cg_set_capacity (MISC_CG_RES_SEV_ES , sev_es_asid_count)); sev_es_supported = true;
@@ -3061,11 +3079,11 @@ void __init sev_hardware_setup(void)if (boot_cpu_has (X86_FEATURE_SEV_ES ))pr_info ("SEV-ES %s (ASIDs %u - %u)\n" ,str_enabled_disabled (sev_es_supported), - min_sev_asid >1 ?1 :0 , min_sev_asid -1 ); + min_sev_es_asid, max_sev_es_asid);if (boot_cpu_has (X86_FEATURE_SEV_SNP ))pr_info ("SEV-SNP %s (ASIDs %u - %u)\n" ,str_enabled_disabled (sev_snp_supported), - min_sev_asid >1 ?1 :0 , min_sev_asid -1 ); + min_snp_asid, max_snp_asid); sev_enabled = sev_supported; sev_es_enabled = sev_es_supported;
Signature · 1 line
2.34.1
PATCH v8 2/2 KVM: SEV: Add SEV-SNP CipherTextHiding support
In reply to Ashish KalraFrom: Ashish Kalra <[email protected]>
Ciphertext hiding prevents host accesses from reading the ciphertext of SNP guest private memory. Instead of reading ciphertext, the host reads will see constant default values (0xff).
The SEV ASID space is split into SEV and SEV-ES/SEV-SNP ASID ranges. Enabling ciphertext hiding further splits the SEV-ES/SEV-SNP ASID space into separate ASID ranges for SEV-ES and SEV-SNP guests.
Add new module parameter to the KVM module to enable ciphertext hiding support and a user configurable system-wide maximum SNP ASID value. If the module parameter value is '-1' then the complete SEV-ES/SEV-SNP ASID space is allocated to SEV-SNP guests.
--- .../admin-guide/kernel-parameters.txt | 18 ++++++++ arch/x86/kvm/svm/sev.c | 44 ++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-)
Documentation/admin-guide/kernel-parameters.txt +18 -0
@@ -2957,6 +2957,24 @@ (enabled). Disable by KVM if hardware lacks support for NPT. + kvm-amd.ciphertext_hiding_asids= + [KVM,AMD] Ciphertext hiding prevents host accesses from reading + the ciphertext of SNP guest private memory. Instead of reading + ciphertext, the host will see constant default values (0xff). + The SEV ASID space is split into SEV and joint SEV-ES and SEV-SNP + ASID space. Ciphertext hiding further partitions the joint + SEV-ES/SEV-SNP ASID space into separate SEV-ES and SEV-SNP ASID + ranges with the SEV-SNP ASID range starting at 1. For SEV-ES/ + SEV-SNP guests the maximum ASID available is MIN_SEV_ASID - 1 + where MIN_SEV_ASID value is discovered by CPUID Fn8000_001F[EDX]. + + Format: { <unsigned int> | -1 } + A non-zero value enables SEV-SNP ciphertext hiding feature and sets + the ASID range available for SEV-SNP guests. + A Value of -1 assigns all ASIDs available in the joint SEV-ES + and SEV-SNP ASID range to SNP guests, effectively disabling + SEV-ES. + kvm-arm.mode= [KVM,ARM,EARLY] Select one of KVM/arm64's modes of operation.
arch/x86/kvm/svm/sev.c +43 -1
74 lines not on this page · raw message
Signature · 1 line
2.34.1
Sean Christopherson
maintainerRe: [PATCH v8 2/2] KVM: SEV: Add SEV-SNP CipherTextHiding support
Quoted 10 lines · Ashish Kalra
From: Ashish Kalra <[email protected]>
Ciphertext hiding prevents host accesses from reading the ciphertext of SNP guest private memory. Instead of reading ciphertext, the host reads will see constant default values (
0xff).The SEV ASID space is split into SEV and SEV-ES/SEV-SNP ASID ranges. Enabling ciphertext hiding further splits the SEV-ES/SEV-SNP ASID space into separate ASID ranges for SEV-ES and SEV-SNP guests.
Quoted 8 lines
Add new module parameter to the KVM module to enable ciphertext hiding support and a user configurable system-wide maximum SNP ASID value. If the module parameter value is '-1' then the complete SEV-ES/SEV-SNP ASID space is allocated to SEV-SNP guests.
Suggested-by Sean Christopherson <[email protected]>Signed-off-by Ashish Kalra <[email protected]>---
*sigh*
Give people a chance to follow-up to the existing conversation before spamming a new version. Sending new versions as quickly as possible doesn't help your code land faster, it just makes people grumpy.
I'm ignoring this and responding to v7.