aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorBreno Leitao <leitao@FreeBSD.org>2018-06-07 13:57:34 +0000
committerBreno Leitao <leitao@FreeBSD.org>2018-06-07 13:57:34 +0000
commit7b2c7b92befda002f51e7cc4d02bd0853be88d9e (patch)
tree952a809ef6ae3938b74c2d0dd02dc0683a3aad7e /sys/dev
parent16e05b3275550e5af61007a4b0205eaef4e6781e (diff)
downloadsrc-7b2c7b92befda002f51e7cc4d02bd0853be88d9e.tar.gz
src-7b2c7b92befda002f51e7cc4d02bd0853be88d9e.zip
md: use prestaged mfs_root
On PowerNV systems, the rootfs is passed through kexec, which loads the rootfs into memory and set two fdt entries to describe where the file is located in the memory; I need to pass this memory region to the md device as a mfs_root, but, current md driver does not support two things: * Just getting a pointer from an external (bootloader) memory. If I need to workaround it, I would need to declare a static array and memcopy from this external memory to this static variable. * The size of the image. The usage of mfs_root_end, which is not a pointer, seems to be not possible for this prestaged scenario. This patch simply adds a new way to load mfs_root from memory. Differential Revision: https://reviews.freebsd.org/D15625 Approved by: kib, jhibbits (mentor)
Notes
Notes: svn path=/head/; revision=334784
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/md/md.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c
index be661b2703c7..2209c6680be5 100644
--- a/sys/dev/md/md.c
+++ b/sys/dev/md/md.c
@@ -180,6 +180,10 @@ SYSCTL_INT(_vm, OID_AUTO, md_malloc_wait, CTLFLAG_RW, &md_malloc_wait, 0,
*/
u_char mfs_root[MD_ROOT_SIZE*1024] __attribute__ ((section ("oldmfs")));
const int mfs_root_size = sizeof(mfs_root);
+#elif defined(MD_ROOT_MEM)
+/* MD region already mapped in the memory */
+u_char *mfs_root;
+int mfs_root_size;
#else
extern volatile u_char __weak_symbol mfs_root;
extern volatile u_char __weak_symbol mfs_root_end;
@@ -2074,8 +2078,12 @@ g_md_init(struct g_class *mp __unused)
#ifdef MD_ROOT
if (mfs_root_size != 0) {
sx_xlock(&md_sx);
+#ifdef MD_ROOT_MEM
+ md_preloaded(mfs_root, mfs_root_size, NULL);
+#else
md_preloaded(__DEVOLATILE(u_char *, &mfs_root), mfs_root_size,
NULL);
+#endif
sx_xunlock(&md_sx);
}
#endif