|
|
1.1 ! root 1: /** @file ! 2: * ! 3: * Embedded image support ! 4: * ! 5: * Embedded images are images built into the iPXE binary and do not require ! 6: * fetching over the network. ! 7: */ ! 8: ! 9: FILE_LICENCE ( GPL2_OR_LATER ); ! 10: ! 11: #include <string.h> ! 12: #include <ipxe/image.h> ! 13: #include <ipxe/uaccess.h> ! 14: #include <ipxe/init.h> ! 15: ! 16: /* Raw image data for all embedded images */ ! 17: #undef EMBED ! 18: #define EMBED( _index, _path, _name ) \ ! 19: extern char embedded_image_ ## _index ## _data[]; \ ! 20: extern char embedded_image_ ## _index ## _len[]; \ ! 21: __asm__ ( ".section \".rodata\", \"a\", @progbits\n\t" \ ! 22: "\nembedded_image_" #_index "_data:\n\t" \ ! 23: ".incbin \"" _path "\"\n\t" \ ! 24: "\nembedded_image_" #_index "_end:\n\t" \ ! 25: ".equ embedded_image_" #_index "_len, " \ ! 26: "( embedded_image_" #_index "_end - " \ ! 27: " embedded_image_" #_index "_data )\n\t" \ ! 28: ".previous\n\t" ); ! 29: EMBED_ALL ! 30: ! 31: /* Image structures for all embedded images */ ! 32: #undef EMBED ! 33: #define EMBED( _index, _path, _name ) { \ ! 34: .refcnt = REF_INIT ( ref_no_free ), \ ! 35: .name = _name, \ ! 36: .data = ( userptr_t ) ( embedded_image_ ## _index ## _data ), \ ! 37: .len = ( size_t ) embedded_image_ ## _index ## _len, \ ! 38: }, ! 39: static struct image embedded_images[] = { ! 40: EMBED_ALL ! 41: }; ! 42: ! 43: /** ! 44: * Register all embedded images ! 45: */ ! 46: static void embedded_init ( void ) { ! 47: int i; ! 48: struct image *image; ! 49: void *data; ! 50: int rc; ! 51: ! 52: /* Skip if we have no embedded images */ ! 53: if ( ! sizeof ( embedded_images ) ) ! 54: return; ! 55: ! 56: /* Fix up data pointers and register images */ ! 57: for ( i = 0 ; i < ( int ) ( sizeof ( embedded_images ) / ! 58: sizeof ( embedded_images[0] ) ) ; i++ ) { ! 59: image = &embedded_images[i]; ! 60: ! 61: /* virt_to_user() cannot be used in a static ! 62: * initialiser, so we cast the pointer to a userptr_t ! 63: * in the initialiser and fix it up here. (This will ! 64: * actually be a no-op on most platforms.) ! 65: */ ! 66: data = ( ( void * ) image->data ); ! 67: image->data = virt_to_user ( data ); ! 68: ! 69: DBG ( "Embedded image \"%s\": %zd bytes at %p\n", ! 70: image->name, image->len, data ); ! 71: ! 72: if ( ( rc = register_image ( image ) ) != 0 ) { ! 73: DBG ( "Could not register embedded image \"%s\": " ! 74: "%s\n", image->name, strerror ( rc ) ); ! 75: return; ! 76: } ! 77: } ! 78: ! 79: /* Select the first image */ ! 80: image = &embedded_images[0]; ! 81: if ( ( rc = image_select ( image ) ) != 0 ) { ! 82: DBG ( "Could not select embedded image \"%s\": %s\n", ! 83: image->name, strerror ( rc ) ); ! 84: return; ! 85: } ! 86: } ! 87: ! 88: /** Embedded image initialisation function */ ! 89: struct init_fn embedded_init_fn __init_fn ( INIT_LATE ) = { ! 90: .initialise = embedded_init, ! 91: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.