summaryrefslogtreecommitdiffstats
path: root/sys/boot/common/module.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/boot/common/module.c')
-rw-r--r--sys/boot/common/module.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/sys/boot/common/module.c b/sys/boot/common/module.c
index 96c0a58..3b74ab7 100644
--- a/sys/boot/common/module.c
+++ b/sys/boot/common/module.c
@@ -351,6 +351,7 @@ file_load_dependencies(struct preloaded_file *base_file)
}
return (error);
}
+
/*
* We've been asked to load (name) as (type), so just suck it in,
* no arguments or anything.
@@ -421,6 +422,42 @@ file_loadraw(char *type, char *name)
}
/*
+ * Load a chunk of data as if it had been read from a file.
+ */
+struct preloaded_file *
+mem_load_raw(char *type, char *name, const void *p, size_t len)
+{
+ struct preloaded_file *fp;
+
+ /* We can't load first */
+ if ((file_findfile(NULL, NULL)) == NULL) {
+ command_errmsg = "can't load file before kernel";
+ return(NULL);
+ }
+
+ if (archsw.arch_loadaddr != NULL)
+ loadaddr = archsw.arch_loadaddr(LOAD_RAW, name, loadaddr);
+ archsw.arch_copyin(p, loadaddr, len);
+
+ /* Looks OK so far; create & populate control structure */
+ fp = file_alloc();
+ fp->f_name = strdup(name);
+ fp->f_type = strdup(type);
+ fp->f_args = NULL;
+ fp->f_metadata = NULL;
+ fp->f_loader = -1;
+ fp->f_addr = loadaddr;
+ fp->f_size = len;
+
+ /* recognise space consumption */
+ loadaddr += len;
+
+ /* Add to the list of loaded files */
+ file_insert_tail(fp);
+ return fp;
+}
+
+/*
* Load the module (name), pass it (argc),(argv), add container file
* to the list of loaded files.
* If module is already loaded just assign new argc/argv.
OpenPOWER on IntegriCloud