]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/sev: Add support for the RMPREAD instruction
authorTom Lendacky <thomas.lendacky@amd.com>
Mon, 2 Dec 2024 20:50:47 +0000 (14:50 -0600)
committerBorislav Petkov (AMD) <bp@alien8.de>
Sat, 14 Dec 2024 00:02:30 +0000 (01:02 +0100)
The RMPREAD instruction returns an architecture defined format of an
RMP table entry. This is the preferred method for examining RMP entries.

The instruction is advertised in CPUID 0x8000001f_EAX[21]. Use this
instruction when available.

Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Nikunj A Dadhania <nikunj@amd.com>
Reviewed-by: Neeraj Upadhyay <Neeraj.Upadhyay@amd.com>
Reviewed-by: Ashish Kalra <ashish.kalra@amd.com>
Link: https://lore.kernel.org/r/72c734ac8b324bbc0c839b2c093a11af4a8881fa.1733172653.git.thomas.lendacky@amd.com
arch/x86/include/asm/cpufeatures.h
arch/x86/virt/svm/sev.c

index 17b6590748c00cc11f4a527255679d3eb2475a31..5535edc6e8d710875306d078d887acf3f3f3db80 100644 (file)
 #define X86_FEATURE_V_TSC_AUX          (19*32+ 9) /* Virtual TSC_AUX */
 #define X86_FEATURE_SME_COHERENT       (19*32+10) /* AMD hardware-enforced cache coherency */
 #define X86_FEATURE_DEBUG_SWAP         (19*32+14) /* "debug_swap" AMD SEV-ES full debug state swap support */
+#define X86_FEATURE_RMPREAD            (19*32+21) /* RMPREAD instruction */
 #define X86_FEATURE_SVSM               (19*32+28) /* "svsm" SVSM present */
 
 /* AMD-defined Extended Feature 2 EAX, CPUID level 0x80000021 (EAX), word 20 */
index cf64e9384ea0aad2a07e00b38f7992ed8da3661c..18191cbd78c590b35058e06de9a6fe1459572d23 100644 (file)
@@ -306,6 +306,18 @@ static int get_rmpentry(u64 pfn, struct rmpentry *e)
 {
        struct rmpentry_raw *e_raw;
 
+       if (cpu_feature_enabled(X86_FEATURE_RMPREAD)) {
+               int ret;
+
+               /* Binutils version 2.44 supports the RMPREAD mnemonic. */
+               asm volatile(".byte 0xf2, 0x0f, 0x01, 0xfd"
+                            : "=a" (ret)
+                            : "a" (pfn << PAGE_SHIFT), "c" (e)
+                            : "memory", "cc");
+
+               return ret;
+       }
+
        e_raw = get_raw_rmpentry(pfn);
        if (IS_ERR(e_raw))
                return PTR_ERR(e_raw);