Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 10 Mar 1996 20:15:55 +1100
From:      Bruce Evans <bde@zeta.org.au>
To:        current@freebsd.org
Subject:   booting from sd5 when wd3 is also installed
Message-ID:  <199603100915.UAA20728@godzilla.zeta.org.au>

next in thread | raw e-mail | index | archive | help
These changes should allow specifying the BIOS drive number independently
of the FreeBSD unit number.  E.g., `9:sd(5,a)' describes the drive with
BIOS drive number 9 and sd unit number 5.

hd(N,a) is no longer supported because it doesn't fit and it only works
for unit number 0.  Use N:sd(0,a) instead.

I haven't decided exactly how to handle these points:
- how sticky should the drive number be?  What is the default drive number
  after 1:sd(0,a)/nonesuch followed by /kernel?
- option BOOT_HD_BIAS.  This replaces option BOOT_HD.  The BIOS drive
  number for unit N is currently BOOT_HD_BIAS + N.  Should the bias only
  be added for sd drives?  How does biasing interact with previously
  specified drive numbers?

Please test the changes on systems with mixed IDE and SCSI drives.  I
don't have any.

Bruce

diff -c2 src/sys/i386/boot/biosboot/Makefile~ src/sys/i386/boot/biosboot/Makefile
*** src/sys/i386/boot/biosboot/Makefile~	Sat Mar  9 04:42:23 1996
--- src/sys/i386/boot/biosboot/Makefile	Sun Mar 10 17:26:35 1996
***************
*** 21,28 ****
  #CFLAGS+=	-DFORCE_COMCONSOLE
  
! # Assume hd(*,a) instead of wd(*,a) if the boot seems to happen from
! # a hard disk.
! # This can be useful for people booting in a mixed IDE/SCSI environment.
! #CFLAGS+=	-DBOOT_HD
  
  CLEANFILES+=	boot.nohdr boot.strip boot1 boot2 sizetest
--- 22,31 ----
  #CFLAGS+=	-DFORCE_COMCONSOLE
  
! # Bias the conversion from the BIOS drive number to the FreeBSD unit number
! # for hard disks to save typing.  E.g., BOOT_HD_BIAS=1 makes BIOS drive 1
! # correspond to 1:sd(0,a) instead of 1:sd(1,a).
! # This may be useful for people booting in a mixed IDE/SCSI environment
! # (set BOOT_HD_BIAS to the number of IDE drives).
! #CFLAGS+=	-DBOOT_HD_BIAS=1
  
  CLEANFILES+=	boot.nohdr boot.strip boot1 boot2 sizetest
diff -c2 src/sys/i386/boot/biosboot/README.386BSD~ src/sys/i386/boot/biosboot/README.386BSD
*** src/sys/i386/boot/biosboot/README.386BSD~	Fri Feb 17 08:57:51 1995
--- src/sys/i386/boot/biosboot/README.386BSD	Sun Mar 10 16:59:28 1996
***************
*** 103,116 ****
  
  ##########################################################################
! In the case you have two drives the same type (both scsi or bith IDE/ESDI),
! wd(0,a)xxx
! 	will boot xxx from drive 0, a partition.
! wd(1,a)xxx
! 	will boot xxx from drive 1, a partition.
  
! similarly for sd.
  
! if you have one wd drive and one scsi drive, then you MUST
! use device 'hd'
  
  otherwise the following will happen:
--- 103,119 ----
  
  ##########################################################################
! In the case you have several drives the same type (all scsi or all IDE/ESDI),
! 	wd(0,a)xxx
! will boot xxx from drive 0, a partition.
! 	wd(1,a)xxx
! will boot xxx from drive 1, a partition.
  
! similarly for sd and for higher drive numbers (if the BIOS supports them).
  
! if you have one or more wd drives and one or more scsi drives, then yo
! MUST specify the BIOS drive number for booting the scsi drives:
! 	2:sd(0,a)xxx
! will boot xxx from scsi drive 0, a partition, provided `2' is the correct
! BIOS drive number for sd0.
  
  otherwise the following will happen:
***************
*** 119,126 ****
  it boots the kernel correctly, then tells the kernel to use sd1 as root.
  you however may not have an sd1, and problems arise.
- 
- hd is special in that the kernel is always told to use unit 0,
- The correct TYPE of device will be specified too, so the kernel
- will be told either sd0 or wd0.
  
  Whether sd or wd is specified to the kernel is read from the disklabel,
--- 122,125 ----
diff -c2 src/sys/i386/boot/biosboot/README.serial~ src/sys/i386/boot/biosboot/README.serial
*** src/sys/i386/boot/biosboot/README.serial~	Fri Apr 21 19:43:53 1995
--- src/sys/i386/boot/biosboot/README.serial	Sun Mar 10 18:08:25 1996
***************
*** 77,83 ****
  
    >> FreeBSD BOOT @ 0x10000: 640/7168 k of memory
!   Use hd(1,a)/kernel to boot sd0 when wd0 is also installed.
!   Usage: [[[fd(0,a)]/kernel][-s][-r][-a][-c][-d][-b][-v][-h]]
!   Use ? for file list or simply press Return for defaults
    Boot:
  
--- 77,83 ----
  
    >> FreeBSD BOOT @ 0x10000: 640/7168 k of memory
!   Usage: [[[0:][fd](0,a)]/kernel][-abcCdhrsv]
!   Use 1:sd(0,a)kernel to boot sd0 if it is BIOS drive 1
!   Use ? for file list or press ENter for defaults
    Boot:
  
diff -c2 src/sys/i386/boot/biosboot/boot.c~ src/sys/i386/boot/biosboot/boot.c
*** src/sys/i386/boot/biosboot/boot.c~	Sat Mar  9 04:42:24 1996
--- src/sys/i386/boot/biosboot/boot.c	Sun Mar 10 18:24:39 1996
***************
*** 101,117 ****
  	gateA20();
  
! 
! 	/***************************************************************\
! 	* As a default set it to the first partition of the boot	*
! 	* floppy or hard drive						*
! 	* Define BOOT_HT to boot sd0 when wd0 is also installed		*
! 	\***************************************************************/
! 	part = 0;
  	unit = drive & 0x7f;
! #ifdef	BOOT_HD
! 	maj = (drive&0x80 ? 1 : 2);		/* a good first bet */
! #else
! 	maj = (drive&0x80 ? 0 : 2);		/* a good first bet */
  #endif
  
  loadstart:
--- 110,135 ----
  	gateA20();
  
! 	/*
! 	 * The default boot device is the first partition in the
! 	 * compatibility slice on the boot drive.
! 	 */
! 	dosdev = drive;
! 	maj = 2;
  	unit = drive & 0x7f;
! #ifdef dontneed
! 	slice = 0;
! 	part = 0;
! #endif
! 	if (drive & 0x80) {
! 		/*
! 		 * Hard drive.  Adjust.  Guess that the FreeBSD unit number
! 		 * is the BIOS drive number biased by BOOT_HD_BIAS,
! 		 */
! 		maj = 0;
! #if BOOT_HD_BIAS > 0
! 		if (BOOT_HD_BIAS <= unit)
! 			unit -= BOOT_HD_BIAS;
  #endif
+ 	}
  
  loadstart:
***************
*** 119,127 ****
  	/* If we have looped, use the previous entries as defaults */
  	printf("\n>> FreeBSD BOOT @ 0x%x: %d/%d k of memory\n"
! 	       "Use hd(1,a)/kernel to boot sd0 when wd0 is also installed.\n"
! 	       "Usage: [[%s(%d,a)]%s][-abcCdhrsv]\n"
  	       "Use ? for file list or press Enter for defaults\n\nBoot: ",
  	       ouraddr, bootinfo.bi_basemem, bootinfo.bi_extmem,
! 	       devs[maj], unit, name);
  
  	name = dflname;		/* re-initialize in case of loop */
--- 137,145 ----
  	/* If we have looped, use the previous entries as defaults */
  	printf("\n>> FreeBSD BOOT @ 0x%x: %d/%d k of memory\n"
! 	       "Usage: [[[%d:][%s](%d,a)]%s][-abcCdhrsv]\n"
! 	       "Use 1:sd(0,a)kernel to boot sd0 if it is BIOS drive 1\n"
  	       "Use ? for file list or press Enter for defaults\n\nBoot: ",
  	       ouraddr, bootinfo.bi_basemem, bootinfo.bi_extmem,
! 	       dosdev & 0x7f, devs[maj], unit, name);
  
  	name = dflname;		/* re-initialize in case of loop */
