c60373c96b1ed62f9ae0b544f37f1a0cdd407d6f
[people/xl0/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 #if 0
22
23 /*
24  * Identify the image format
25  *
26  */
27 static struct image * identify_image ( physaddr_t start, physaddr_t len,
28                                        void **context ) {
29         struct image *image;
30         
31         for ( image = images ; image < images_end ; image++ ) {
32                 if ( image->probe ( start, len, context ) )
33                         return image;
34         }
35         
36         return NULL;
37 }
38
39 /*
40  * Load an image into memory at a location determined by the image
41  * format
42  *
43  */
44 int autoload ( struct dev *dev, struct image **image, void **context ) {
45         struct buffer buffer;
46         int rc = 0;
47
48         /* Prepare the load buffer */
49         if ( ! init_load_buffer ( &buffer ) ) {
50                 DBG ( "IMAGE could not initialise load buffer\n" );
51                 goto out;
52         }
53
54         /* Load the image into the load buffer */
55         if ( ! load ( dev, &buffer ) ) {
56                 DBG ( "IMAGE could not load image\n" );
57                 goto out_free;
58         }
59
60         /* Shrink the load buffer */
61         trim_load_buffer ( &buffer );
62
63         /* Identify the image type */
64         *image = identify_image ( buffer.start, buffer.fill, context );
65         if ( ! *image ) {
66                 DBG ( "IMAGE could not identify image type\n" );
67                 goto out_free;
68         }
69
70         /* Move the image into the target location */
71         if ( ! (*image)->load ( buffer.start, buffer.fill, *context ) ) {
72                 DBG ( "IMAGE could not move to target location\n" );
73                 goto out_free;
74         }
75
76         /* Return success */
77         rc = 1;
78
79  out_free:
80         /* Free the load buffer */
81         done_load_buffer ( &buffer );
82  out:
83         return rc;
84 }
85
86 #endif