]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - rpmsg/rpmsg.git/blob - arch/x86/boot/compressed/mem_encrypt.S
Merge tag 'devicetree-fixes-for-4.19-3' of git://git.kernel.org/pub/scm/linux/kernel...
[rpmsg/rpmsg.git] / arch / x86 / boot / compressed / mem_encrypt.S
1 /*
2  * AMD Memory Encryption Support
3  *
4  * Copyright (C) 2017 Advanced Micro Devices, Inc.
5  *
6  * Author: Tom Lendacky <thomas.lendacky@amd.com>
7  *
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.
11  */
13 #include <linux/linkage.h>
15 #include <asm/processor-flags.h>
16 #include <asm/msr.h>
17 #include <asm/asm-offsets.h>
19         .text
20         .code32
21 ENTRY(get_sev_encryption_bit)
22         xor     %eax, %eax
24 #ifdef CONFIG_AMD_MEM_ENCRYPT
25         push    %ebx
26         push    %ecx
27         push    %edx
29         /* Check if running under a hypervisor */
30         movl    $1, %eax
31         cpuid
32         bt      $31, %ecx               /* Check the hypervisor bit */
33         jnc     .Lno_sev
35         movl    $0x80000000, %eax       /* CPUID to check the highest leaf */
36         cpuid
37         cmpl    $0x8000001f, %eax       /* See if 0x8000001f is available */
38         jb      .Lno_sev
40         /*
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
45          */
46         movl    $0x8000001f, %eax
47         cpuid
48         bt      $1, %eax                /* Check if SEV is available */
49         jnc     .Lno_sev
51         movl    $MSR_AMD64_SEV, %ecx    /* Read the SEV MSR */
52         rdmsr
53         bt      $MSR_AMD64_SEV_ENABLED_BIT, %eax        /* Check if SEV is active */
54         jnc     .Lno_sev
56         movl    %ebx, %eax
57         andl    $0x3f, %eax             /* Return the encryption bit location */
58         jmp     .Lsev_exit
60 .Lno_sev:
61         xor     %eax, %eax
63 .Lsev_exit:
64         pop     %edx
65         pop     %ecx
66         pop     %ebx
68 #endif  /* CONFIG_AMD_MEM_ENCRYPT */
70         ret
71 ENDPROC(get_sev_encryption_bit)
73         .code64
74 ENTRY(set_sev_encryption_mask)
75 #ifdef CONFIG_AMD_MEM_ENCRYPT
76         push    %rbp
77         push    %rdx
79         movq    %rsp, %rbp              /* Save current stack pointer */
81         call    get_sev_encryption_bit  /* Get the encryption bit position */
82         testl   %eax, %eax
83         jz      .Lno_sev_mask
85         bts     %rax, sme_me_mask(%rip) /* Create the encryption mask */
87 .Lno_sev_mask:
88         movq    %rbp, %rsp              /* Restore original stack pointer */
90         pop     %rdx
91         pop     %rbp
92 #endif
94         xor     %rax, %rax
95         ret
96 ENDPROC(set_sev_encryption_mask)
98         .data
100 #ifdef CONFIG_AMD_MEM_ENCRYPT
101         .balign 8
102 GLOBAL(sme_me_mask)
103         .quad   0
104 #endif