76dc3b8f9249e6f39a3ac4986a081b2a599250ca
[people/lynusvaz/gpxe.git] / src / include / gpxe / image.h
1 #ifndef _GPXE_IMAGE_H
2 #define _GPXE_IMAGE_H
3
4 /**
5  * @file
6  *
7  * Executable/loadable images
8  *
9  */
10
11 #include <gpxe/tables.h>
12 #include <gpxe/list.h>
13 #include <gpxe/uaccess.h>
14 #include <gpxe/refcnt.h>
15
16 struct uri;
17 struct image_type;
18
19 /** An executable or loadable image */
20 struct image {
21         /** Reference count */
22         struct refcnt refcnt;
23
24         /** List of registered images */
25         struct list_head list;
26
27         /** URI of image */
28         struct uri *uri;
29         /** Name */
30         char name[16];
31         /** Flags */
32         unsigned int flags;
33
34         /** Command line to pass to image */
35         char *cmdline;
36         /** Raw file image */
37         userptr_t data;
38         /** Length of raw file image */
39         size_t len;
40
41         /** Image type, if known */
42         struct image_type *type;
43         /** Image type private data */
44         union {
45                 physaddr_t phys;
46                 userptr_t user;
47                 unsigned long ul;
48         } priv;
49 };
50
51 /** Image is loaded */
52 #define IMAGE_LOADED 0x0001
53
54 /** An executable or loadable image type */
55 struct image_type {
56         /** Name of this image type */
57         char *name;
58         /**
59          * Load image into memory
60          *
61          * @v image             Executable/loadable image
62          * @ret rc              Return status code
63          *
64          * Load the image into memory at the correct location as
65          * determined by the file format.
66          *
67          * If the file image is in the correct format, the method must
68          * update @c image->type to point to its own type (unless @c
69          * image->type is already set).  This allows the autoloading
70          * code to disambiguate between "this is not my image format"
71          * and "there is something wrong with this image".  In
72          * particular, setting @c image->type and then returning an
73          * error will cause image_autoload() to abort and return an
74          * error, rather than continuing to the next image type.
75          */
76         int ( * load ) ( struct image *image );
77         /**
78          * Execute loaded image
79          *
80          * @v image             Loaded image
81          * @ret rc              Return status code
82          */
83         int ( * exec ) ( struct image *image );
84 };
85
86 /**
87  * Multiboot image probe priority
88  *
89  * Multiboot images are also valid executables in another format
90  * (e.g. ELF), so we must perform the multiboot probe first.
91  */
92 #define PROBE_MULTIBOOT 01
93
94 /**
95  * Normal image probe priority
96  */
97 #define PROBE_NORMAL 02
98
99 /**
100  * PXE image probe priority
101  *
102  * PXE images have no signature checks, so will claim all image files.
103  * They must therefore be tried last in the probe order list.
104  */
105 #define PROBE_PXE 03
106
107 /** An executable or loadable image type */
108 #define __image_type( probe_order ) \
109          __table ( struct image_type, image_types, probe_order )
110
111 extern struct list_head images;
112
113 /** Iterate over all registered images */
114 #define for_each_image( image ) \
115         list_for_each_entry ( (image), &images, list )
116
117 extern struct image * alloc_image ( void );
118 extern int image_set_uri ( struct image *image, struct uri *uri );
119 extern int image_set_cmdline ( struct image *image, const char *cmdline );
120 extern int register_image ( struct image *image );
121 extern void unregister_image ( struct image *image );
122 extern void promote_image ( struct image *image );
123 struct image * find_image ( const char *name );
124 extern int image_load ( struct image *image );
125 extern int image_autoload ( struct image *image );
126 extern int image_exec ( struct image *image );
127 extern int register_and_autoload_image ( struct image *image );
128 extern int register_and_autoexec_image ( struct image *image );
129
130 /**
131  * Increment reference count on an image
132  *
133  * @v image             Image
134  * @ret image           Image
135  */
136 static inline struct image * image_get ( struct image *image ) {
137         ref_get ( &image->refcnt );
138         return image;
139 }
140
141 /**
142  * Decrement reference count on an image
143  *
144  * @v image             Image
145  */
146 static inline void image_put ( struct image *image ) {
147         ref_put ( &image->refcnt );
148 }
149
150 /**
151  * Set image name
152  *
153  * @v image             Image
154  * @v name              New image name
155  * @ret rc              Return status code
156  */
157 static inline int image_set_name ( struct image *image, const char *name ) {
158         strncpy ( image->name, name, ( sizeof ( image->name ) - 1 ) );
159         return 0;
160 }
161
162 #endif /* _GPXE_IMAGE_H */