c91468c67b00ed0f75f099777a56dd065a8bdfe7
[people/xl0/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
15 struct image_type;
16
17 /** Maximum length of a command line */
18 #define CMDLINE_MAX 128
19
20 /** An executable or loadable image */
21 struct image {
22         /** Name */
23         char name[16];
24         /** List of registered images */
25         struct list_head list;
26
27         /** Command line to pass to image */
28         char cmdline[CMDLINE_MAX];
29
30         /** Raw file image */
31         userptr_t data;
32         /** Length of raw file image */
33         size_t len;
34
35         /** Entry point */
36         physaddr_t entry;
37
38         /** Image type, if known */
39         struct image_type *type;
40
41         /** Flags */
42         unsigned int flags;
43 };
44
45 /** Image is loaded */
46 #define IMAGE_LOADED 0x0001
47
48 /** An executable or loadable image type */
49 struct image_type {
50         /** Name of this image type */
51         char *name;
52         /**
53          * Load image into memory
54          *
55          * @v image             Executable/loadable image
56          * @ret rc              Return status code
57          *
58          * Load the image into memory.  The file image may be
59          * discarded after this call; the method must preserve any
60          * information it may require later (e.g. the execution
61          * address) within the @c image structure.
62          *
63          * If the file image is in the correct format, the method must
64          * update @c image->type to point to its own type (unless @c
65          * image->type is already set).  This allows the autoloading
66          * code to disambiguate between "this is not my image format"
67          * and "there is something wrong with this image".  In
68          * particular, setting @c image->type and then returning an
69          * error will cause image_autoload() to abort and return an
70          * error, rather than continuing to the next image type.
71          */
72         int ( * load ) ( struct image *image );
73         /**
74          * Execute loaded image
75          *
76          * @v image             Loaded image
77          * @ret rc              Return status code
78          */
79         int ( * exec ) ( struct image *image );
80 };
81
82 /**
83  * Multiboot image probe priority
84  *
85  * Multiboot images are also valid executables in another format
86  * (e.g. ELF), so we must perform the multiboot probe first.
87  */
88 #define PROBE_MULTIBOOT 01
89
90 /**
91  * Normal image probe priority
92  */
93 #define PROBE_NORMAL 02
94
95 /**
96  * PXE image probe priority
97  *
98  * PXE images have no signature checks, so will claim all image files.
99  * They must therefore be tried last in the probe order list.
100  */
101 #define PROBE_PXE 03
102
103 /** An executable or loadable image type */
104 #define __image_type( probe_order ) \
105          __table ( struct image_type, image_types, probe_order )
106
107 extern struct list_head images;
108
109 /** Iterate over all registered images */
110 #define for_each_image( image ) \
111         list_for_each_entry ( (image), &images, list )
112
113 extern int register_image ( struct image *image );
114 extern void unregister_image ( struct image *image );
115 struct image * find_image ( const char *name );
116 extern void free_image ( struct image *image );
117 extern int image_load ( struct image *image );
118 extern int image_autoload ( struct image *image );
119 extern int image_exec ( struct image *image );
120
121 #endif /* _GPXE_IMAGE_H */