summaryrefslogtreecommitdiffstats
path: root/sys/boot/common
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2013-02-18 23:13:13 +0000
committerkientzle <kientzle@FreeBSD.org>2013-02-18 23:13:13 +0000
commit35a51d801b40413e1efa0e0ea12eda62770aa69e (patch)
treedb5e56f54163c4cc5eaf7bd54093072d23d4dc06 /sys/boot/common
parenta04bf837da5bbd49529f6f49b699c365aa78cc49 (diff)
downloadFreeBSD-src-35a51d801b40413e1efa0e0ea12eda62770aa69e.zip
FreeBSD-src-35a51d801b40413e1efa0e0ea12eda62770aa69e.tar.gz
Add mem_load_raw() for loading data from another location in memory.
This will be used by some upcoming changes to loader(8) FDT handling to allow it to use an FDT provided by an earlier boot stage the same as an FDT loaded from disk.
Diffstat (limited to 'sys/boot/common')
-rw-r--r--sys/boot/common/bootstrap.h2
-rw-r--r--sys/boot/common/module.c37
2 files changed, 39 insertions, 0 deletions
diff --git a/sys/boot/common/bootstrap.h b/sys/boot/common/bootstrap.h
index 516b8a5..78b3895 100644
--- a/sys/boot/common/bootstrap.h
+++ b/sys/boot/common/bootstrap.h
@@ -237,6 +237,8 @@ void file_discard(struct preloaded_file *fp);
void file_addmetadata(struct preloaded_file *fp, int type, size_t size, void *p);
int file_addmodule(struct preloaded_file *fp, char *modname, int version,
struct kernel_module **newmp);
+/* Load from a buffer in memory. */
+struct preloaded_file *mem_load_raw(char *type, char *name, const void *p, size_t len);
/* MI module loaders */
#ifdef __elfN
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