2 * AMD Memory Encryption Support
4 * Copyright (C) 2017 Advanced Micro Devices, Inc.
6 * Author: Tom Lendacky <thomas.lendacky@amd.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 #include <linux/linkage.h>
15 #include <asm/processor-flags.h>
17 #include <asm/asm-offsets.h>
21 ENTRY(get_sev_encryption_bit)
24 #ifdef CONFIG_AMD_MEM_ENCRYPT
29 /* Check if running under a hypervisor */
32 bt $31, %ecx /* Check the hypervisor bit */
35 movl $0x80000000, %eax /* CPUID to check the highest leaf */
37 cmpl $0x8000001f, %eax /* See if 0x8000001f is available */
41 * Check for the SEV feature:
42 * CPUID Fn8000_001F[EAX] - Bit 1
43 * CPUID Fn8000_001F[EBX] - Bits 5:0
44 * Pagetable bit position used to indicate encryption
46 movl $0x8000001f, %eax
48 bt $1, %eax /* Check if SEV is available */
51 movl $MSR_AMD64_SEV, %ecx /* Read the SEV MSR */
53 bt $MSR_AMD64_SEV_ENABLED_BIT, %eax /* Check if SEV is active */
57 andl $0x3f, %eax /* Return the encryption bit location */
68 #endif /* CONFIG_AMD_MEM_ENCRYPT */
71 ENDPROC(get_sev_encryption_bit)
74 ENTRY(set_sev_encryption_mask)
75 #ifdef CONFIG_AMD_MEM_ENCRYPT
79 movq %rsp, %rbp /* Save current stack pointer */
81 call get_sev_encryption_bit /* Get the encryption bit position */
85 bts %rax, sme_me_mask(%rip) /* Create the encryption mask */
88 movq %rbp, %rsp /* Restore original stack pointer */
96 ENDPROC(set_sev_encryption_mask)
100 #ifdef CONFIG_AMD_MEM_ENCRYPT