Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * AMD Memory Encryption Support
  4 *
  5 * Copyright (C) 2017 Advanced Micro Devices, Inc.
  6 *
  7 * Author: Tom Lendacky <thomas.lendacky@amd.com>
  8 */
  9
 10#include <linux/linkage.h>
 11
 12#include <asm/processor-flags.h>
 13#include <asm/msr.h>
 14#include <asm/asm-offsets.h>
 15
 16	.text
 17	.code32
 18SYM_FUNC_START(get_sev_encryption_bit)
 19	xor	%eax, %eax
 20
 21#ifdef CONFIG_AMD_MEM_ENCRYPT
 22	push	%ebx
 23	push	%ecx
 24	push	%edx
 25
 26	/* Check if running under a hypervisor */
 27	movl	$1, %eax
 28	cpuid
 29	bt	$31, %ecx		/* Check the hypervisor bit */
 30	jnc	.Lno_sev
 31
 32	movl	$0x80000000, %eax	/* CPUID to check the highest leaf */
 33	cpuid
 34	cmpl	$0x8000001f, %eax	/* See if 0x8000001f is available */
 35	jb	.Lno_sev
 36
 37	/*
 38	 * Check for the SEV feature:
 39	 *   CPUID Fn8000_001F[EAX] - Bit 1
 40	 *   CPUID Fn8000_001F[EBX] - Bits 5:0
 41	 *     Pagetable bit position used to indicate encryption
 42	 */
 43	movl	$0x8000001f, %eax
 44	cpuid
 45	bt	$1, %eax		/* Check if SEV is available */
 46	jnc	.Lno_sev
 47
 48	movl	$MSR_AMD64_SEV, %ecx	/* Read the SEV MSR */
 49	rdmsr
 50	bt	$MSR_AMD64_SEV_ENABLED_BIT, %eax	/* Check if SEV is active */
 51	jnc	.Lno_sev
 52
 53	movl	%ebx, %eax
 54	andl	$0x3f, %eax		/* Return the encryption bit location */
 55	jmp	.Lsev_exit
 56
 57.Lno_sev:
 58	xor	%eax, %eax
 59
 60.Lsev_exit:
 61	pop	%edx
 62	pop	%ecx
 63	pop	%ebx
 64
 65#endif	/* CONFIG_AMD_MEM_ENCRYPT */
 66
 67	ret
 68SYM_FUNC_END(get_sev_encryption_bit)
 69
 70	.code64
 71SYM_FUNC_START(set_sev_encryption_mask)
 72#ifdef CONFIG_AMD_MEM_ENCRYPT
 73	push	%rbp
 74	push	%rdx
 75
 76	movq	%rsp, %rbp		/* Save current stack pointer */
 77
 78	call	get_sev_encryption_bit	/* Get the encryption bit position */
 79	testl	%eax, %eax
 80	jz	.Lno_sev_mask
 81
 82	bts	%rax, sme_me_mask(%rip)	/* Create the encryption mask */
 83
 84.Lno_sev_mask:
 85	movq	%rbp, %rsp		/* Restore original stack pointer */
 86
 87	pop	%rdx
 88	pop	%rbp
 89#endif
 90
 91	xor	%rax, %rax
 92	ret
 93SYM_FUNC_END(set_sev_encryption_mask)
 94
 95	.data
 96
 97#ifdef CONFIG_AMD_MEM_ENCRYPT
 98	.balign	8
 99SYM_DATA(sme_me_mask, .quad 0)
100#endif