1
2
3
4
5
6
7
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
18 ENTRY(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
27 movl $1, %eax
28 cpuid
29 bt $31, %ecx
30 jnc .Lno_sev
31
32 movl $0x80000000, %eax
33 cpuid
34 cmpl $0x8000001f, %eax
35 jb .Lno_sev
36
37
38
39
40
41
42
43 movl $0x8000001f, %eax
44 cpuid
45 bt $1, %eax
46 jnc .Lno_sev
47
48 movl $MSR_AMD64_SEV, %ecx
49 rdmsr
50 bt $MSR_AMD64_SEV_ENABLED_BIT, %eax
51 jnc .Lno_sev
52
53 movl %ebx, %eax
54 andl $0x3f, %eax
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
66
67 ret
68 ENDPROC(get_sev_encryption_bit)
69
70 .code64
71 ENTRY(set_sev_encryption_mask)
72 #ifdef CONFIG_AMD_MEM_ENCRYPT
73 push %rbp
74 push %rdx
75
76 movq %rsp, %rbp
77
78 call get_sev_encryption_bit
79 testl %eax, %eax
80 jz .Lno_sev_mask
81
82 bts %rax, sme_me_mask(%rip)
83
84 .Lno_sev_mask:
85 movq %rbp, %rsp
86
87 pop %rdx
88 pop %rbp
89 #endif
90
91 xor %rax, %rax
92 ret
93 ENDPROC(set_sev_encryption_mask)
94
95 .data
96
97 #ifdef CONFIG_AMD_MEM_ENCRYPT
98 .balign 8
99 GLOBAL(sme_me_mask)
100 .quad 0
101 #endif