Annotation of qemu/roms/ipxe/src/image/embedded.c, revision 1.1

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: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.