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