svn commit: r246953 - head/sys/boot/common

Tim Kientzle kientzle at FreeBSD.org
Mon Feb 18 23:13:14 UTC 2013


Author: kientzle
Date: Mon Feb 18 23:13:13 2013
New Revision: 246953
URL: http://svnweb.freebsd.org/changeset/base/246953

Log:
  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.

Modified:
  head/sys/boot/common/bootstrap.h
  head/sys/boot/common/module.c

Modified: head/sys/boot/common/bootstrap.h
==============================================================================
--- head/sys/boot/common/bootstrap.h	Mon Feb 18 22:47:59 2013	(r246952)
+++ head/sys/boot/common/bootstrap.h	Mon Feb 18 23:13:13 2013	(r246953)
@@ -237,6 +237,8 @@ void file_discard(struct preloaded_file 
 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

Modified: head/sys/boot/common/module.c
==============================================================================
--- head/sys/boot/common/module.c	Mon Feb 18 22:47:59 2013	(r246952)
+++ head/sys/boot/common/module.c	Mon Feb 18 23:13:13 2013	(r246953)
@@ -351,6 +351,7 @@ file_load_dependencies(struct preloaded_
     }
     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.


More information about the svn-src-all mailing list