***************
*** 167,171 ****
  	startaddr = head.a_entry & 0x00FFFFFF;
  	addr =  startaddr;
! 	printf("Booting %s(%d,%c)%s @ 0x%x\n"
  			, devs[maj]
  			, unit
--- 185,190 ----
  	startaddr = head.a_entry & 0x00FFFFFF;
  	addr =  startaddr;
! 	printf("Booting %d:%s(%d,%c)%s @ 0x%x\n"
! 			, dosdev & 0x7f
  			, devs[maj]
  			, unit
diff -c2 src/sys/i386/boot/biosboot/sys.c~ src/sys/i386/boot/biosboot/sys.c
*** src/sys/i386/boot/biosboot/sys.c~	Mon Jun 26 15:07:31 1995
--- src/sys/i386/boot/biosboot/sys.c	Sun Mar 10 18:18:30 1996
***************
*** 39,42 ****
--- 39,44 ----
  #endif
  
+ static char biosdrivedigit;
+ 
  #define BUFSIZE 8192
  #define MAPBUFSIZE BUFSIZE
***************
*** 165,169 ****
  {
  	char **devp, *cp = name;
! 	int ret;
  	/*******************************************************\
  	* If bracket given look for preceding device name	*
--- 167,172 ----
  {
  	char **devp, *cp = name;
! 	int biosdrive, ret;
! 
  	/*******************************************************\
  	* If bracket given look for preceding device name	*
***************
*** 177,180 ****
--- 180,193 ----
  	else
  	{
+ 		/*
+ 		 * Look for a BIOS drive number (a leading digit followed
+ 		 * by a colon).
+ 		 */
+ 		if (*(name + 1) == ':' && *name >= '0' && *name <= '9') {
+ 			biosdrivedigit = *name;
+ 			name += 2;
+ 		} else
+ 			biosdrivedigit = '\0';
+ 
  		if (cp++ != name)
  		{
***************
*** 211,232 ****
  			return 1;
  	}
  	switch(maj)
  	{
- 	case 1:
- 		dosdev = unit | 0x80;
- 		unit = 0;
- 		break;
  	case 0:
  	case 4:
! 		dosdev = unit | 0x80;
  		break;
  	case 2:
! 		dosdev = unit;
  		break;
! 	case 3:
! 		printf("Wangtek unsupported\n");
  		return 1;
- 		break;
  	}
  	inode.i_dev = dosdev;
  	/***********************************************\
--- 224,254 ----
  			return 1;
  	}
+ 	if (biosdrivedigit != '\0')
+ 		biosdrive = biosdrivedigit - '0';
+ 	else {
+ 		biosdrive = unit;
+ #if BOOT_HD_BIAS > 0
+ 		/* XXX */
+ 		if (maj == 4)
+ 			biosdrive += BOOT_HD_BIAS;
+ #endif
+ 	}
  	switch(maj)
  	{
  	case 0:
  	case 4:
! 		dosdev = biosdrive | 0x80;
  		break;
  	case 2:
! 		dosdev = biosdrive;
  		break;
! 	default:
! 		printf("Unknown device\n");
  		return 1;
  	}
+ 	printf("dosdev = %x, biosdrive = %d, unit = %d, maj = %d\n",
+ 		dosdev, biosdrive, unit, maj);
+ 	getchar(0);
+ 
  	inode.i_dev = dosdev;
  	/***********************************************\
diff -c2 src/sys/i386/boot/biosboot/table.c~ src/sys/i386/boot/biosboot/table.c
*** src/sys/i386/boot/biosboot/table.c~	Sat Mar  9 04:42:24 1996
--- src/sys/i386/boot/biosboot/table.c	Sun Mar 10 15:47:40 1996
***************
*** 137,141 ****
   * fragmentation.
   */
! char *devs[] = { "wd", "hd", "fd", "wt", "sd", 0 };
  char dflname[] = "/kernel";
  char *name = dflname;
--- 137,141 ----
   * fragmentation.
   */
! char *devs[] = { "wd", "dk", "fd", "wt", "sd", 0 };
  char dflname[] = "/kernel";
  char *name = dflname;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199603100915.UAA20728>