1 /* SPDX-License-Identifier: BSD-3-Clause */
2
3 #ifndef _CBFS_H_
4 #define _CBFS_H_
5
6 #include <commonlib/bsd/cb_err.h>
7 #include <commonlib/bsd/cbfs_mdata.h>
8 #include <endian.h>
9 #include <stdbool.h>
10
11
12 /**********************************************************************************************
13 * CBFS FILE ACCESS APIs *
14 **********************************************************************************************/
15
16 /* For documentation look in src/include/cbfs.h file in the main coreboot source tree. */
17
18 static inline size_t cbfs_load(const char *name, void *buf, size_t size);
19 static inline size_t cbfs_ro_load(const char *name, void *buf, size_t size);
20 static inline size_t cbfs_unverified_area_load(const char *area, const char *name, void *buf,
21 size_t size);
22
23 static inline void *cbfs_map(const char *name, size_t *size_out);
24 static inline void *cbfs_ro_map(const char *name, size_t *size_out);
25 static inline void *cbfs_unverified_area_map(const char *area, const char *name,
26 size_t *size_out);
27
28 void cbfs_unmap(void *mapping);
29
30 static inline size_t cbfs_get_size(const char *name);
31 static inline size_t cbfs_ro_get_size(const char *name);
32
33 static inline enum cbfs_type cbfs_get_type(const char *name);
34 static inline enum cbfs_type cbfs_ro_get_type(const char *name);
35
36 static inline bool cbfs_file_exists(const char *name);
37 static inline bool cbfs_ro_file_exists(const char *name);
38
39 /**********************************************************************************************
40 * INTERNAL HELPERS FOR INLINES, DO NOT USE. *
41 **********************************************************************************************/
42 ssize_t _cbfs_boot_lookup(const char *name, bool force_ro, union cbfs_mdata *mdata);
43
44 void *_cbfs_load(const char *name, void *buf, size_t *size_inout, bool force_ro);
45
46 void *_cbfs_unverified_area_load(const char *area, const char *name, void *buf,
47 size_t *size_inout);
48
49 /**********************************************************************************************
50 * INLINE IMPLEMENTATIONS *
51 **********************************************************************************************/
52
cbfs_map(const char * name,size_t * size_out)53 static inline void *cbfs_map(const char *name, size_t *size_out)
54 {
55 return _cbfs_load(name, NULL, size_out, false);
56 }
57
cbfs_ro_map(const char * name,size_t * size_out)58 static inline void *cbfs_ro_map(const char *name, size_t *size_out)
59 {
60 return _cbfs_load(name, NULL, size_out, true);
61 }
62
cbfs_unverified_area_map(const char * area,const char * name,size_t * size_out)63 static inline void *cbfs_unverified_area_map(const char *area, const char *name,
64 size_t *size_out)
65 {
66 return _cbfs_unverified_area_load(area, name, NULL, size_out);
67 }
68
cbfs_load(const char * name,void * buf,size_t size)69 static inline size_t cbfs_load(const char *name, void *buf, size_t size)
70 {
71 if (_cbfs_load(name, buf, &size, false))
72 return size;
73 else
74 return 0;
75 }
76
cbfs_ro_load(const char * name,void * buf,size_t size)77 static inline size_t cbfs_ro_load(const char *name, void *buf, size_t size)
78 {
79 if (_cbfs_load(name, buf, &size, true))
80 return size;
81 else
82 return 0;
83 }
84
cbfs_unverified_area_load(const char * area,const char * name,void * buf,size_t size)85 static inline size_t cbfs_unverified_area_load(const char *area, const char *name, void *buf,
86 size_t size)
87 {
88 if (_cbfs_unverified_area_load(area, name, buf, &size))
89 return size;
90 else
91 return 0;
92 }
93
cbfs_get_size(const char * name)94 static inline size_t cbfs_get_size(const char *name)
95 {
96 union cbfs_mdata mdata;
97 if (_cbfs_boot_lookup(name, false, &mdata) < 0)
98 return 0;
99 else
100 return be32toh(mdata.h.len);
101 }
102
cbfs_ro_get_size(const char * name)103 static inline size_t cbfs_ro_get_size(const char *name)
104 {
105 union cbfs_mdata mdata;
106 if (_cbfs_boot_lookup(name, true, &mdata) < 0)
107 return 0;
108 else
109 return be32toh(mdata.h.len);
110 }
111
cbfs_get_type(const char * name)112 static inline enum cbfs_type cbfs_get_type(const char *name)
113 {
114 union cbfs_mdata mdata;
115 if (_cbfs_boot_lookup(name, false, &mdata) < 0)
116 return CBFS_TYPE_NULL;
117 else
118 return be32toh(mdata.h.type);
119 }
120
cbfs_ro_get_type(const char * name)121 static inline enum cbfs_type cbfs_ro_get_type(const char *name)
122 {
123 union cbfs_mdata mdata;
124 if (_cbfs_boot_lookup(name, true, &mdata) < 0)
125 return CBFS_TYPE_NULL;
126 else
127 return be32toh(mdata.h.type);
128 }
129
cbfs_file_exists(const char * name)130 static inline bool cbfs_file_exists(const char *name)
131 {
132 union cbfs_mdata mdata;
133 return _cbfs_boot_lookup(name, false, &mdata) >= 0;
134 }
135
cbfs_ro_file_exists(const char * name)136 static inline bool cbfs_ro_file_exists(const char *name)
137 {
138 union cbfs_mdata mdata;
139 return _cbfs_boot_lookup(name, true, &mdata) >= 0;
140 }
141
142 #endif
143