diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 06b05437f4b..2f358d1a0f8 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -1111,6 +1111,9 @@ options MD_ROOT # Write-protect the md root device so that it may not be mounted writeable. options MD_ROOT_READONLY +# Allow to read MD image from external memory regions +options MD_ROOT_MEM + # Disk quotas are supported when this option is enabled. options QUOTA #enable disk quotas diff --git a/sys/conf/options b/sys/conf/options index dcfdf495e6c..01639fa72e5 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -168,6 +168,7 @@ MD_ROOT opt_md.h MD_ROOT_FSTYPE opt_md.h MD_ROOT_READONLY opt_md.h MD_ROOT_SIZE opt_md.h +MD_ROOT_MEM opt_md.h MFI_DEBUG opt_mfi.h MFI_DECODE_LOG opt_mfi.h MPROF_BUFFERS opt_mprof.h diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index be661b2703c..2209c6680be 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