Added print_images() and autoload().
[people/pcmattman/gpxe.git] / src / core / image.c
1 #include "dev.h"
2 #include "buffer.h"
3 #include "load_buffer.h"
4 #include "image.h"
5
6 static struct image images[0] __image_start;
7 static struct image images_end[0] __image_end;
8
9 /*
10  * Print all images
11  *
12  */
13 void print_images ( void ) {
14         struct image *image;
15
16         for ( image = images ; image < images_end ; image++ ) {
17                 printf ( "%s ", image->name );
18         }
19 }
20
21 /*
22  * Identify the image format
23  *
24  */
25 static struct image * identify_image ( physaddr_t start, physaddr_t len,
26                                        void **context ) {
27         struct image *image;
28         
29         for ( image = images ; image < images_end ; image++ ) {
30                 if ( image->probe ( start, len, context ) )
31                         return image;
32         }
33         
34         return NULL;
35 }
36
37 /*
38  * Load an image into memory at a location determined by the image
39  * format
40  *
41  */
42 int autoload ( struct dev *dev, struct image **image, void **context ) {
43         struct buffer buffer;
44         int rc = 0;
45
46         /* Prepare the load buffer */
47         if ( ! init_load_buffer ( &buffer ) ) {
48                 DBG ( "IMAGE could not initialise load buffer\n" );
49                 goto out;
50         }
51
52         /* Load the image into the load buffer */
53         if ( ! load ( dev, &buffer ) ) {
54                 DBG ( "IMAGE could not load image\n" );
55                 goto out_free;
56         }
57
58         /* Shrink the load buffer */
59         trim_load_buffer ( &buffer );
60
61         /* Identify the image type */
62         *image = identify_image ( buffer.start, buffer.fill, context );
63         if ( ! *image ) {
64                 DBG ( "IMAGE could not identify image type\n" );
65                 goto out_free;
66         }
67
68         /* Move the image into the target location */
69         if ( ! (*image)->load ( buffer.start, buffer.fill, *context ) ) {
70                 DBG ( "IMAGE could not move to target location\n" );
71                 goto out_free;
72         }
73
74         /* Return success */
75         rc = 1;
76
77  out_free:
78         /* Free the load buffer */
79         done_load_buffer ( &buffer );
80  out:
81         return rc;
82 }