xref: /optee_os/core/include/mm/fobj.h (revision fbcaa4115ecf8426fac627ad5548228d0d7e2894)
1ee546289SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
2ee546289SJens Wiklander /*
3ee546289SJens Wiklander  * Copyright (c) 2019, Linaro Limited
4ee546289SJens Wiklander  */
5ee546289SJens Wiklander 
6ee546289SJens Wiklander #ifndef __MM_FOBJ_H
7ee546289SJens Wiklander #define __MM_FOBJ_H
8ee546289SJens Wiklander 
9ee546289SJens Wiklander #include <kernel/refcount.h>
10ee546289SJens Wiklander #include <kernel/panic.h>
11ee546289SJens Wiklander #include <tee_api_types.h>
12ee546289SJens Wiklander #include <types_ext.h>
13ee546289SJens Wiklander 
14ee546289SJens Wiklander /*
15ee546289SJens Wiklander  * struct fobj - file object storage abstraction
16ee546289SJens Wiklander  * @ops:	Operations pointer
17ee546289SJens Wiklander  * @num_pages:	Number of pages covered
18ee546289SJens Wiklander  * @refc:	Reference counter
19ee546289SJens Wiklander  */
20ee546289SJens Wiklander struct fobj {
21ee546289SJens Wiklander 	const struct fobj_ops *ops;
22ee546289SJens Wiklander 	unsigned int num_pages;
23ee546289SJens Wiklander 	struct refcount refc;
24ee546289SJens Wiklander };
25ee546289SJens Wiklander 
26ee546289SJens Wiklander /*
27ee546289SJens Wiklander  * struct fobj_ops - operations struct for struct fobj
28ee546289SJens Wiklander  * @free:	Frees the @fobj
29ee546289SJens Wiklander  * @load_page:	Loads page with index @page_idx at address @va
30ee546289SJens Wiklander  * @save_page:	Saves page with index @page_idx from address @va
31*fbcaa411SJens Wiklander  * @get_pa:	Returns physical address of page at @page_idx if not paged
32ee546289SJens Wiklander  */
33ee546289SJens Wiklander struct fobj_ops {
34ee546289SJens Wiklander 	void (*free)(struct fobj *fobj);
35ee546289SJens Wiklander #ifdef CFG_WITH_PAGER
36ee546289SJens Wiklander 	TEE_Result (*load_page)(struct fobj *fobj, unsigned int page_idx,
37ee546289SJens Wiklander 				void *va);
38ee546289SJens Wiklander 	TEE_Result (*save_page)(struct fobj *fobj, unsigned int page_idx,
39ee546289SJens Wiklander 				const void *va);
40ee546289SJens Wiklander #endif
41*fbcaa411SJens Wiklander 	paddr_t (*get_pa)(struct fobj *fobj, unsigned int page_idx);
42ee546289SJens Wiklander };
43ee546289SJens Wiklander 
44ee546289SJens Wiklander #ifdef CFG_WITH_PAGER
45ee546289SJens Wiklander /*
46ee546289SJens Wiklander  * fobj_locked_paged_alloc() - Allocate storage which is locked in memory
47ee546289SJens Wiklander  * @num_pages:	Number of pages covered
48ee546289SJens Wiklander  *
49ee546289SJens Wiklander  * This object only supports loading pages zero initialized. Saving a page
50ee546289SJens Wiklander  * will result in an error.
51ee546289SJens Wiklander  *
52ee546289SJens Wiklander  * Returns a valid pointer on success or NULL on failure.
53ee546289SJens Wiklander  */
54ee546289SJens Wiklander struct fobj *fobj_locked_paged_alloc(unsigned int num_pages);
55ee546289SJens Wiklander 
56ee546289SJens Wiklander /*
57ee546289SJens Wiklander  * fobj_rw_paged_alloc() - Allocate read/write storage
58ee546289SJens Wiklander  * @num_pages:	Number of pages covered
59ee546289SJens Wiklander  *
60ee546289SJens Wiklander  * This object supports both load and saving of pages. Pages are zero
61ee546289SJens Wiklander  * initialized the first time they are loaded.
62ee546289SJens Wiklander  *
63ee546289SJens Wiklander  * Returns a valid pointer on success or NULL on failure.
64ee546289SJens Wiklander  */
65ee546289SJens Wiklander struct fobj *fobj_rw_paged_alloc(unsigned int num_pages);
66ee546289SJens Wiklander 
67ee546289SJens Wiklander /*
68ee546289SJens Wiklander  * fobj_ro_paged_alloc() - Allocate initialized read-only storage
69ee546289SJens Wiklander  * @num_pages:	Number of pages covered
70ee546289SJens Wiklander  * @hashes:	Hashes to verify the pages
71ee546289SJens Wiklander  * @store:	Clear text data for all pages
72ee546289SJens Wiklander  *
73ee546289SJens Wiklander  * This object only support loading pages with an already provided content
74ee546289SJens Wiklander  * in @store. When a page is loaded it will be verified against an hash in
75ee546289SJens Wiklander  * @hash. Saving a page will result in an error.
76ee546289SJens Wiklander  *
77ee546289SJens Wiklander  * Returns a valid pointer on success or NULL on failure.
78ee546289SJens Wiklander  */
79ee546289SJens Wiklander struct fobj *fobj_ro_paged_alloc(unsigned int num_pages, void *hashes,
80ee546289SJens Wiklander 				 void *store);
81ee546289SJens Wiklander 
82ee546289SJens Wiklander /*
83ee546289SJens Wiklander  * fobj_load_page() - Load a page into memory
84ee546289SJens Wiklander  * @fobj:	Fobj pointer
85ee546289SJens Wiklander  * @page_index:	Index of page in @fobj
86ee546289SJens Wiklander  * @va:		Address where content should be stored and verified
87ee546289SJens Wiklander  *
88ee546289SJens Wiklander  * Returns TEE_SUCCESS on success or TEE_ERROR_* on failure.
89ee546289SJens Wiklander  */
90ee546289SJens Wiklander static inline TEE_Result fobj_load_page(struct fobj *fobj,
91ee546289SJens Wiklander 					unsigned int page_idx, void *va)
92ee546289SJens Wiklander {
93ee546289SJens Wiklander 	if (fobj)
94ee546289SJens Wiklander 		return fobj->ops->load_page(fobj, page_idx, va);
95ee546289SJens Wiklander 
96ee546289SJens Wiklander 	return TEE_ERROR_GENERIC;
97ee546289SJens Wiklander }
98ee546289SJens Wiklander 
99ee546289SJens Wiklander /*
100ee546289SJens Wiklander  * fobj_save_page() - Save a page into storage
101ee546289SJens Wiklander  * @fobj:	Fobj pointer
102ee546289SJens Wiklander  * @page_index:	Index of page in @fobj
103ee546289SJens Wiklander  * @va:		Address of the page to store.
104ee546289SJens Wiklander  *
105ee546289SJens Wiklander  * Returns TEE_SUCCESS on success or TEE_ERROR_* on failure.
106ee546289SJens Wiklander  */
107ee546289SJens Wiklander static inline TEE_Result fobj_save_page(struct fobj *fobj,
108ee546289SJens Wiklander 					unsigned int page_idx, const void *va)
109ee546289SJens Wiklander {
110ee546289SJens Wiklander 	if (fobj)
111ee546289SJens Wiklander 		return fobj->ops->save_page(fobj, page_idx, va);
112ee546289SJens Wiklander 
113ee546289SJens Wiklander 	return TEE_ERROR_GENERIC;
114ee546289SJens Wiklander }
115ee546289SJens Wiklander #endif
116ee546289SJens Wiklander 
117ee546289SJens Wiklander /*
118*fbcaa411SJens Wiklander  * fobj_ta_mem_alloc() - Allocates TA memory
119*fbcaa411SJens Wiklander  * @num_pages:	Number of pages
120*fbcaa411SJens Wiklander  *
121*fbcaa411SJens Wiklander  * If paging of user TAs read/write paged fobj is allocated otherwise a
122*fbcaa411SJens Wiklander  * fobj which uses unpaged secure memory directly.
123*fbcaa411SJens Wiklander  *
124*fbcaa411SJens Wiklander  * Returns a valid pointer on success or NULL on failure.
125*fbcaa411SJens Wiklander  */
126*fbcaa411SJens Wiklander #ifdef CFG_PAGED_USER_TA
127*fbcaa411SJens Wiklander #define fobj_ta_mem_alloc(num_pages)	fobj_rw_paged_alloc(num_pages)
128*fbcaa411SJens Wiklander #else
129*fbcaa411SJens Wiklander /*
130*fbcaa411SJens Wiklander  * fobj_sec_mem_alloc() - Allocates storage directly in secure memory
131*fbcaa411SJens Wiklander  * @num_pages:	Number of pages
132*fbcaa411SJens Wiklander  *
133*fbcaa411SJens Wiklander  * Returns a valid pointer on success or NULL on failure.
134*fbcaa411SJens Wiklander  */
135*fbcaa411SJens Wiklander struct fobj *fobj_sec_mem_alloc(unsigned int num_pages);
136*fbcaa411SJens Wiklander 
137*fbcaa411SJens Wiklander #define fobj_ta_mem_alloc(num_pages)	fobj_sec_mem_alloc(num_pages)
138*fbcaa411SJens Wiklander #endif
139*fbcaa411SJens Wiklander 
140*fbcaa411SJens Wiklander /*
141ee546289SJens Wiklander  * fobj_get() - Increase fobj reference count
142ee546289SJens Wiklander  * @fobj:	Fobj pointer
143ee546289SJens Wiklander  *
144ee546289SJens Wiklander  * Returns @fobj, if @fobj isn't NULL its reference counter is first
145ee546289SJens Wiklander  * increased.
146ee546289SJens Wiklander  */
147ee546289SJens Wiklander static inline struct fobj *fobj_get(struct fobj *fobj)
148ee546289SJens Wiklander {
149ee546289SJens Wiklander 	if (fobj && !refcount_inc(&fobj->refc))
150ee546289SJens Wiklander 		panic();
151ee546289SJens Wiklander 
152ee546289SJens Wiklander 	return fobj;
153ee546289SJens Wiklander }
154ee546289SJens Wiklander 
155ee546289SJens Wiklander /*
156ee546289SJens Wiklander  * fobj_put() - Decrease reference counter of fobj
157ee546289SJens Wiklander  * @fobj:	Fobj pointer
158ee546289SJens Wiklander  *
159ee546289SJens Wiklander  * If reference counter reaches 0, matching the numbers of fobj_alloc_*() +
160ee546289SJens Wiklander  * fobj_get(), the fobj is freed.
161ee546289SJens Wiklander  */
162ee546289SJens Wiklander static inline void fobj_put(struct fobj *fobj)
163ee546289SJens Wiklander {
164ee546289SJens Wiklander 	if (fobj && refcount_dec(&fobj->refc))
165ee546289SJens Wiklander 		fobj->ops->free(fobj);
166ee546289SJens Wiklander }
167ee546289SJens Wiklander 
168ee546289SJens Wiklander #ifdef CFG_WITH_PAGER
169ee546289SJens Wiklander /*
170ee546289SJens Wiklander  * fobj_generate_authenc_key() - Generate authentication key
171ee546289SJens Wiklander  *
172ee546289SJens Wiklander  * Generates the authentication key used in all fobjs allocated with
173ee546289SJens Wiklander  * fobj_rw_paged_alloc().
174ee546289SJens Wiklander  */
175ee546289SJens Wiklander void fobj_generate_authenc_key(void);
176ee546289SJens Wiklander #else
177ee546289SJens Wiklander static inline void fobj_generate_authenc_key(void)
178ee546289SJens Wiklander {
179ee546289SJens Wiklander }
180ee546289SJens Wiklander #endif
181ee546289SJens Wiklander 
182ee546289SJens Wiklander #endif /*__MM_FOBJ_H*/
183