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)
This commit is contained in:
Breno Leitao 2018-06-07 13:57:34 +00:00
parent 16e05b3275
commit 7b2c7b92be
3 changed files with 12 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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