Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0-only */ 2 : : /* 3 : : * AMD Memory Encryption Support 4 : : * 5 : : * Copyright (C) 2016 Advanced Micro Devices, Inc. 6 : : * 7 : : * Author: Tom Lendacky <thomas.lendacky@amd.com> 8 : : */ 9 : : 10 : : #ifndef __X86_MEM_ENCRYPT_H__ 11 : : #define __X86_MEM_ENCRYPT_H__ 12 : : 13 : : #ifndef __ASSEMBLY__ 14 : : 15 : : #include <linux/init.h> 16 : : 17 : : #include <asm/bootparam.h> 18 : : 19 : : #ifdef CONFIG_AMD_MEM_ENCRYPT 20 : : 21 : : extern u64 sme_me_mask; 22 : : extern bool sev_enabled; 23 : : 24 : : void sme_encrypt_execute(unsigned long encrypted_kernel_vaddr, 25 : : unsigned long decrypted_kernel_vaddr, 26 : : unsigned long kernel_len, 27 : : unsigned long encryption_wa, 28 : : unsigned long encryption_pgd); 29 : : 30 : : void __init sme_early_encrypt(resource_size_t paddr, 31 : : unsigned long size); 32 : : void __init sme_early_decrypt(resource_size_t paddr, 33 : : unsigned long size); 34 : : 35 : : void __init sme_map_bootdata(char *real_mode_data); 36 : : void __init sme_unmap_bootdata(char *real_mode_data); 37 : : 38 : : void __init sme_early_init(void); 39 : : 40 : : void __init sme_encrypt_kernel(struct boot_params *bp); 41 : : void __init sme_enable(struct boot_params *bp); 42 : : 43 : : int __init early_set_memory_decrypted(unsigned long vaddr, unsigned long size); 44 : : int __init early_set_memory_encrypted(unsigned long vaddr, unsigned long size); 45 : : 46 : : /* Architecture __weak replacement functions */ 47 : : void __init mem_encrypt_init(void); 48 : : void __init mem_encrypt_free_decrypted_mem(void); 49 : : 50 : : bool sme_active(void); 51 : : bool sev_active(void); 52 : : 53 : : #define __bss_decrypted __attribute__((__section__(".bss..decrypted"))) 54 : : 55 : : #else /* !CONFIG_AMD_MEM_ENCRYPT */ 56 : : 57 : : #define sme_me_mask 0ULL 58 : : 59 : : static inline void __init sme_early_encrypt(resource_size_t paddr, 60 : : unsigned long size) { } 61 : : static inline void __init sme_early_decrypt(resource_size_t paddr, 62 : : unsigned long size) { } 63 : : 64 : 21 : static inline void __init sme_map_bootdata(char *real_mode_data) { } 65 : 21 : static inline void __init sme_unmap_bootdata(char *real_mode_data) { } 66 : : 67 : 21 : static inline void __init sme_early_init(void) { } 68 : : 69 : 0 : static inline void __init sme_encrypt_kernel(struct boot_params *bp) { } 70 [ # # ]: 0 : static inline void __init sme_enable(struct boot_params *bp) { } 71 : : 72 : 63 : static inline bool sme_active(void) { return false; } 73 [ # # # # ]: 189 : static inline bool sev_active(void) { return false; } 74 : : 75 : : static inline int __init 76 : : early_set_memory_decrypted(unsigned long vaddr, unsigned long size) { return 0; } 77 : : static inline int __init 78 : : early_set_memory_encrypted(unsigned long vaddr, unsigned long size) { return 0; } 79 : : 80 : : #define __bss_decrypted 81 : : 82 : : #endif /* CONFIG_AMD_MEM_ENCRYPT */ 83 : : 84 : : /* 85 : : * The __sme_pa() and __sme_pa_nodebug() macros are meant for use when 86 : : * writing to or comparing values from the cr3 register. Having the 87 : : * encryption mask set in cr3 enables the PGD entry to be encrypted and 88 : : * avoid special case handling of PGD allocations. 89 : : */ 90 : : #define __sme_pa(x) (__pa(x) | sme_me_mask) 91 : : #define __sme_pa_nodebug(x) (__pa_nodebug(x) | sme_me_mask) 92 : : 93 : : extern char __start_bss_decrypted[], __end_bss_decrypted[], __start_bss_decrypted_unused[]; 94 : : 95 : 39291 : static inline bool mem_encrypt_active(void) 96 : : { 97 [ # # ]: 39291 : return sme_me_mask; 98 : : } 99 : : 100 : 0 : static inline u64 sme_get_me_mask(void) 101 : : { 102 [ # # # # ]: 0 : return sme_me_mask; 103 : : } 104 : : 105 : : #endif /* __ASSEMBLY__ */ 106 : : 107 : : #endif /* __X86_MEM_ENCRYPT_H__ */