xref: /minix3/usr.sbin/installboot/installboot.h (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /*	$NetBSD: installboot.h,v 1.39 2014/02/24 07:23:44 skrll Exp $	*/
29f8e6353SEvgeniy Ivanov 
39f8e6353SEvgeniy Ivanov /*-
49f8e6353SEvgeniy Ivanov  * Copyright (c) 2002 The NetBSD Foundation, Inc.
59f8e6353SEvgeniy Ivanov  * All rights reserved.
69f8e6353SEvgeniy Ivanov  *
79f8e6353SEvgeniy Ivanov  * This code is derived from software contributed to The NetBSD Foundation
89f8e6353SEvgeniy Ivanov  * by Luke Mewburn of Wasabi Systems.
99f8e6353SEvgeniy Ivanov  *
109f8e6353SEvgeniy Ivanov  * Redistribution and use in source and binary forms, with or without
119f8e6353SEvgeniy Ivanov  * modification, are permitted provided that the following conditions
129f8e6353SEvgeniy Ivanov  * are met:
139f8e6353SEvgeniy Ivanov  * 1. Redistributions of source code must retain the above copyright
149f8e6353SEvgeniy Ivanov  *    notice, this list of conditions and the following disclaimer.
159f8e6353SEvgeniy Ivanov  * 2. Redistributions in binary form must reproduce the above copyright
169f8e6353SEvgeniy Ivanov  *    notice, this list of conditions and the following disclaimer in the
179f8e6353SEvgeniy Ivanov  *    documentation and/or other materials provided with the distribution.
189f8e6353SEvgeniy Ivanov  *
199f8e6353SEvgeniy Ivanov  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
209f8e6353SEvgeniy Ivanov  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
219f8e6353SEvgeniy Ivanov  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
229f8e6353SEvgeniy Ivanov  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
239f8e6353SEvgeniy Ivanov  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
249f8e6353SEvgeniy Ivanov  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
259f8e6353SEvgeniy Ivanov  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
269f8e6353SEvgeniy Ivanov  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
279f8e6353SEvgeniy Ivanov  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
289f8e6353SEvgeniy Ivanov  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
299f8e6353SEvgeniy Ivanov  * POSSIBILITY OF SUCH DAMAGE.
309f8e6353SEvgeniy Ivanov  */
319f8e6353SEvgeniy Ivanov 
329f8e6353SEvgeniy Ivanov #ifndef	_INSTALLBOOT_H
339f8e6353SEvgeniy Ivanov #define	_INSTALLBOOT_H
349f8e6353SEvgeniy Ivanov 
359f8e6353SEvgeniy Ivanov #if HAVE_NBTOOL_CONFIG_H
369f8e6353SEvgeniy Ivanov #include "nbtool_config.h"
379f8e6353SEvgeniy Ivanov #include "../../sys/sys/bootblock.h"
389f8e6353SEvgeniy Ivanov #else
399f8e6353SEvgeniy Ivanov #include <sys/bootblock.h>
409f8e6353SEvgeniy Ivanov #include <sys/endian.h>
419f8e6353SEvgeniy Ivanov #endif
429f8e6353SEvgeniy Ivanov 
439f8e6353SEvgeniy Ivanov #include <sys/stat.h>
449f8e6353SEvgeniy Ivanov #include <stdint.h>
459f8e6353SEvgeniy Ivanov 
469f8e6353SEvgeniy Ivanov typedef enum {
479f8e6353SEvgeniy Ivanov 				/* flags from global options */
489f8e6353SEvgeniy Ivanov 	IB_VERBOSE =	1<<0,		/* verbose operation */
499f8e6353SEvgeniy Ivanov 	IB_NOWRITE =	1<<1,		/* don't write */
509f8e6353SEvgeniy Ivanov 	IB_CLEAR =	1<<2,		/* clear boot block */
519f8e6353SEvgeniy Ivanov 	IB_EDIT =	1<<3,		/* edit boot parameters */
529f8e6353SEvgeniy Ivanov 	IB_FORCE =	1<<4,		/* Ignore some consistency checks */
539f8e6353SEvgeniy Ivanov 
549f8e6353SEvgeniy Ivanov 				/* flags from -o options */
559f8e6353SEvgeniy Ivanov 	IB_ALPHASUM =	1<<8,		/* set Alpha checksum */
569f8e6353SEvgeniy Ivanov 	IB_APPEND =	1<<9,		/* append stage 1 to EO(regular)F */
579f8e6353SEvgeniy Ivanov 	IB_SUNSUM =	1<<10,		/* set Sun checksum */
589f8e6353SEvgeniy Ivanov 	IB_STAGE1START=	1<<11,		/* start block for stage 1 provided */
599f8e6353SEvgeniy Ivanov 	IB_STAGE2START=	1<<12,		/* start block for stage 2 provided */
609f8e6353SEvgeniy Ivanov 	IB_COMMAND = 	1<<13,		/* Amiga commandline option */
619f8e6353SEvgeniy Ivanov 	IB_RESETVIDEO =	1<<14,		/* i386 reset video */
629f8e6353SEvgeniy Ivanov 	IB_CONSOLE =	1<<15,		/* i386 console */
639f8e6353SEvgeniy Ivanov 	IB_CONSPEED =	1<<16,		/* i386 console baud rate */
649f8e6353SEvgeniy Ivanov 	IB_TIMEOUT =	1<<17,		/* i386 boot timeout */
659f8e6353SEvgeniy Ivanov 	IB_PASSWORD =	1<<18,		/* i386 boot password */
669f8e6353SEvgeniy Ivanov 	IB_KEYMAP = 	1<<19,		/* i386 console keymap */
679f8e6353SEvgeniy Ivanov 	IB_CONSADDR = 	1<<20,		/* i386 console io address */
689f8e6353SEvgeniy Ivanov 	IB_MODULES =	1<<21,		/* i386: load modules */
699f8e6353SEvgeniy Ivanov 	IB_BOOTCONF = 	1<<22,		/* i386: read boot.conf */
709f8e6353SEvgeniy Ivanov } ib_flags;
719f8e6353SEvgeniy Ivanov 
729f8e6353SEvgeniy Ivanov typedef struct {
739f8e6353SEvgeniy Ivanov 	ib_flags	 flags;		/* flags (see above) */
749f8e6353SEvgeniy Ivanov 	struct ib_mach	*machine;	/* machine details (see below) */
759f8e6353SEvgeniy Ivanov 	struct ib_fs	*fstype;	/* file system details (see below) */
769f8e6353SEvgeniy Ivanov 	const char	*filesystem;	/* name of target file system */
779f8e6353SEvgeniy Ivanov 	int		 fsfd;		/*  open fd to filesystem */
789f8e6353SEvgeniy Ivanov 	struct stat	 fsstat;	/*  fstat(2) of fsfd */
799f8e6353SEvgeniy Ivanov 	const char	*stage1;	/* name of stage1 bootstrap */
809f8e6353SEvgeniy Ivanov 	int		 s1fd;		/*  open fd to stage1 */
819f8e6353SEvgeniy Ivanov 	struct stat	 s1stat;	/*  fstat(2) of s1fd */
829f8e6353SEvgeniy Ivanov 	uint64_t	 s1start;	/*  start block of stage1 */
839f8e6353SEvgeniy Ivanov 	const char	*stage2;	/* name of stage2 bootstrap */
849f8e6353SEvgeniy Ivanov 	uint64_t	 s2start;	/*  start block of stage2 */
859f8e6353SEvgeniy Ivanov 	uint32_t	 sectorsize;	/* sector size of target fs */
869f8e6353SEvgeniy Ivanov 		/* parsed -o option=value data */
879f8e6353SEvgeniy Ivanov 	const char	*command;	/* name of command string */
889f8e6353SEvgeniy Ivanov 	const char	*console;	/* name of console */
899f8e6353SEvgeniy Ivanov 	int		 conspeed;	/* console baud rate */
909f8e6353SEvgeniy Ivanov 	int		 consaddr;	/* console io address */
919f8e6353SEvgeniy Ivanov 	const char	*password;	/* boot password */
929f8e6353SEvgeniy Ivanov 	int		 timeout;	/* interactive boot timeout */
939f8e6353SEvgeniy Ivanov 	const char	*keymap;	/* keyboard translations */
949f8e6353SEvgeniy Ivanov } ib_params;
959f8e6353SEvgeniy Ivanov 
969f8e6353SEvgeniy Ivanov typedef struct {
979f8e6353SEvgeniy Ivanov 	uint64_t	block;
989f8e6353SEvgeniy Ivanov 	uint32_t	blocksize;
999f8e6353SEvgeniy Ivanov } ib_block;
1009f8e6353SEvgeniy Ivanov 
1019f8e6353SEvgeniy Ivanov struct ib_mach {
1029f8e6353SEvgeniy Ivanov 	const char	*name;
1039f8e6353SEvgeniy Ivanov 	int		(*setboot)	(ib_params *);
1049f8e6353SEvgeniy Ivanov 	int		(*clearboot)	(ib_params *);
1059f8e6353SEvgeniy Ivanov 	int		(*editboot)	(ib_params *);
1069f8e6353SEvgeniy Ivanov 	ib_flags	valid_flags;
1079f8e6353SEvgeniy Ivanov };
1089f8e6353SEvgeniy Ivanov 
1099f8e6353SEvgeniy Ivanov struct ib_fs {
1109f8e6353SEvgeniy Ivanov 		/* compile time parameters */
1119f8e6353SEvgeniy Ivanov 	const char	*name;
1129f8e6353SEvgeniy Ivanov 	int		(*match)	(ib_params *);
1139f8e6353SEvgeniy Ivanov 	int		(*findstage2)	(ib_params *, uint32_t *, ib_block *);
1149f8e6353SEvgeniy Ivanov 		/* run time fs specific parameters */
1159f8e6353SEvgeniy Ivanov 	uint32_t	 blocksize;
1169f8e6353SEvgeniy Ivanov 	uint32_t	 needswap;
1179f8e6353SEvgeniy Ivanov 	off_t		sblockloc;	/* location of superblock */
1189f8e6353SEvgeniy Ivanov 	off_t		offset;		/* file system offset (e.g. RAID) */
1199f8e6353SEvgeniy Ivanov };
1209f8e6353SEvgeniy Ivanov 
1219f8e6353SEvgeniy Ivanov typedef enum {
1229f8e6353SEvgeniy Ivanov 	BBINFO_BIG_ENDIAN =	0,
1239f8e6353SEvgeniy Ivanov 	BBINFO_LITTLE_ENDIAN =	1,
1249f8e6353SEvgeniy Ivanov } bbinfo_endian;
1259f8e6353SEvgeniy Ivanov 
1269f8e6353SEvgeniy Ivanov struct bbinfo_params {
1279f8e6353SEvgeniy Ivanov 	const char	*magic;		/* magic string to look for */
1289f8e6353SEvgeniy Ivanov 	uint32_t	offset;		/* offset to write start of stage1 */
1299f8e6353SEvgeniy Ivanov 	uint32_t	blocksize;	/* blocksize of stage1 */
1309f8e6353SEvgeniy Ivanov 	uint32_t	maxsize;	/* max size of stage1 */
1319f8e6353SEvgeniy Ivanov 	uint32_t	headeroffset;	/*
1329f8e6353SEvgeniy Ivanov 					 * header offset (relative to offset)
1339f8e6353SEvgeniy Ivanov 					 * to read stage1 into
1349f8e6353SEvgeniy Ivanov 					 */
1359f8e6353SEvgeniy Ivanov 	bbinfo_endian	endian;
1369f8e6353SEvgeniy Ivanov };
1379f8e6353SEvgeniy Ivanov 
1389f8e6353SEvgeniy Ivanov extern struct ib_mach	* const machines[];
1399f8e6353SEvgeniy Ivanov extern struct ib_fs	fstypes[];
1409f8e6353SEvgeniy Ivanov 
1419f8e6353SEvgeniy Ivanov 	/* installboot.c */
1429f8e6353SEvgeniy Ivanov uint16_t	compute_sunsum(const uint16_t *);
1439f8e6353SEvgeniy Ivanov int		set_sunsum(ib_params *, uint16_t *, uint16_t);
1449f8e6353SEvgeniy Ivanov int		no_setboot(ib_params *);
1459f8e6353SEvgeniy Ivanov int		no_clearboot(ib_params *);
1469f8e6353SEvgeniy Ivanov int		no_editboot(ib_params *);
1479f8e6353SEvgeniy Ivanov 
1489f8e6353SEvgeniy Ivanov 	/* bbinfo.c */
1499f8e6353SEvgeniy Ivanov int		shared_bbinfo_clearboot(ib_params *, struct bbinfo_params *,
1509f8e6353SEvgeniy Ivanov 		    int (*)(ib_params *, struct bbinfo_params *, uint8_t *));
1519f8e6353SEvgeniy Ivanov int		shared_bbinfo_setboot(ib_params *, struct bbinfo_params *,
1529f8e6353SEvgeniy Ivanov 		    int (*)(ib_params *, struct bbinfo_params *, uint8_t *));
1539f8e6353SEvgeniy Ivanov 
1549f8e6353SEvgeniy Ivanov 	/* fstypes.c */
1559f8e6353SEvgeniy Ivanov int		hardcode_stage2(ib_params *, uint32_t *, ib_block *);
1569f8e6353SEvgeniy Ivanov int		ffs_match(ib_params *);
1579f8e6353SEvgeniy Ivanov int		ffs_findstage2(ib_params *, uint32_t *, ib_block *);
1589f8e6353SEvgeniy Ivanov int		raid_match(ib_params *);
1599f8e6353SEvgeniy Ivanov int		raw_match(ib_params *);
1609f8e6353SEvgeniy Ivanov int		raw_findstage2(ib_params *, uint32_t *, ib_block *);
1619f8e6353SEvgeniy Ivanov int		ext2fs_match(ib_params *);
1629f8e6353SEvgeniy Ivanov int		ext2fs_findstage2(ib_params *, uint32_t *, ib_block *);
1639f8e6353SEvgeniy Ivanov 
164fa6c4a25SEvgeniy Ivanov 	/* install_master.c */
165fa6c4a25SEvgeniy Ivanov void		install_master(const char *device, char *masterboot, char **guide);
166fa6c4a25SEvgeniy Ivanov int		isoption(const char *option, const char *test);
167fa6c4a25SEvgeniy Ivanov 
168fa6c4a25SEvgeniy Ivanov 	/* minixfs3.c */
16916440d9bSDavid van Moolenbroek int minixfs3_is_minix_partition(ib_params *params);
17016440d9bSDavid van Moolenbroek int minixfs3_has_bootblock_space(ib_params *params);
171fa6c4a25SEvgeniy Ivanov 
172fa6c4a25SEvgeniy Ivanov 
1739f8e6353SEvgeniy Ivanov 	/* machines.c */
1749f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_alpha;
1759f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_amd64;
1769f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_amiga;
1779f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_ews4800mips;
1789f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_hp300;
179*0a6a1f1dSLionel Sambuc extern struct ib_mach ib_mach_hppa;
1809f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_i386;
1819f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_landisk;
1829f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_macppc;
1839f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_news68k;
1849f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_newsmips;
1859f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_next68k;
1869f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_pmax;
1879f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_sparc;
1889f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_sparc64;
1899f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_sun2;
1909f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_sun3;
1919f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_vax;
1929f8e6353SEvgeniy Ivanov extern struct ib_mach ib_mach_x68k;
1939f8e6353SEvgeniy Ivanov 
1949f8e6353SEvgeniy Ivanov #endif	/* _INSTALLBOOT_H */
195