DBGC ( image, "IMAGE %p unregistered\n", image );
}
+/**
+ * Find image by name
+ *
+ * @v name Image name
+ * @ret image Executable/loadable image, or NULL
+ */
+struct image * find_image ( const char *name ) {
+ struct image *image;
+
+ list_for_each_entry ( image, &images, list ) {
+ if ( strcmp ( image->name, name ) == 0 )
+ return image;
+ }
+
+ return NULL;
+}
+
/**
* Load executable/loadable image into memory
*
return rc;
}
+ image->flags |= IMAGE_LOADED;
return 0;
}
image, image->type->name, strerror ( rc ) );
return rc;
}
+ image->flags |= IMAGE_LOADED;
return 0;
}
int image_exec ( struct image *image ) {
int rc;
+ /* Image must be loaded first */
+ if ( ! ( image->flags & IMAGE_LOADED ) ) {
+ DBGC ( image, "IMAGE %p could not execute: not loaded\n",
+ image );
+ return -ENOTTY;
+ }
+
assert ( image->type != NULL );
+ /* Try executing the image */
if ( ( rc = image->type->exec ( image ) ) != 0 ) {
DBGC ( image, "IMAGE %p could not execute: %s\n",
image, strerror ( rc ) );
/** Image type, if known */
struct image_type *type;
+
+ /** Flags */
+ unsigned int flags;
};
+/** Image is loaded */
+#define IMAGE_LOADED 0x0001
+
/** An executable or loadable image type */
struct image_type {
/** Name of this image type */
extern int register_image ( struct image *image );
extern void unregister_image ( struct image *image );
+struct image * find_image ( const char *name );
extern int image_load ( struct image *image );
extern int image_autoload ( struct image *image );
extern int image_exec ( struct image *image );