From gehicks@gehicks.dyndns.org  Sat Jun 29 16:24:03 2002
Return-Path: <gehicks@gehicks.dyndns.org>
Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 7D90A37B400
	for <FreeBSD-gnats-submit@freebsd.org>; Sat, 29 Jun 2002 16:24:03 -0700 (PDT)
Received: from gehicks.dyndns.org (adsl-20-176-172.asm.bellsouth.net [66.20.176.172])
	by mx1.FreeBSD.org (Postfix) with ESMTP id DD9A643E06
	for <FreeBSD-gnats-submit@freebsd.org>; Sat, 29 Jun 2002 16:24:02 -0700 (PDT)
	(envelope-from gehicks@gehicks.dyndns.org)
Received: from gehicks.dyndns.org (gehicks@localhost [127.0.0.1])
	by gehicks.dyndns.org (8.12.5/8.12.5) with ESMTP id g5TNVRIi000861
	for <FreeBSD-gnats-submit@freebsd.org>; Sat, 29 Jun 2002 23:31:28 GMT
	(envelope-from gehicks@gehicks.dyndns.org)
Received: (from gehicks@localhost)
	by gehicks.dyndns.org (8.12.5/8.12.5/Submit) id g5TNVRRu000860;
	Sat, 29 Jun 2002 23:31:27 GMT
Message-Id: <200206292331.g5TNVRRu000860@gehicks.dyndns.org>
Date: Sat, 29 Jun 2002 23:31:27 GMT
From: W Gerald Hicks <gehicks@gehicks.dyndns.org>
Reply-To: W Gerald Hicks <gehicks@gehicks.dyndns.org>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [patch] use ld(1) to build kernel with linked-in md(4) filesys
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         40021
>Category:       kern
>Synopsis:       [build] [patch] use ld(1) to build kernel with linked-in md(4) filesys
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          suspended
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat Jun 29 16:30:01 PDT 2002
>Closed-Date:    
>Last-Modified:  Wed Apr 30 07:41:57 UTC 2008
>Originator:     W Gerald Hicks
>Release:        FreeBSD 5.0-CURRENT i386
>Organization:
Glenayre Electronics
>Environment:
	FreeBSD 5.0-CURRENT i386

>Description:
	[this is a prototype, needs review and feedback before committing]

	FreeBSD formerly used a scheme of preallocating a fixed size
	region of memory for an embedded MFS filesystem image which
	was subsequently patched after kernel build with a utility
	program (write_mfs_in_kernel).

	This scheme is no longer used by sysinstall since md(4) and
	/boot/loader provides the ability to load an md(4) filesystem
	like a module.

	Some applications such as picoBSD and etherboot still need a
	linked-in filesystem.  This patch allows one to specify an object
	file created with mdconfig(8) and objcopy(1) to be linked into the
	kernel image.  This has the added benefit of allowing a flexible
	size for the filesystem.

	The patch deprecates 'options MD_ROOT_SIZE' replacing it with
	'makeoptions MD_ROOT_IMAGE="mdimage.o"' where mdimage.o
	is a file created something like this:

dd if=/dev/zero of=mdimage -bs=1024 count=4096
mdconfig -a -t vnode -f mdimage -s 4096k -u 4
disklabel -r -w md4 auto
newfs /dev/md4c
mount /dev/md4c /mnt
 .
 . put stuff on it
 .
umount /mnt
 mdconfig -d -u 4
objcopy -I binary -O elf32-i386 -B i386 \
	--redefine-symbol _binary_mdimage_start=md_root_image \
	--redefine-symbol _binary_mdimage_size=md_root_image_size \
	mdimage /tmp/mdimage.o

Add the image to the kernel config:
makeoption	MD_ROOT_IMAGE="/tmp/mdimage.o"  # needs option MD_ROOT

Configure and build a kernel as usual; the contents of mdimage.o
will provide the linked-in md(4) root file system.

>How-To-Repeat:
	Apply the patch :-)
>Fix:

Index: src/sys/conf/NOTES
===================================================================
RCS file: /home/ncvs/src/sys/conf/NOTES,v
retrieving revision 1.1041
diff -u -r1.1041 NOTES
--- src/sys/conf/NOTES	26 Jun 2002 03:34:43 -0000	1.1041
+++ src/sys/conf/NOTES	26 Jun 2002 21:23:04 -0000
@@ -633,13 +633,12 @@
 # directories at the expense of some memory.
 options 	UFS_DIRHASH
 
