iPXE
image.h
Go to the documentation of this file.
1#ifndef _IPXE_IMAGE_H
2#define _IPXE_IMAGE_H
3
4/**
5 * @file
6 *
7 * Executable images
8 *
9 */
10
11FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
12FILE_SECBOOT ( PERMITTED );
13
14#include <ipxe/tables.h>
15#include <ipxe/list.h>
16#include <ipxe/refcnt.h>
17
18struct uri;
19struct pixel_buffer;
20struct asn1_cursor;
21struct image_type;
22
23/** An executable image */
24struct image {
25 /** Reference count */
26 struct refcnt refcnt;
27
28 /** List of registered images */
30
31 /** URI of image */
32 struct uri *uri;
33 /** Name
34 *
35 * If the @c IMAGE_STATIC_NAME flag is set, then this is a
36 * statically allocated string.
37 */
38 char *name;
39 /** Flags */
40 unsigned int flags;
41
42 /** Command line to pass to image */
43 char *cmdline;
44 /** Raw file image
45 *
46 * If the @c IMAGE_STATIC flag is set, then this is a
47 * statically allocated image.
48 */
49 union {
50 /** Read-only data */
51 const void *data;
52 /** Writable data */
53 void *rwdata;
54 /** Read-only text (guaranteed to be NUL terminated)
55 *
56 * Images are allocated with a trailing NUL byte, to
57 * allow string functions to be used more easily on
58 * image data.
59 */
60 const char *text;
61 };
62 /** Length of raw file image */
63 size_t len;
64
65 /** Image type, if known */
67
68 /** Replacement image
69 *
70 * An image wishing to replace itself with another image (in a
71 * style similar to a Unix exec() call) should return from its
72 * exec() method with the replacement image set to point to
73 * the new image.
74 *
75 * If an image unregisters itself as a result of being
76 * executed, it must make sure that its replacement image (if
77 * any) is registered, otherwise the replacement is likely to
78 * be freed before it can be executed.
79 */
81};
82
83/** Image is registered */
84#define IMAGE_REGISTERED 0x0001
85
86/** Image is trusted */
87#define IMAGE_TRUSTED 0x0002
88
89/** Image will be automatically unregistered after execution */
90#define IMAGE_AUTO_UNREGISTER 0x0004
91
92/** Image will be hidden from enumeration */
93#define IMAGE_HIDDEN 0x0008
94
95/** Image is statically allocated */
96#define IMAGE_STATIC 0x0010
97
98/** Image name is statically allocated */
99#define IMAGE_STATIC_NAME 0x0020
100
101/** An executable image type */
103 /** Name of this image type */
104 char *name;
105 /**
106 * Probe image
107 *
108 * @v image Image
109 * @ret rc Return status code
110 *
111 * Return success if the image is of this image type.
112 */
113 int ( * probe ) ( struct image *image );
114 /**
115 * Execute image
116 *
117 * @v image Image
118 * @ret rc Return status code
119 */
120 int ( * exec ) ( struct image *image );
121 /**
122 * Create pixel buffer from image
123 *
124 * @v image Image
125 * @v pixbuf Pixel buffer to fill in
126 * @ret rc Return status code
127 */
128 int ( * pixbuf ) ( struct image *image, struct pixel_buffer **pixbuf );
129 /**
130 * Extract ASN.1 object from image
131 *
132 * @v image Image
133 * @v offset Offset within image
134 * @v cursor ASN.1 cursor to fill in
135 * @ret next Offset to next image, or negative error
136 *
137 * The caller is responsible for eventually calling free() on
138 * the allocated ASN.1 cursor.
139 */
140 int ( * asn1 ) ( struct image *image, size_t offset,
141 struct asn1_cursor **cursor );
142 /**
143 * Extract archive image
144 *
145 * @v image Image
146 * @v extracted Extracted image
147 * @ret rc Return status code
148 */
149 int ( * extract ) ( struct image *image, struct image *extracted );
150};
151
152/**
153 * Multiboot image probe priority
154 *
155 * Multiboot images are also valid executables in another format
156 * (e.g. ELF), so we must perform the multiboot probe first.
157 */
158#define PROBE_MULTIBOOT 01
159
160/**
161 * Normal image probe priority
162 */
163#define PROBE_NORMAL 02
164
165/**
166 * PXE image probe priority
167 *
168 * PXE images have no signature checks, so will claim all image files.
169 * They must therefore be tried last in the probe order list.
170 */
171#define PROBE_PXE 03
172
173/** Executable image type table */
174#define IMAGE_TYPES __table ( struct image_type, "image_types" )
175
176/** An executable image type */
177#define __image_type( probe_order ) __table_entry ( IMAGE_TYPES, probe_order )
178
179/** An image tag */
180struct image_tag {
181 /** Name */
182 const char *name;
183 /** Image (weak reference, nullified when image is freed) */
184 struct image *image;
185};
186
187/** Image tag table */
188#define IMAGE_TAGS __table ( struct image_tag, "image_tags" )
189
190/** An image tag */
191#define __image_tag __table_entry ( IMAGE_TAGS, 01 )
192
193extern struct list_head images;
194extern struct image_tag current_image;
195extern struct image_tag selected_image;
196extern const char empty_image_data[];
197
198/** Iterate over all registered images */
199#define for_each_image( image ) \
200 list_for_each_entry ( (image), &images, list )
201
202/** Iterate over all registered images, safe against deletion */
203#define for_each_image_safe( image, tmp ) \
204 list_for_each_entry_safe ( (image), (tmp), &images, list )
205
206/**
207 * Retrieve first image
208 *
209 * @ret image Image, or NULL
210 */
211static inline struct image * first_image ( void ) {
212 return list_first_entry ( &images, struct image, list );
213}
214
215extern void free_image ( struct refcnt *refcnt );
216extern struct image * alloc_image ( struct uri *uri );
217extern int image_set_uri ( struct image *image, struct uri *uri );
218extern int image_set_name ( struct image *image, const char *name );
219extern char * image_strip_suffix ( struct image *image );
220extern int image_set_cmdline ( struct image *image, const char *cmdline );
221extern int image_set_len ( struct image *image, size_t len );
222extern int image_set_data ( struct image *image, const void *data,
223 size_t len );
224extern int register_image ( struct image *image );
225extern void unregister_image ( struct image *image );
226extern struct image * find_image ( const char *name );
227extern struct image * find_image_tag ( struct image_tag *tag );
228extern int image_exec ( struct image *image );
229extern int image_replace ( struct image *replacement );
230extern int image_select ( struct image *image );
231extern int image_set_trust ( int require_trusted, int permanent );
232extern struct image * image_memory ( const char *name, const void *data,
233 size_t len );
234extern const char * image_argument ( struct image *image, const char *key );
235extern int image_pixbuf ( struct image *image, struct pixel_buffer **pixbuf );
236extern int image_asn1 ( struct image *image, size_t offset,
237 struct asn1_cursor **cursor );
238extern int image_extract ( struct image *image, const char *name,
239 struct image **extracted );
240extern int image_extract_exec ( struct image *image );
241
242/**
243 * Increment reference count on an image
244 *
245 * @v image Image
246 * @ret image Image
247 */
248static inline struct image * image_get ( struct image *image ) {
249 ref_get ( &image->refcnt );
250 return image;
251}
252
253/**
254 * Decrement reference count on an image
255 *
256 * @v image Image
257 */
258static inline void image_put ( struct image *image ) {
259 ref_put ( &image->refcnt );
260}
261
262/**
263 * Clear image command line
264 *
265 * @v image Image
266 */
267static inline void image_clear_cmdline ( struct image *image ) {
269}
270
271/**
272 * Set image as trusted
273 *
274 * @v image Image
275 */
276static inline void image_trust ( struct image *image ) {
278}
279
280/**
281 * Set image as untrusted
282 *
283 * @v image Image
284 */
285static inline void image_untrust ( struct image *image ) {
287}
288
289/**
290 * Mark image as hidden
291 *
292 * @v image Image
293 */
294static inline void image_hide ( struct image *image ) {
296}
297
298/**
299 * Tag image
300 *
301 * @v image Image
302 * @v tag Image tag
303 * @ret prev Previous tagged image (if any)
304 */
305static inline struct image * image_tag ( struct image *image,
306 struct image_tag *tag ) {
307 struct image *prev = tag->image;
308
309 tag->image = image;
310 return prev;
311}
312
313#endif /* _IPXE_IMAGE_H */
#define NULL
NULL pointer (VOID *).
Definition Base.h:321
union @162305117151260234136356364136041353210355154177 key
const char * name
Definition ath9k_hw.c:1986
uint16_t offset
Offset to command line.
Definition bzimage.h:3
ring len
Length.
Definition dwmac.h:226
uint64_t tag
Identity tag.
Definition edd.h:1
const char * replacement
Definition editstring.h:54
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:921
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:951
const char empty_image_data[]
Empty image terminating NUL.
Definition image.c:78
struct list_head images
List of registered images.
Definition image.c:59
static struct image * image_get(struct image *image)
Increment reference count on an image.
Definition image.h:248
struct image_tag current_image
static struct image * first_image(void)
Retrieve first image.
Definition image.h:211
int image_extract_exec(struct image *image)
Extract and execute image.
Definition archive.c:108
struct image * alloc_image(struct uri *uri)
Allocate executable image.
Definition image.c:127
#define IMAGE_TRUSTED
Image is trusted.
Definition image.h:87
struct image * find_image(const char *name)
Find image by name.
Definition image.c:408
char * image_strip_suffix(struct image *image)
Strip dot suffix from image name, if present.
Definition image.c:210
void unregister_image(struct image *image)
Unregister executable image.
Definition image.c:390
static struct image * image_tag(struct image *image, struct image_tag *tag)
Tag image.
Definition image.h:305
void free_image(struct refcnt *refcnt)
Free executable image.
Definition image.c:89
int image_exec(struct image *image)
Execute image.
Definition image.c:446
static void image_trust(struct image *image)
Set image as trusted.
Definition image.h:276
int image_asn1(struct image *image, size_t offset, struct asn1_cursor **cursor)
Extract ASN.1 object from image.
Definition asn1.c:1098
int image_set_data(struct image *image, const void *data, size_t len)
Set image data.
Definition image.c:291
static void image_put(struct image *image)
Decrement reference count on an image.
Definition image.h:258
struct image * find_image_tag(struct image_tag *tag)
Find image by tag.
Definition image.c:425
int image_set_uri(struct image *image, struct uri *uri)
Set image URI.
Definition image.c:157
int register_image(struct image *image)
Register executable image.
Definition image.c:336
static void image_hide(struct image *image)
Mark image as hidden.
Definition image.h:294
int image_set_cmdline(struct image *image, const char *cmdline)
Set image command line.
Definition image.c:230
int image_replace(struct image *replacement)
Set replacement image.
Definition image.c:561
static void image_untrust(struct image *image)
Set image as untrusted.
Definition image.h:285
struct image_tag selected_image
int image_pixbuf(struct image *image, struct pixel_buffer **pixbuf)
Create pixel buffer from image.
Definition pixbuf.c:100
int image_set_name(struct image *image, const char *name)
Set image name.
Definition image.c:185
struct image * image_memory(const char *name, const void *data, size_t len)
Create registered image from block of memory.
Definition image.c:641
#define IMAGE_HIDDEN
Image will be hidden from enumeration.
Definition image.h:93
static void image_clear_cmdline(struct image *image)
Clear image command line.
Definition image.h:267
const char * image_argument(struct image *image, const char *key)
Find argument within image command line.
Definition image.c:685
int image_extract(struct image *image, const char *name, struct image **extracted)
Extract archive image.
Definition archive.c:45
int image_set_len(struct image *image, size_t len)
Set image length.
Definition image.c:249
int image_select(struct image *image)
Select image for execution.
Definition image.c:597
int image_set_trust(int require_trusted, int permanent)
Change image trust requirement.
Definition image.c:616
Linked lists.
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition list.h:334
uint32_t cmdline
Definition multiboot.h:4
Reference counting.
#define ref_get(refcnt)
Get additional reference to object.
Definition refcnt.h:93
#define ref_put(refcnt)
Drop reference to object.
Definition refcnt.h:107
An ASN.1 object cursor.
Definition asn1.h:21
An image tag.
Definition image.h:180
const char * name
Name.
Definition image.h:182
struct image * image
Image (weak reference, nullified when image is freed).
Definition image.h:184
An executable image type.
Definition image.h:102
int(* pixbuf)(struct image *image, struct pixel_buffer **pixbuf)
Create pixel buffer from image.
Definition image.h:128
int(* extract)(struct image *image, struct image *extracted)
Extract archive image.
Definition image.h:149
char * name
Name of this image type.
Definition image.h:104
int(* exec)(struct image *image)
Execute image.
Definition image.h:120
int(* probe)(struct image *image)
Probe image.
Definition image.h:113
int(* asn1)(struct image *image, size_t offset, struct asn1_cursor **cursor)
Extract ASN.1 object from image.
Definition image.h:140
An executable image.
Definition image.h:24
unsigned int flags
Flags.
Definition image.h:40
struct image * replacement
Replacement image.
Definition image.h:80
struct refcnt refcnt
Reference count.
Definition image.h:26
struct image_type * type
Image type, if known.
Definition image.h:66
const void * data
Read-only data.
Definition image.h:51
char * name
Name.
Definition image.h:38
size_t len
Length of raw file image.
Definition image.h:63
struct list_head list
List of registered images.
Definition image.h:29
struct uri * uri
URI of image.
Definition image.h:32
char * cmdline
Command line to pass to image.
Definition image.h:43
const char * text
Read-only text (guaranteed to be NUL terminated).
Definition image.h:60
void * rwdata
Writable data.
Definition image.h:53
A doubly-linked list entry (or list head).
Definition list.h:19
A pixel buffer.
Definition pixbuf.h:17
A reference counter.
Definition refcnt.h:27
A Uniform Resource Identifier.
Definition uri.h:65
Linker tables.