xref: /freebsd/tools/tools/nanobsd/embedded/common (revision 0957b409)
1# $FreeBSD$
2
3#-
4# Copyright (c) 2015 M. Warner Losh.
5# Copyright (c) 2010-2011 iXsystems, Inc.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19# ARE DISCLAIMED.  IN NO EVENT SHALL iXsystems, Inc OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28#
29# This file is heavily derived from both Sam Leffler's Avilia config,
30# as well as the BSDRP project's config file.  Neither of these have
31# an explicit copyright/license statement, but are implicitly BSDL. This
32# example has been taken from the FreeNAS project (an early version) and
33# simplified to meet the needs of the example.
34#
35
36# NB: You want the other file as the command line arg :)
37
38# Missing in base:
39# o mkimg setting active partition
40# o mkimg starting at arbitrary offset (needed for A10, et al)
41# o mtools still needed because we have no makefs -t msdos
42# o nanobsd doesn't record changes to WORLDTEMP in customization
43#   scripts yet, so we have kludge to pick up all files
44# o easy way for pkg to grab files from other repos and put that
45#   data on the image
46# o Need to have some way to create / resize the s4 slice to do ping
47#   pong bouncing between s3 and s4 for an arbitrary image. we can resize
48#   one slice, not two
49# o hints in the uboot ports for how to create the image
50#
51# Missing here
52# o documentation for how to run the qemu images
53# o msdos mtools fallback
54# o special boot for !x86 !arm platforms
55# o qemu image for arm
56# o qemu image for aarch64
57# o qemu image for armv6/armv7
58# o easy support for different image / vm formats
59# o need to promote much of this to nanobsd.sh and friends
60# o uses old kludge to build image w/o ownership being right
61#   for many files. Should move to mtree-dedup.awk.
62# o support for EFI images
63# o support for GPT partitioning
64#
65# Long Term
66# o common tooling for creating images for odd-ball platforms
67# o support for boot loaders other than uboot in the image
68#   or via special instructions
69# o no pony support; sadly, you cannot have a pony
70#
71
72if [ -z $NANO_NAME ]; then
73	echo "NANO_NAME not defined. Use foo.cfg instead."
74fi
75
76NANO_SLICE_FAT_SIZE=32m
77NANO_SLICE_CFG_SIZE=32m
78
79NANO_BOOT2CFG="-h -S115200"
80
81NANO_RAM_ETCSIZE=8192
82NANO_RAM_TMPVARSIZE=8192
83NANO_IMAGES=2
84
85NANO_PMAKE="make -j $(sysctl -n hw.ncpu)"
86
87NANO_CFG_BASE=$(pwd)
88NANO_CFG_BASE=$(realpath ${NANO_CFG_BASE}/..)
89NANO_SRC=$(realpath ${NANO_CFG_BASE}/../../..)
90#### XXX share obj
91if [ -z ${NANO_CPUTYPE} ]; then
92	NANO_OBJ=${NANO_SRC}/../embedded/obj
93else
94	# Alas, I can't set OBJTREE to ${MACHINE}.${MACHINE_ARCH}.${CPUTYPE}
95	# so this will have to do until I can.
96	NANO_OBJ=${NANO_SRC}/../embedded/obj.${NANO_CPUTYPE}
97fi
98NANO_LOG=${NANO_OBJ}/../${NANO_NAME}
99NANO_DISKIMGDIR=${NANO_OBJ}/../images
100NANO_WORLDDIR=${NANO_LOG}/_.w
101NANO_INIT_IMG2=0
102NANO_NOPRIV_BUILD=t
103unset MAKEOBJDIRPREFIX
104
105mkdir -p ${NANO_OBJ}
106NANO_OBJ=$(realpath ${NANO_OBJ})
107mkdir -p ${NANO_LOG}
108NANO_LOG=$(realpath ${NANO_LOG})
109mkdir -p ${NANO_WORLDDIR}
110NANO_WORLDDIR=$(realpath ${NANO_WORLDDIR})
111mkdir -p ${NANO_DISKIMGDIR}
112NANO_DISKIMGDIR=$(realpath ${NANO_DISKIMGDIR})
113
114NANO_FAT_DIR=${NANO_LOG}/_.fat
115
116customize_cmd cust_allow_ssh_root
117
118add_etc_make_conf ( ) (
119	touch ${NANO_WORLDDIR}/etc/make.conf
120)
121customize_cmd add_etc_make_conf
122
123cust_install_machine_files ( ) (
124	echo "cd ${NANO_CFG_BASE}/Files"
125	cd ${NANO_CFG_BASE}/Files
126	find . -print | grep -Ev '/(CVS|\.svn|\.hg|\.git)' | cpio -dumpv ${NANO_WORLDDIR}
127)
128customize_cmd cust_install_files
129customize_cmd cust_install_machine_files
130
131# NB: leave c++ enabled so devd can be built
132CONF_BUILD="
133LOCAL_XTOOL_DIRS=usr.bin/mkimg
134WITHOUT_ACPI=true
135WITHOUT_ATM=true
136WITHOUT_AUDIT=true
137WITHOUT_BIND_DNSSEC=true
138WITHOUT_BIND_ETC=true
139WITHOUT_BIND_LIBS_LWRES=true
140WITHOUT_BLUETOOTH=true
141WITHOUT_CALENDAR=true
142WITHOUT_CVS=true
143WITHOUT_DICT=true
144WITHOUT_EXAMPLES=true
145WITHOUT_FORTRAN=true
146WITHOUT_GAMES=true
147WITHOUT_GCOV=true
148WITHOUT_GPIB=true
149WITHOUT_HTML=true
150WITHOUT_I4B=true
151WITHOUT_IPFILTER=true
152WITHOUT_IPX=true
153WITHOUT_LIBKSE=true
154WITHOUT_LOCALES=true
155WITHOUT_LPR=true
156WITHOUT_MAN=true
157WITHOUT_NETCAT=true
158WITHOUT_NIS=true
159WITHOUT_NLS=true
160WITHOUT_NS_CACHING=true
161WITHOUT_OBJC=true
162WITHOUT_PROFILE=true
163WITHOUT_SENDMAIL=true
164WITHOUT_SHAREDOCS=true
165WITHOUT_SYSCONS=true
166WITHOUT_LIB32=true
167WITHOUT_TESTS=true
168WITHOUT_DEBUG_FILES=t
169WITHOUT_KERNEL_SYMBOLS=t
170"
171CONF_INSTALL="$CONF_BUILD
172INSTALL_NODEBUG=t
173NOPORTDOCS=t
174NO_INSTALL_MANPAGES=t
175"
176# The following would help...
177# WITHOUT_TOOLCHAIN=true		can't build ports
178# WITHOUT_INSTALLLIB=true		libgcc.a
179#
180# from the build
181# WITHOUT_INFO=true			makeinfo
182# WITHOUT_RCS=true
183PKG_ONLY_MAKE_CONF="
184WITHOUT_TOOLCHAIN=true
185WITHOUT_INSTALLLIB=true
186WITHOUT_INFO=true
187WITHOUT_RCS=true
188"
189
190NANO_PACKAGE_ONLY=1
191
192# Creates images for all the formats that use MBR / GPT
193# split later if the #ifdef soup gets too bad.
194create_diskimage_gpt ( ) (
195	pprint 2 "build diskimage gpt ${NANO_NAME}"
196
197	create_diskimage_mbr $*
198)
199
200create_diskimage_mbr ( ) (
201
202	local fmt
203
204	[ -z ${NANO_DISKIMAGE_FORMAT} ] || fmt=".${NANO_DISKIMAGE_FORMAT}"
205
206	pprint 2 "build diskimage ${NANO_NAME}"
207	pprint 3 "log: ${NANO_LOG}/_.di"
208	pprint 3 "image in: ${NANO_DISKIMGDIR}/_.disk.image.${NANO_NAME}${fmt}"
209
210	(
211	local extra i sz fmt fmtarg bootmbr bootbsd skiparg
212	set -o xtrace
213	# Tell mtools not to be too picky
214	export MTOOLS_SKIP_CHECK=1
215
216	[ -z ${NANO_DISKIMAGE_FORMAT} ] || fmtarg="-f ${NANO_DISKIMAGE_FORMAT}"
217	[ -z ${NANO_DISKIMAGE_FORMAT} ] || fmt=".${NANO_DISKIMAGE_FORMAT}"
218	bootmbr=${NANO_BOOT_MBR:+-b ${NANO_BOOT_MBR}}
219	bootbsd=${NANO_BOOT_BSD:+-b ${NANO_BOOT_BSD}}
220	skiparg=${NANO_MBR_FIRST_SKIP:+-S ${NANO_MBR_FIRST_SKIP}}
221
222	for i in s1 s2 s3 s4 p1 p2 p3 p4 p5 empty; do
223		rm -fr ${NANO_LOG}/_.${i}*
224	done
225
226	# Populate the FAT partition, if needed
227	if [ -n "${NANO_SLICE_FAT}" ]; then
228		echo Creating MSDOS partition for kernel
229		newfs_msdos -C ${NANO_SLICE_FAT_SIZE} -F 16 -L ${NANO_NAME} \
230			${NANO_LOG}/_.${NANO_SLICE_FAT}
231		if [ -d ${NANO_FAT_DIR} ]; then
232			# Need to copy files from ${NANO_FATDIR} with mtools, or use
233			# makefs -t msdos once that's supported
234			mcopy -i ${NANO_LOG}/_.${NANO_SLICE_FAT} ${NANO_FAT_DIR}/* ::
235		fi
236	fi
237
238	# Populate the Powerpc boot image, if needed
239	if [ "${NANO_LAYOUT}" = powerpc64-ibm ]; then
240		dd if=${NANO_WORLDDIR}/boot/boot1.elf of=${NANO_LOG}/_.s1 bs=800k count=1 conv=sync
241	fi
242
243	# Populate the / partition, and place it into a slice with a
244	# bsd label
245	[ -z ${NANO_NOPRIV_BUILD} ] || extra="-F ${NANO_METALOG}"
246	sz=${NANO_SLICE_ROOT_SIZE:+-s ${NANO_SLICE_ROOT_SIZE}}
247	eval "${NANO_MAKEFS_UFS}" ${extra} $sz "${NANO_LOG}/_.${NANO_ROOT}" \
248		"${NANO_WORLDDIR}"
249	case ${NANO_DISK_SCHEME} in
250	mbr)
251		mkimg -s bsd ${bootbsd} -p freebsd-ufs:=${NANO_LOG}/_.${NANO_ROOT} \
252			-o ${NANO_LOG}/_.${NANO_SLICE_ROOT}
253		eval $NANO_SLICE_CFG=freebsd
254		eval $NANO_SLICE_ROOT=freebsd
255		;;
256	gpt)
257		eval $NANO_SLICE_CFG=freebsd-ufs
258		eval $NANO_SLICE_ROOT=freebsd-ufs
259		;;
260	esac
261
262	# Populate the /cfg partition, empty if none given
263	if [ -z "${NANO_CFGDIR}" ]; then
264		echo "Faking cfg dir, it's empty"
265		NANO_CFGDIR=${NANO_LOG}/_.empty
266		mkdir -p ${NANO_CFGDIR}
267	fi
268	# XXX -F cfg-mtree
269	eval "${NANO_MAKEFS_UFS}" -s ${NANO_SLICE_CFG_SIZE} \
270		"${NANO_LOG}/_.${NANO_SLICE_CFG}" "${NANO_CFGDIR}"
271
272	# data slice not supported since we need the part for FAT for
273	# booting
274
275	# Now shuffle all the slices together into the proper layout
276	if [ -n "$NANO_SLICE_FAT" ]; then
277		eval $NANO_SLICE_FAT=fat16b
278	fi
279
280	out=${NANO_DISKIMGDIR}/_.disk.image.${NANO_NAME}${fmt}
281	# below depends on https://reviews.freebsd.org/D4403 not yet in the tree
282	# but there's problems: it marks all partitions as active, so you have to
283	# boot off partition 3 or 2 by hand if you're playing around with this WIP
284	case ${NANO_LAYOUT} in
285	std-embedded)
286		mkimg -a 3 ${skiparg} ${fmtarg} ${bootmbr} -s mbr -p ${s1}:=${NANO_LOG}/_.s1 \
287			-p ${s2}:=${NANO_LOG}/_.s2 \
288			-p ${s3}:=${NANO_LOG}/_.s3 \
289			-o ${out}
290		;;
291	std-x86)
292		# s3 is cfg, s1 is /, s2 is other / (s2 is created in first boot script)
293		mkimg -a 1 ${fmtarg} ${bootmbr} -s mbr -p ${s1}:=${NANO_LOG}/_.s1 \
294			-p- \
295			-p ${s3}:=${NANO_LOG}/_.s3 \
296			-o ${out}
297
298
299		;;
300	std-uefi)
301		# s1 is boot, s2 is cfg, s3 is /, not sure how to make that
302		# boot (marked as active) with mkimg yet
303		mkimg -a 2 ${fmtarg} ${bootmbr} -s mbr \
304			-p efi:=${NANO_WORLDDIR}/boot/efiboot.img \
305			-p ${s2}:=${NANO_LOG}/_.s2 \
306			-p ${s3}:=${NANO_LOG}/_.s3 \
307			-o ${out}
308		;;
309	std-uefi-bios)
310		# p1 is boot for uefi, p2 is boot for gpt, p3 is cfg, p4 is /
311		# and p5 is alt-root (after resize)
312		mkimg -a 2 ${fmtarg} ${bootmbr} -s gpt \
313			-p efi:=${NANO_WORLDDIR}/boot/efiboot.img \
314			-p freebsd-boot:=${NAANO_WORLDDIR}/boot/gptboot \
315			-p ${p3}:=${NANO_LOG}/_.p3 \
316			-p ${p4}:=${NANO_LOG}/_.p4 \
317			-o ${out}
318		;;
319	powerpc64-ibm)
320		# A lie to make the boot loader work, it boots the first BSD partition
321		# it finds, regardless of the active flag.
322		s2=fat16b
323		# boot image is on a special partition, ala std-embedded, but that
324		# partition isn't FAT with special files, but a copy of the boot
325		# loader itself.
326		mkimg -a 1 ${fmtarg} -s mbr -p prepboot:=${NANO_LOG}/_.s1 \
327			-p ${s2}:=${NANO_LOG}/_.s2 \
328			-p ${s3}:=${NANO_LOG}/_.s3a \
329			-o ${out}
330		;;
331	esac
332	rm -f ${out}.xz
333	xz -9 --keep ${out}
334	) > ${NANO_LOG}/_.di 2>&1
335)
336
337die( ) {
338	echo "$*"
339	exit 1
340}
341
342# Automatically include the packaging port here so it is always first so it
343# builds the port and adds the package so we can add other packages.
344#XXX Doesn't work for cross build, so punting until I can integreate qemu-static
345#XXX or poudriere, both of which require priv'd execution. Or qemu-system,
346#XXX which is super, super slow.
347#add_port ports-mgmt/pkg
348#add_port security/sudo
349#add_port ftp/curl
350
351rp=$(realpath ${NANO_OBJ}/)
352__a=`mount | grep ${rp} | awk '{print length($3), $3;}' | sort -rn | awk '{$1=""; print;}'`
353if [ -n "$__a" ]; then
354    echo "unmounting $__a"
355    umount $__a
356fi
357
358if [ "$DEBUG" = 1 ]; then
359	DEBUG_BUILD="
360DEBUG_FLAGS=		-g
361"
362else
363	DEBUG_INSTALL="
364INSTALL_NODEBUG=	t
365"
366fi
367
368CONF_INSTALL="$CONF_BUILD
369${DEBUG_BUILD}
370"
371CONF_INSTALL="$CONF_INSTALL
372${DEBUG_INSTALL}
373"
374
375if [ "${NANO_PACKAGE_ONLY}" -eq 1 ]; then
376 	CONF_INSTALL="${CONF_INSTALL}
377${PKG_ONLY_MAKE_CONF}
378"
379	echo "Automatically building a thin image with packages"
380else
381	echo "Automatically building a * * F A T * * image so we can build ports"
382fi
383
384VARS="MASTER_SITE_BACKUP MASTER_SITE_OVERRIDE PACKAGEROOT PACKAGESITE"
385
386for var in $VARS; do
387	val=$(eval echo "\$$var")
388	if [ -n "$val" ]; then
389		CONF_INSTALL="${CONF_INSTALL}
390$var=$val"
391	fi
392done
393
394typical_embedded ( ) (
395	# Need to create rc.conf before we copy over /etc to /conf/base/etc
396	# so now's a good time.
397
398	local rc=${NANO_WORLDDIR}/etc/rc.conf
399
400	echo "hostname=nanobsd-${NANO_NAME}" > $rc
401	echo "growfs_enable=YES" >> $rc
402	echo "growfs_type=nanobsd-pingpong" >> $rc
403	echo "ntpdate_enable=YES" >> $rc
404	echo "ifconfig_DEFAULT=DHCP" >> $rc
405	echo "ntpdate_hosts='0.freebsd.pool.ntp.org 1.freebsd.pool.ntp.org'" >> $rc
406	# Make sure that firstboot scripts run so growfs works.
407	# Note: still some issues remvoing this XXX
408	touch ${NANO_WORLDDIR}/firstboot
409)
410customize_cmd typical_embedded
411
412fix_pkg ( ) (
413	chdir ${NANO_WORLDDIR}
414	mkdir -p pkg
415	mkdir -p pkg/db
416	mkdir -p pkg/cache
417	mkdir -p pkg/tmp		# Needed for pkg bootstrap
418	mkdir -p usr/local/etc		# Will get moved to local/etc
419	(
420	echo 'PKG_DBDIR = "/pkg/db"'
421	echo 'PKG_CACHEDIR = "/pkg/cache"'
422	echo 'DEFAULT_ALWAYS_YES = "yes"'
423	echo 'ASSUME_ALWAYS_YES = "yes"'
424	) >> usr/local/etc/pkg.conf
425	[ -z ${NANO_NOPRIV_BUILD} ] || (
426	echo "./pkg type=dir uname=root gname=wheel mode=0755"
427	echo "./pkg/cache type=dir uname=root gname=wheel mode=0755"
428	echo "./pkg/db type=dir uname=root gname=wheel mode=0755"
429	echo "./pkg/tmp type=dir uname=root gname=wheel mode=0755"
430	) >> ${NANO_METALOG}
431)
432customize_cmd fix_pkg
433
434save_build ( ) (
435	VERSION_FILE=${NANO_WORLDDIR}/etc/version
436	if [ "${SVNREVISION}" = "${REVISION}" ]; then
437		echo "${NANO_NAME}" > "${VERSION_FILE}"
438	else
439		echo "${NANO_NAME} (${SVNREVISION})" > "${VERSION_FILE}"
440	fi
441)
442customize_cmd save_build
443
444shrink_md_fbsize ( ) (
445	# We have a lot of little files on our memory disks. Let's decrease
446	# the block and frag size to fit more little files on them (this
447	# halves our space requirement by ~50% on /etc and /var on 8.x --
448	# and gives us more back on 9.x as the default block and frag size
449	# are 4 times larger).
450	sed -i '' -e 's,-S -i 4096,-S -i 4096 -b 4096 -f 512,' \
451		${NANO_WORLDDIR}/etc/rc.initdiskless
452)
453customize_cmd shrink_md_fbsize
454
455customize_cmd cust_comconsole
456
457dos_boot_part ( ) (
458	local d=/usr/local/share/u-boot/${NANO_BOOT_PKG}
459	local f=${NANO_FAT_DIR}
460
461	# For now, just copy all the files. However, for iMX6 and Allwinner,
462	# we'll need to put a special boot block at a fixed location
463	# on the disk as well.
464	rm -rf $f
465	mkdir $f
466	chdir $f
467	cp ${d}/* .
468
469	# Also copy ubldr. u-boot will load it and it will load the kernel
470	# from the ufs partition
471	cp ${NANO_WORLDDIR}/boot/ubldr .
472	cp ${NANO_WORLDDIR}/boot/ubldr.bin .
473
474	# We have to touch the saveenv file
475	touch uEnv.txt
476
477	# Now we need to copy over dtb files from the build.
478	cp ${NANO_WORLDDIR}/boot/dtb/*.dtb .
479)
480
481if [ -n "$NANO_BOOT_PKG" ]; then
482	d=/usr/local/share/u-boot/${NANO_BOOT_PKG}
483	if [ ! -d ${d} ]; then
484		echo ${NANO_BOOT_PKG} not installed. Sadly, it must be.
485		exit 1
486	fi
487	if [ ! -x /usr/local/bin/mcopy ]; then
488		echo mtools not installed. Sadly, we gotta have it.
489		exit 1
490	fi
491	customize_cmd dos_boot_part
492fi
493
494product_custom ( ) (
495	# not quite ready to tweak these in nopriv build
496	if [ -z ${NANO_NOPRIV_BUILD} ]; then
497		# Last second tweaks -- generally not needed
498		chown -R root:wheel ${NANO_WORLDDIR}/root
499		chmod 0755 ${NANO_WORLDDIR}/root/*
500		chmod 0755 ${NANO_WORLDDIR}/*
501		chown -R root:wheel ${NANO_WORLDDIR}/etc
502		chown -R root:wheel ${NANO_WORLDDIR}/boot
503		chown root:wheel ${NANO_WORLDDIR}/
504		chown root:wheel ${NANO_WORLDDIR}/usr
505	fi
506)
507late_customize_cmd product_custom
508
509#
510# Convenience routines to bring up many settings for standard environments
511#
512
513#
514# For each architecture, we have a standard set of settings to the extent
515# it makes sense. For architectures that don't have a standard environment
516# cfg files need to either define a lot of settings, provide their own disk
517# imaging, or set which of the variants we support. No subshells, since we
518# set global variables
519#
520
521std_aarch64 ( ) {
522}
523
524std_amd64 ( ) {
525	std_i386
526}
527
528std_arm ( ) {
529}
530
531std_armv6 ( ) {
532}
533
534std_armv7 ( ) {
535}
536
537std_i386 ( ) {
538	# Default values, if not overridden in .cfg file
539	: ${NANO_KERNEL:=GENERIC}
540	: ${NANO_DRIVE:=ada0}
541	: ${NANO_LAYOUT:=std-x86}
542	: ${NANO_BOOT_MBR:=${NANO_WORLDDIR}/boot/boot0sio}
543	: ${NANO_BOOT_BSD:=${NANO_WORLDDIR}/boot/boot}
544}
545
546std_mips ( ) {
547	NANO_ENDIAN=big
548}
549
550std_mipsel ( ) {
551}
552
553std_mips64 ( ) {
554	NANO_ENDIAN=big
555}
556
557std_mips64el ( ) {
558}
559
560std_powerpc ( ) {
561	NANO_ENDIAN=big
562}
563
564std_powerpc64 ( ) {
565	NANO_LAYOUT=powerpc64-ibm
566	NANO_ENDIAN=big
567}
568
569std_sparc64 ( ) {
570	NANO_ENDIAN=big
571}
572
573#
574# QEMU settings for the standard environments
575#
576qemu_env ( ) {
577
578	NANO_DISKIMAGE_FORMAT=qcow2
579}
580
581# other standard environments will go here
582
583eval std_${NANO_ARCH}
584
585# Slice 1: FAT for ROM loading bootstrap
586# Slice 2: Config partition
587# Slice 3: FreeBSD partition (sized exactly)
588# Slice 4: FreeBSD partition (empty)
589# on first boot, we resize slice 3 & 4 to be 1/2 of what's
590# left over on the SD card after slice 1 and 2 are taken
591# off the top. We also resize the 'a' partion on first boot
592# to the size of the partition for the ping/pong upgrade.
593# This feature needs support in the rc.d bootup script.
594#
595# Ideally, we'd not put BSD labels on the MBR disks.
596# However, we can't boot off raw MBR disks. First,
597# boot2 defaults to 'a' partition, and freaks out
598# unless you tell it to use 'c'. But even if we
599# hack that, then /boot/loader wants to load off
600# of 'c' partition. If you fix that, then we'll
601# try to mount root, but sanity checks prevent
602# slices from working.
603#
604
605: ${NANO_ENDIAN:=little}	# make -V something to figure it out?
606: ${NANO_LAYOUT:=std-embedded}
607: ${NANO_MAKEFS_UFS:=makefs -t ffs -B ${NANO_ENDIAN}}
608: ${NANO_DISK_SCHEME:=mbr}  	# No others really supported ATM (well, gpt)
609case ${NANO_LAYOUT} in
610std-embedded)
611	NANO_SLICE_FAT=s1
612	NANO_SLICE_CFG=s2
613	NANO_SLICE_ROOT=s3
614	NANO_SLICE_ALTROOT=s4
615	NANO_ROOT=${NANO_SLICE_ROOT}a
616	NANO_ALTROOT=${NANO_SLICE_ALTROOT}a
617	;;
618std-x86)
619	NANO_SLICE_CFG=s3
620	NANO_SLICE_ROOT=s1
621	NANO_SLICE_ALTROOT=s2
622	NANO_ROOT=${NANO_SLICE_ROOT}a
623	NANO_ALTROOT=${NANO_SLICE_ALTROOT}a
624	;;
625powerpc64-ibm)
626	NANO_SLICE_PPCBOOT=s1
627	NANO_SLICE_CFG=s2
628	NANO_SLICE_ROOT=s3
629	NANO_SLICE_ALTROOT=s4
630	NANO_ROOT=${NANO_SLICE_ROOT}a
631	NANO_ALTROOT=${NANO_SLICE_ALTROOT}a
632	;;
633powerpc64-apple)
634	echo Not yet
635	exit 1
636	;;
637std-uefi)
638	NANO_SLICE_UEFI=s1
639	NANO_SLICE_CFG=s2
640	NANO_SLICE_ROOT=s3
641	NANO_SLICE_ALTROOT=s4
642	NANO_ROOT=${NANO_SLICE_ROOT}
643	NANO_ALTROOT=${NANO_SLICE_ALTROOT}
644	;;
645std-uefi-bios)
646	NANO_DISK_SCHEME=gpt
647	NANO_SLICE_UEFI=p1
648	NANO_SLICE_BOOT=p2
649	NANO_SLICE_CFG=p3
650	NANO_SLICE_ROOT=p4
651	NANO_SLICE_ALTROOT=p5
652	NANO_ROOT=${NANO_SLICE_ROOT}
653	NANO_ALTROOT=${NANO_SLICE_ALTROOT}
654	;;
655*)
656	echo Unknown Layout ${NANO_LAYOUT}
657	exit 1
658	;;
659esac
660
661
662NANO_SLICE_DATA=		# Not included
663
664# Each major disk scheme has its own routine. Generally
665# this is for mbr, gpt, etc. These are generally are widely
666# shared, but some specialized formats won't be shared.
667create_diskimage ( ) (
668	eval create_diskimage_${NANO_DISK_SCHEME}
669)
670
671# Set the path to the same path we use for buldworld to use latest mkimg
672NANO_TARGET=$(cd ${NANO_SRC}; ${NANO_MAKE} TARGET_ARCH=${NANO_ARCH} -V _TARGET)
673NANO_TMPPATH=$(cd ${NANO_SRC}; ${NANO_MAKE} MK_AUTO_OBJ=no TARGET=${NANO_TARGET} TARGET_ARCH=${NANO_ARCH} -f Makefile.inc1 buildenv -V TMPPATH)
674export PATH="${NANO_TMPPATH}:${PATH}"
675