-# Make space in the kernel for a root filesystem on a md device.
-# Define to the number of kilobytes to reserve for the filesystem.
-options 	MD_ROOT_SIZE=10
-
 # Make the md device a potential root device, either with preloaded
 # images of type mfs_root or md_root.
 options 	MD_ROOT
+
+# Specify an object file to link in as a MD filesystem image (needs MD_ROOT)
+makeoptions	MD_ROOT_IMAGE="/tmp/mdimage.o"
 
 # Allow this many swap-devices.
 #
Index: src/sys/conf/kern.pre.mk
===================================================================
RCS file: /home/ncvs/src/sys/conf/kern.pre.mk,v
retrieving revision 1.13
diff -u -r1.13 kern.pre.mk
--- src/sys/conf/kern.pre.mk	16 Jun 2002 10:42:05 -0000	1.13
+++ src/sys/conf/kern.pre.mk	26 Jun 2002 21:22:16 -0000
@@ -88,6 +88,10 @@
 	${SIZE} ${FMT} ${.TARGET} ; chmod 755 ${.TARGET}
 SYSTEM_DEP+= $S/conf/ldscript.$M
 
+.if defined(MD_ROOT_IMAGE)
+SYSTEM_OBJS+= ${MD_ROOT_IMAGE}
+.endif
+
 # MKMODULESENV is set here so that port makefiles can augment
 # them.
 
Index: src/sys/conf/options
===================================================================
RCS file: /home/ncvs/src/sys/conf/options,v
retrieving revision 1.327
diff -u -r1.327 options
--- src/sys/conf/options	26 Jun 2002 03:34:43 -0000	1.327
+++ src/sys/conf/options	26 Jun 2002 21:15:37 -0000
@@ -81,7 +81,6 @@
 KTRACE_REQUEST_POOL	opt_ktrace.h
 LIBICONV
 MD_ROOT		opt_md.h
-MD_ROOT_SIZE	opt_md.h
 NTIMECOUNTER	opt_ntp.h
 NSWAPDEV	opt_swap.h
 PPS_SYNC	opt_ntp.h
Index: src/sys/dev/md/md.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/md/md.c,v
retrieving revision 1.66
diff -u -r1.66 md.c
--- src/sys/dev/md/md.c	24 Jun 2002 12:07:02 -0000	1.66
+++ src/sys/dev/md/md.c	26 Jun 2002 21:15:37 -0000
@@ -62,6 +62,7 @@
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/bio.h>
+#include <sys/cdefs.h>
 #include <sys/conf.h>
 #include <sys/devicestat.h>
 #include <sys/disk.h>
@@ -101,10 +102,10 @@
 static int md_debug;
 SYSCTL_INT(_debug, OID_AUTO, mddebug, CTLFLAG_RW, &md_debug, 0, "");
 
-#if defined(MD_ROOT) && defined(MD_ROOT_SIZE)
-/* Image gets put here: */
-static u_char mfs_root[MD_ROOT_SIZE*1024] = "MFS Filesystem goes here";
-static u_char end_mfs_root[] __unused = "MFS Filesystem had better STOP here";
+#if defined(MD_ROOT)
+extern u_char  md_root_image[];    __weak_reference(0, md_root_image);
+extern int     md_root_image_size; __weak_reference(0, md_root_image_size);
+size_t md_root_size = (size_t) &md_root_image_size;  /* size == sym_addr */
 #endif
 
 static int	mdrootready;
@@ -1084,8 +1085,9 @@
 	u_char *ptr, *name, *type;
 	unsigned len;
 
