diff options
author | kientzle <kientzle@FreeBSD.org> | 2013-02-18 23:13:13 +0000 |
---|---|---|
committer | kientzle <kientzle@FreeBSD.org> | 2013-02-18 23:13:13 +0000 |
commit | 35a51d801b40413e1efa0e0ea12eda62770aa69e (patch) | |
tree | db5e56f54163c4cc5eaf7bd54093072d23d4dc06 /sys/boot | |
parent | a04bf837da5bbd49529f6f49b699c365aa78cc49 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/boot/common/bootstrap.h | 2 | ||||
-rw-r--r-- | sys/boot/common/module.c | 37 |
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. |