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