-#ifdef MD_ROOT_SIZE
-	md_preloaded(mfs_root, MD_ROOT_SIZE*1024);
+#ifdef MD_ROOT
+	if(md_root_image != NULL && md_root_size != 0)
+		md_preloaded(md_root_image, md_root_size);
 #endif
 	mod = NULL;
 	while ((mod = preload_search_next_name(mod)) != NULL) {
>Release-Note:
>Audit-Trail:

From: Ian Dowse <iedowse@maths.tcd.ie>
To: W Gerald Hicks <gehicks@gehicks.dyndns.org>
Cc: FreeBSD-gnats-submit@FreeBSD.org
Subject: Re: kern/40021: [patch] use ld(1) to build kernel with linked-in md(4) filesys 
Date: Sun, 30 Jun 2002 01:43:45 +0100

 In message <200206292331.g5TNVRRu000860@gehicks.dyndns.org>, W Gerald Hicks wri
 tes:
 >	Some applications such as picoBSD and etherboot still need a
 >	linked-in filesystem.  This patch allows one to specify an object
 >	file created with mdconfig(8) and objcopy(1) to be linked into the
 >	kernel image.  This has the added benefit of allowing a flexible
 >	size for the filesystem.
 
 Looks useful.
 
 >	The patch deprecates 'options MD_ROOT_SIZE' replacing it with
 >	'makeoptions MD_ROOT_IMAGE="mdimage.o"' where mdimage.o
 >	is a file created something like this:
 
 The patch seems to remove rather than deprecate the MD_ROOT_SIZE
 code. Is there a good reason not just leave it there and add the
 new option? The new approach requires that you have the image
 available at the time that the kernel is compiled, so for some
 applications it is less flexible (for example, we use built-in root
 filesystems in a lot of diskless terminals, and it is useful that
 updating the root filesystem does not require re-linking the kernel).
 
 It would also be preferable if the makefile could do the objcopy
 step, so you can specify the actual image file in MD_ROOT_IMAGE.
 
 Ian

From: Giorgos Keramidas <keramida@FreeBSD.org>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/40021: [patch] use ld(1) to build kernel with linked-in md(4) filesys
Date: Mon, 1 Jul 2002 18:28:39 +0300

 Adding to audit trail the text of kern/40026:
 :
 : Date: Sun, 30 Jun 2002 02:48:12 +0000
 : From: W Gerald Hicks <gehicks@gehicks.dyndns.org>
 : Sender: gehicks@gehicks.dyndns.org
 : To: FreeBSD-gnats-submit@FreeBSD.org
 : Cc: Ian Dowse <iedowse@maths.tcd.ie>, freebsd-small@FreeBSD.org
 : Subject: pending/40026: [patch] use ld(1) to build kernel with linked-in md(4) filesys
 :
 : > The patch seems to remove rather than deprecate the MD_ROOT_SIZE code.
 :
 : Oops, wrong choice of words.  Yes, it's intended to replace the
 : MD_ROOT_SIZE feature and any need for a write_mfs_in_kernel program.
 :
 : I wasn't clear about what this patch is for right now.  I don't want
 : to ask to have it committed right away.  It is one of a few
 : prerequisite patches I am preparing to do some work on PicoBSD and
 : needed to post this so others will be able to get the subsequent
 : patches to build.
 :
 : > Is there a good reason not just leave it there and add the new option.
 :
 : I suppose I could have set a -DMD_ROOT_IMAGE when
 :	makeoption MD_ROOT_IMAGE=
 : is specified but otherwise it seems hard to relate 'options' with
 : 'makeoptions'.
 :
 : > The new approach requires that you have the image available at the
 : > time that the kernel is compiled, so for some applications it is
 : > less flexible (...)
 :
 : Well, not exactly.  This patch is only the first piece of a scheme
 : :-)
 :
 : kern/40017 is related to this effort.  It allows us to use modified
 : kernel build metadata (sys/conf) for specialized applications.
 : Using this facility I am going to provide further patches which
 : allow incremental linking.
 :
 : These changes are pretty far-reaching and I was afraid of taking
 : them straight to src/sys/conf directly. kern/40017 allows us to use
 : something like /usr/local/src/picobsd/conf to implement extra build
 : steps from private specialized versions of the kern.pre.mk and
 : kern.post.mk files.
 :
 : The picobsd/conf example will implement another couple of
 : makeoptions:
 :
 : makeoptions RLINK_KERNEL="/mykernels/kernel-foo-v1.rel"
 : makeoptions RLINK_KERNEL_OBJS="/tmp/foo.o"
 :
 : There are two new kernel build targets used for these options:
 :
 : make prelim   # build a partially linked-kernel
 : make final    # produce a bootable kernel
 :
 : This has all been tested successfully in a src/conf patch.
 : I hesitated submitting them there in favor of an "outboard" approach
 : using kern/40017
 :
 : I'd really rather avoid bringing the objcopy step into the kernel
 : build process.
 :
 : Being able to build a kernel with a two-step process allows us to
 : trivially wrap everything into a little shell script or other
 : makefile fragment.  The 'make final' step can be run as often as one
 : requires while changing filesystem images.
 
State-Changed-From-To: open->suspended 
State-Changed-By: linimon 
State-Changed-When: Sun Oct 23 21:14:20 GMT 2005 
State-Changed-Why:  
Mark as 'suspended' since no one seems to have done any work on this 
new-feature idea in some time. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=40021 
>Unformatted:
