An SNP-active guest uses the PVALIDATE instruction to validate or rescind the validation of a guest page’s RMP entry. Upon completion, a return code is stored in EAX and rFLAGS bits are set based on the return code. If the instruction completed successfully, the CF indicates if the content of the RMP were changed or not. See AMD APM Volume 3 for additional details. Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxxxxx> Cc: Borislav Petkov <bp@xxxxxxxxx> Cc: Joerg Roedel <jroedel@xxxxxxx> Cc: "H. Peter Anvin" <hpa@xxxxxxxxx> Cc: Tony Luck <tony.luck@xxxxxxxxx> Cc: Dave Hansen <dave.hansen@xxxxxxxxx> Cc: "Peter Zijlstra (Intel)" <peterz@xxxxxxxxxxxxx> Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> Cc: Tom Lendacky <thomas.lendacky@xxxxxxx> Cc: David Rientjes <rientjes@xxxxxxxxxx> Cc: Sean Christopherson <seanjc@xxxxxxxxxx> Cc: x86@xxxxxxxxxx Cc: kvm@xxxxxxxxxxxxxxx Signed-off-by: Brijesh Singh <brijesh.singh@xxxxxxx> --- arch/x86/include/asm/sev-snp.h | 52 ++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 arch/x86/include/asm/sev-snp.h diff --git a/arch/x86/include/asm/sev-snp.h b/arch/x86/include/asm/sev-snp.h new file mode 100644 index 000000000000..5a6d1367cab7 --- /dev/null +++ b/arch/x86/include/asm/sev-snp.h @@ -0,0 +1,52 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * AMD SEV Secure Nested Paging Support + * + * Copyright (C) 2021 Advanced Micro Devices, Inc. + * + * Author: Brijesh Singh <brijesh.singh@xxxxxxx> + */ + +#ifndef __ASM_SECURE_NESTED_PAGING_H +#define __ASM_SECURE_NESTED_PAGING_H + +#ifndef __ASSEMBLY__ +#include <asm/irqflags.h> /* native_save_fl() */ + +/* Return code of __pvalidate */ +#define PVALIDATE_SUCCESS 0 +#define PVALIDATE_FAIL_INPUT 1 +#define PVALIDATE_FAIL_SIZEMISMATCH 6 + +/* RMP page size */ +#define RMP_PG_SIZE_2M 1 +#define RMP_PG_SIZE_4K 0 + +#ifdef CONFIG_AMD_MEM_ENCRYPT +static inline int __pvalidate(unsigned long vaddr, int rmp_psize, int validate, + unsigned long *rflags) +{ + unsigned long flags; + int rc; + + asm volatile(".byte 0xF2, 0x0F, 0x01, 0xFF\n\t" + "pushf; pop %0\n\t" + : "=rm"(flags), "=a"(rc) + : "a"(vaddr), "c"(rmp_psize), "d"(validate) + : "memory", "cc"); + + *rflags = flags; + return rc; +} + +#else /* !CONFIG_AMD_MEM_ENCRYPT */ + +static inline int __pvalidate(unsigned long vaddr, int psize, int validate, unsigned long *eflags) +{ + return 0; +} + +#endif /* CONFIG_AMD_MEM_ENCRYPT */ + +#endif /* __ASSEMBLY__ */ +#endif /* __ASM_SECURE_NESTED_PAGING_H */ -- 2.17.1