| |
| |
| |
| |
| |
| |
| |
| |
| |
| #include <linux/linkage.h> |
| |
| #include <asm/processor-flags.h> |
| #include <asm/msr.h> |
| #include <asm/asm-offsets.h> |
| |
| <------>.text |
| <------>.code32 |
| SYM_FUNC_START(get_sev_encryption_bit) |
| <------>xor %eax, %eax |
| |
| #ifdef CONFIG_AMD_MEM_ENCRYPT |
| <------>push %ebx |
| <------>push %ecx |
| <------>push %edx |
| |
| <------>movl $0x80000000, %eax |
| <------>cpuid |
| <------>cmpl $0x8000001f, %eax |
| <------>jb .Lno_sev |
| |
| <------> |
| <------> * Check for the SEV feature: |
| <------> * CPUID Fn8000_001F[EAX] - Bit 1 |
| <------> * CPUID Fn8000_001F[EBX] - Bits 5:0 |
| <------> * Pagetable bit position used to indicate encryption |
| <------> */ |
| <------>movl $0x8000001f, %eax |
| <------>cpuid |
| <------>bt $1, %eax |
| <------>jnc .Lno_sev |
| |
| <------>movl $MSR_AMD64_SEV, %ecx |
| <------>rdmsr |
| <------>bt $MSR_AMD64_SEV_ENABLED_BIT, %eax |
| <------>jnc .Lno_sev |
| |
| <------>movl %ebx, %eax |
| <------>andl $0x3f, %eax |
| <------>jmp .Lsev_exit |
| |
| .Lno_sev: |
| <------>xor %eax, %eax |
| |
| .Lsev_exit: |
| <------>pop %edx |
| <------>pop %ecx |
| <------>pop %ebx |
| |
| #endif |
| |
| <------>ret |
| SYM_FUNC_END(get_sev_encryption_bit) |
| |
| <------>.code64 |
| |
| #include "../../kernel/sev_verify_cbit.S" |
| |
| SYM_FUNC_START(set_sev_encryption_mask) |
| #ifdef CONFIG_AMD_MEM_ENCRYPT |
| <------>push %rbp |
| <------>push %rdx |
| |
| <------>movq %rsp, %rbp |
| |
| <------>call get_sev_encryption_bit |
| <------>testl %eax, %eax |
| <------>jz .Lno_sev_mask |
| |
| <------>bts %rax, sme_me_mask(%rip) |
| |
| <------> |
| <------> * Read MSR_AMD64_SEV again and store it to sev_status. Can't do this in |
| <------> * get_sev_encryption_bit() because this function is 32-bit code and |
| <------> * shared between 64-bit and 32-bit boot path. |
| <------> */ |
| <------>movl $MSR_AMD64_SEV, %ecx |
| <------>rdmsr |
| |
| <------> |
| <------>shlq $32, %rdx |
| <------>orq %rdx, %rax |
| <------>movq %rax, sev_status(%rip) |
| |
| .Lno_sev_mask: |
| <------>movq %rbp, %rsp |
| |
| <------>pop %rdx |
| <------>pop %rbp |
| #endif |
| |
| <------>xor %rax, %rax |
| <------>ret |
| SYM_FUNC_END(set_sev_encryption_mask) |
| |
| <------>.data |
| |
| #ifdef CONFIG_AMD_MEM_ENCRYPT |
| <------>.balign 8 |
| SYM_DATA(sme_me_mask, .quad 0) |
| SYM_DATA(sev_status, .quad 0) |
| SYM_DATA(sev_check_data, .quad 0) |
| #endif |
| |
| |