blob: 0c196c47d6215f7f8e54b6bd3760b5ca506f9da8 [file] [log] [blame]
Thomas Gleixnerd2912cb2019-06-04 10:11:33 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Tom Lendacky7744ccd2017-07-17 16:10:03 -05002/*
3 * AMD Memory Encryption Support
4 *
5 * Copyright (C) 2016 Advanced Micro Devices, Inc.
6 *
7 * Author: Tom Lendacky <thomas.lendacky@amd.com>
Tom Lendacky7744ccd2017-07-17 16:10:03 -05008 */
9
10#ifndef __X86_MEM_ENCRYPT_H__
11#define __X86_MEM_ENCRYPT_H__
12
13#ifndef __ASSEMBLY__
14
Tom Lendacky5868f362017-07-17 16:10:05 -050015#include <linux/init.h>
16
Tom Lendackyaca20d52017-07-17 16:10:35 -050017#include <asm/bootparam.h>
18
Tom Lendacky7744ccd2017-07-17 16:10:03 -050019#ifdef CONFIG_AMD_MEM_ENCRYPT
20
Borislav Petkov21d9bb42017-09-07 11:38:37 +020021extern u64 sme_me_mask;
Kirill A. Shutemov1cd9c222018-01-31 16:54:02 +030022extern bool sev_enabled;
Tom Lendacky7744ccd2017-07-17 16:10:03 -050023
Tom Lendacky6ebcb062017-07-17 16:10:32 -050024void 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
Tom Lendacky7f8b7e72017-07-17 16:10:10 -050030void __init sme_early_encrypt(resource_size_t paddr,
31 unsigned long size);
32void __init sme_early_decrypt(resource_size_t paddr,
33 unsigned long size);
34
Tom Lendackyb9d05202017-07-17 16:10:11 -050035void __init sme_map_bootdata(char *real_mode_data);
36void __init sme_unmap_bootdata(char *real_mode_data);
37
Tom Lendacky21729f82017-07-17 16:10:07 -050038void __init sme_early_init(void);
39
Tom Lendacky107cd252018-01-10 13:26:34 -060040void __init sme_encrypt_kernel(struct boot_params *bp);
Tom Lendackyaca20d52017-07-17 16:10:35 -050041void __init sme_enable(struct boot_params *bp);
Tom Lendacky5868f362017-07-17 16:10:05 -050042
Brijesh Singhdfaaec92017-10-20 09:30:56 -050043int __init early_set_memory_decrypted(unsigned long vaddr, unsigned long size);
44int __init early_set_memory_encrypted(unsigned long vaddr, unsigned long size);
45
Tom Lendackyc7753202017-07-17 16:10:21 -050046/* Architecture __weak replacement functions */
47void __init mem_encrypt_init(void);
Brijesh Singhb3f09072018-09-14 08:45:58 -050048void __init mem_encrypt_free_decrypted_mem(void);
Tom Lendackyc7753202017-07-17 16:10:21 -050049
Tom Lendackyd8aa7ee2017-10-20 09:30:44 -050050bool sme_active(void);
51bool sev_active(void);
52
Brijesh Singhb3f09072018-09-14 08:45:58 -050053#define __bss_decrypted __attribute__((__section__(".bss..decrypted")))
54
Tom Lendacky7744ccd2017-07-17 16:10:03 -050055#else /* !CONFIG_AMD_MEM_ENCRYPT */
56
Borislav Petkov21d9bb42017-09-07 11:38:37 +020057#define sme_me_mask 0ULL
Tom Lendacky7744ccd2017-07-17 16:10:03 -050058
Tom Lendacky7f8b7e72017-07-17 16:10:10 -050059static inline void __init sme_early_encrypt(resource_size_t paddr,
60 unsigned long size) { }
61static inline void __init sme_early_decrypt(resource_size_t paddr,
62 unsigned long size) { }
63
Tom Lendackyb9d05202017-07-17 16:10:11 -050064static inline void __init sme_map_bootdata(char *real_mode_data) { }
65static inline void __init sme_unmap_bootdata(char *real_mode_data) { }
66
Tom Lendacky21729f82017-07-17 16:10:07 -050067static inline void __init sme_early_init(void) { }
68
Tom Lendacky107cd252018-01-10 13:26:34 -060069static inline void __init sme_encrypt_kernel(struct boot_params *bp) { }
Tom Lendackyaca20d52017-07-17 16:10:35 -050070static inline void __init sme_enable(struct boot_params *bp) { }
Tom Lendacky5868f362017-07-17 16:10:05 -050071
Tom Lendackyd8aa7ee2017-10-20 09:30:44 -050072static inline bool sme_active(void) { return false; }
73static inline bool sev_active(void) { return false; }
74
Brijesh Singhdfaaec92017-10-20 09:30:56 -050075static inline int __init
76early_set_memory_decrypted(unsigned long vaddr, unsigned long size) { return 0; }
77static inline int __init
78early_set_memory_encrypted(unsigned long vaddr, unsigned long size) { return 0; }
79
Brijesh Singhb3f09072018-09-14 08:45:58 -050080#define __bss_decrypted
81
Tom Lendacky7744ccd2017-07-17 16:10:03 -050082#endif /* CONFIG_AMD_MEM_ENCRYPT */
83
Tom Lendacky21729f82017-07-17 16:10:07 -050084/*
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
Brijesh Singhb3f09072018-09-14 08:45:58 -050093extern char __start_bss_decrypted[], __end_bss_decrypted[], __start_bss_decrypted_unused[];
94
Tom Lendacky7744ccd2017-07-17 16:10:03 -050095#endif /* __ASSEMBLY__ */
96
97#endif /* __X86_MEM_ENCRYPT_H__ */