1 /* SPDX-License-Identifier: GPL-2.0 */
5 #include <linux/bitops.h>
8 #include <linux/rwsem.h>
9 #include <linux/types.h>
14 #define pr_fmt(fmt) "sgx: " fmt
16 #define EREMOVE_ERROR_MESSAGE \
17 "EREMOVE returned %d (0x%x) and an EPC page was leaked. SGX may become unusable. " \
18 "Refer to Documentation/arch/x86/sgx.rst for more information."
20 #define SGX_MAX_EPC_SECTIONS 8
21 #define SGX_EEXTEND_BLOCK_SIZE 256
22 #define SGX_NR_TO_SCAN 16
23 #define SGX_NR_LOW_PAGES 32
24 #define SGX_NR_HIGH_PAGES 64
26 /* Pages, which are being tracked by the page reclaimer. */
27 #define SGX_EPC_PAGE_RECLAIMER_TRACKED BIT(0)
29 /* Pages on free list */
30 #define SGX_EPC_PAGE_IS_FREE BIT(1)
36 struct sgx_encl_page
*owner
;
37 struct list_head list
;
41 * Contains the tracking data for NUMA nodes having EPC pages. Most importantly,
42 * the free page list local to the node is stored here.
44 struct sgx_numa_node
{
45 struct list_head free_page_list
;
46 struct list_head sgx_poison_page_list
;
52 * The firmware can define multiple chunks of EPC to the different areas of the
53 * physical memory e.g. for memory areas of the each node. This structure is
54 * used to store EPC pages for one EPC section and virtual memory area where
55 * the pages have been mapped.
57 struct sgx_epc_section
{
58 unsigned long phys_addr
;
60 struct sgx_epc_page
*pages
;
61 struct sgx_numa_node
*node
;
64 extern struct sgx_epc_section sgx_epc_sections
[SGX_MAX_EPC_SECTIONS
];
66 static inline unsigned long sgx_get_epc_phys_addr(struct sgx_epc_page
*page
)
68 struct sgx_epc_section
*section
= &sgx_epc_sections
[page
->section
];
71 index
= ((unsigned long)page
- (unsigned long)section
->pages
) / sizeof(*page
);
73 return section
->phys_addr
+ index
* PAGE_SIZE
;
76 static inline void *sgx_get_epc_virt_addr(struct sgx_epc_page
*page
)
78 struct sgx_epc_section
*section
= &sgx_epc_sections
[page
->section
];
81 index
= ((unsigned long)page
- (unsigned long)section
->pages
) / sizeof(*page
);
83 return section
->virt_addr
+ index
* PAGE_SIZE
;
86 struct sgx_epc_page
*__sgx_alloc_epc_page(void);
87 void sgx_free_epc_page(struct sgx_epc_page
*page
);
89 void sgx_reclaim_direct(void);
90 void sgx_mark_page_reclaimable(struct sgx_epc_page
*page
);
91 int sgx_unmark_page_reclaimable(struct sgx_epc_page
*page
);
92 struct sgx_epc_page
*sgx_alloc_epc_page(void *owner
, bool reclaim
);
94 void sgx_ipi_cb(void *info
);
96 #ifdef CONFIG_X86_SGX_KVM
97 int __init
sgx_vepc_init(void);
99 static inline int __init
sgx_vepc_init(void)
105 void sgx_update_lepubkeyhash(u64
*lepubkeyhash
);
107 #endif /* _X86_SGX_H */