Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Apr 1995 11:15:04 -0500 (CDT)
From:      chain@mpd.tandem.com (Chain Lee)
To:        current@FreeBSD.org
Cc:        chain%muzak.mpd.tandem.com@mpd.tandem.com (Chain Lee)
Subject:   Re: 950412-SNAP
Message-ID:  <9504241615.AA09465@muzak>
In-Reply-To: <9504201906.AA08080@muzak> from "Chain Lee" at Apr 20, 95 02:06:34 pm

next in thread | previous in thread | raw e-mail | index | archive | help
I said,

> 2) My 'diskless' station has only a DOS partition and no FreeBSD
> partition in a wd0 (ST506). It panics during diskless boot. I traced
> down the panic to wdopen which was getting an integer division fault.
> The trace is as follows:
> 	configure()
> 	swapconf()
> 	wdsize()
> 	wdopen()
> 	---idiv fault
> Is this a known problem? I got around the problem by bypassing wdopen()
> but wasn't able to trace further down because no symbols were loaded
> into the kernel, and ddb trace shows no names. I modified netboot to
> load symbol table over the net but it seems to have no effect. What
> other things do I need to do to get the symbol table loaded into ddb? 

I've made a few small modifications to netboot to do the following:

1) Get wd0 disk geometry from bios and load bootinfo that includes
	disk geometry, so wd* driver can make use of it when fails
	to read from disk, rather than panic.
2) Load symbol tabel across the net so ddb works on diskless configuarion.
3) Build a mini netboot kernel that can be loaded by bios-boot, and 
	then starts a 'diskless' boot.

I am really hoping these features (mostly from biosboot) be included
in the standard netboot so I don't have to change it later myself.
I attached patched at the end.

Also wd0 may need to be fixed so wdattach will fail if disk geometry cannot
be obtained, rather than succeeds and later panics in wdopen when invalid
geometry is used in calculation.

Regards,

-chain

*** 1.1	1995/04/19 00:48:12
--- main.c	1995/04/23 15:04:03
***************
*** 33,39 ****
  **************************************************************************/
  main()
  {
! 	int c;
  	char *p;
  	extern char edata[], end[];
  	for (p=edata; p<end; p++) *p = 0;	/* Zero BSS */
--- 33,39 ----
  **************************************************************************/
  main()
  {
! 	int c, i;
  	char *p;
  	extern char edata[], end[];
  	for (p=edata; p<end; p++) *p = 0;	/* Zero BSS */
***************
*** 51,56 ****
--- 51,61 ----
  		printf(" - bad response\n\r");
  	}
  #endif
+ 
+ 	/* Pick up the story from the Bios on geometry of disks */
+ 	for(i = 0; i < N_BIOS_GEOM; i ++)
+ 		bootinfo.bi_bios_geom[i] = get_diskinfo(i + 0x80);
+ 
  	gateA20();
  	printf("\r\nBOOTP/TFTP/NFS bootstrap loader    ESC for menu\n\r");
  	printf("\r\nSearching for adapter...");
***************
*** 82,87 ****
--- 87,93 ----
  	char	cmd_line[80];
  	int	err, offset, read_size;
  	long	addr, broadcast;
+ 	unsigned pad, i;
  
  /* Initialize this early on */
  
***************
*** 286,299 ****
  	printf("bss=0x%X, ",head.a_bss);
  	while(head.a_bss--) *(loadpoint++) = 0;
  
  	printf("entry=0x%X.\n\r",head.a_entry);
  
  		/* Jump to kernel */
  	bootinfo.bi_version = BOOTINFO_VERSION;
  	bootinfo.bi_kernelname = kernel;
  	bootinfo.bi_nfs_diskless = &nfsdiskless;
  	kernelentry = (void *)(head.a_entry & 0x00FFFFFF);
! 	(*kernelentry)(0,NODEV,0,0,0,&bootinfo,0,0,0);
  	printf("*** %s execute failure ***\n",kernel);
  }
  
--- 292,379 ----
  	printf("bss=0x%X, ",head.a_bss);
  	while(head.a_bss--) *(loadpoint++) = 0;
  
+ 	/* Pad to a page boundary. */
+ 	pad = (unsigned)loadpoint % NBPG;
+ 	if (pad != 0) {
+ 		pad = NBPG - pad;
+ 		loadpoint += pad;
+ 	}
+ 	bootinfo.bi_symtab = (unsigned)loadpoint;
+ 
+ 	/********************************************************/
+ 	/* Copy the symbol table size                           */
+ 	/********************************************************/
+ 	*((unsigned long *)loadpoint) = head.a_syms;
+ 	loadpoint += sizeof(head.a_syms);
+ 
+ 	/********************************************************/
+ 	/* Load the symbol table				*/
+ 	/********************************************************/
+ 	printf("symbols=[+0x%x+0x%x+0x%x", pad, sizeof(head.a_syms),
+ 	       head.a_syms);
+ 	while (head.a_syms > 0) {
+ 		read_size = head.a_syms > NFS_READ_SIZE ?
+ 				NFS_READ_SIZE : head.a_syms;
+ 		if ((err = nfs_read(ARP_ROOTSERVER, root_nfs_port,
+ 			&kernel_handle, offset, read_size, loadpoint)) !=
+ 				read_size) {
+ 			if (err < 0) {
+ 				printf("Unable to read symble table: ");
+ 				nfs_err(err);
+ 			}
+ 			longjmp(jmp_bootmenu, 1);
+ 		}
+ 		loadpoint += err;
+ 		head.a_syms -= err;
+ 		offset += err;
+ 	}
+ 
+ 	/********************************************************/
+ 	/* Load the string table size				*/
+ 	/********************************************************/
+ 	if ((err = nfs_read(ARP_ROOTSERVER, root_nfs_port, &kernel_handle,
+ 		offset, sizeof(int), &i)) < 0) {
+ 		printf("Unable to read %s: ",kernel);
+ 		nfs_err(err);
+ 		longjmp(jmp_bootmenu,1);
+ 	}
+ 	offset += err;
+ 	*((int *)loadpoint) = i;
+ 	i -= sizeof(int);
+ 	loadpoint += sizeof(int);
+ 
+ 	/********************************************************/
+ 	/* Load the string table				*/
+ 	/********************************************************/
+ 	printf("+0x%x+0x%x] ", sizeof(int), i);
+ 	while (i > 0) {
+ 		read_size = i > NFS_READ_SIZE ?
+ 				NFS_READ_SIZE : i;
+ 		if ((err = nfs_read(ARP_ROOTSERVER, root_nfs_port,
+ 			&kernel_handle, offset, read_size, loadpoint)) !=
+ 				read_size) {
+ 			if (err < 0) {
+ 				printf("Unable to read string table: ");
+ 				nfs_err(err);
+ 			}
+ 			longjmp(jmp_bootmenu, 1);
+ 		}
+ 		loadpoint += err;
+ 		i -= err;
+ 		offset += err;
+ 	}
+ 
+ 	bootinfo.bi_esymtab = (unsigned long)loadpoint;
+ 
  	printf("entry=0x%X.\n\r",head.a_entry);
  
  		/* Jump to kernel */
  	bootinfo.bi_version = BOOTINFO_VERSION;
  	bootinfo.bi_kernelname = kernel;
  	bootinfo.bi_nfs_diskless = &nfsdiskless;
+ 	bootinfo.bi_size = sizeof(bootinfo);
  	kernelentry = (void *)(head.a_entry & 0x00FFFFFF);
! 	(*kernelentry)(RB_BOOTINFO,NODEV,0,0,0,&bootinfo,0,0,0);
  	printf("*** %s execute failure ***\n",kernel);
  }
  
*** 1.1	1995/04/19 01:22:02
--- start2.S	1995/04/24 11:02:25
***************
*** 54,59 ****
--- 54,64 ----
  START - Where all the fun begins....
  **************************************************************************/
  	.globl	_start
+ #ifdef BOOTNET
+ _start:
+ 	lgdt	gdtarg
+ 	call	_prot_to_real
+ #else
  _start:
  	cli
  	cld
***************
*** 74,79 ****
--- 79,85 ----
          movsb
  	opsize
  	ljmp	$(RELOC>>4),$1f-RELOC		/* Jmp to RELOC:1f */
+ #endif
  1:
  	nop
  	mov	%cs,%ax
***************
*** 330,332 ****
--- 336,407 ----
  gdtarg:
  	.word	0x1f			/* limit */
  	.long	gdt			/* addr */
+ 
+ /*
+  *
+  * get_diskinfo():  return a word that represents the
+  *	max number of sectors and heads and drives for this device
+  *
+  */
+ 
+ 	.globl	_get_diskinfo
+ _get_diskinfo:
+ 	push	%ebp
+ 	mov	%esp, %ebp
+ 	push	%es
+ 	push	%ebx
+ 	push	%ecx
+ 	push	%edx
+ 
+ 	movb	0x8(%ebp), %dl		/* diskinfo(drive #) */
+ 	call	_prot_to_real	/* enter real mode */
+ 
+ 	movb	$0x8, %ah		/* ask for disk info */
+ 
+ 	sti
+ 	int	$0x13
+ 	cli
+ 
+ 	jnc	ok
+ 	/*
+ 	 * Urk.  Call failed.  It is not supported for floppies by old BIOS's.
+ 	 * Guess it's a 15-sector floppy.
+ 	 */
+ 	subb	%ah, %ah		/* %ax = 0 */
+ 	movb	%al, %al
+ 	movb	%ah, %bh		/* %bh = 0 */
+ 	movb	$2, %bl			/* %bl	bits 0-3 = drive type,
+ 						bit    2 = 1.2M */
+ 	movb	$79, %ch		/* max track */
+ 	movb	$15, %cl		/* max sector */
+ 	movb	$1, %dh			/* max head */
+ 	movb	$1, %dl			/* # floppy drives installed */
+ 	/* es:di = parameter table */
+ 	/* carry = 0 */
+ ok:
+ 	opsize
+ 	call	_real_to_prot	/* back to protected mode */
+ 
+ 	/* 
+ 	 * form a longword representing all this gunk:
+ 	 *       6 bit zero
+ 	 *	10 bit cylinder
+ 	 *	 8 bit head
+ 	 *	 8 bit sector
+ 	 */
+ 	movb	%cl, %al		/* Upper two bits of cylinder count */
+ 	andl	$192,%eax	
+ 	leal	0(,%eax,4),%eax		/* << 2 */
+ 	movb	%ch, %al		/* Lower 8 bits */
+ 	sall	$16,%eax		/* << 16 */
+ 	movb	%dh, %ah		/* max head */
+ 	andb	$0x3f, %cl		/* mask of cylinder gunk */
+ 	movb	%cl, %al		/* max sector (and # sectors) */
+ 
+ 	pop	%edx
+ 	pop	%ecx
+ 	pop	%ebx
+ 	pop	%es
+ 	pop	%ebp
+ 	ret
+ 
*** 1.1	1995/04/21 23:33:26
--- Makefile	1995/04/23 15:12:43
***************
*** 19,31 ****
  # changing an option.
  #
  
! PROG=	nb8390.com nb3c509.com nb8390.rom nb3c509.rom
  # Order is very important on the SRCS line for this prog
  SRCS=	start2.S main.c misc.c bootmenu.c rpc.c
  
  BINDIR=		/usr/mdec
  BINMODE=	555
! CFLAGS=		-O2 -DNFS -DROMSIZE=${ROMSIZE} -DRELOC=${RELOCADDR} -DASK_BOOT
  #NS8390=		-DINCLUDE_WD -DWD_DEFAULT_MEM=0xD0000
  NS8390+=	-DINCLUDE_NE -DNE_BASE=0x340
  #NS8390+=	-DINCLUDE_3COM -D_3COM_BASE=0x300
--- 19,32 ----
  # changing an option.
  #
  
! PROG=	nb8390.com nb3c509.com nb8390.rom nb3c509.rom \
! 		nb8390.kernel nb3c509.kernel
  # Order is very important on the SRCS line for this prog
  SRCS=	start2.S main.c misc.c bootmenu.c rpc.c
  
  BINDIR=		/usr/mdec
  BINMODE=	555
! CFLAGS=		-O2 -DNFS -DROMSIZE=${ROMSIZE} -DRELOC=${RELOCADDR} # -DASK_BOOT
  #NS8390=		-DINCLUDE_WD -DWD_DEFAULT_MEM=0xD0000
  NS8390+=	-DINCLUDE_NE -DNE_BASE=0x340
  #NS8390+=	-DINCLUDE_3COM -D_3COM_BASE=0x300
***************
*** 39,49 ****
  ROMSIZE=16384
  RELOCADDR=0x90000
  
! .SUFFIXES:	.ro
  
  .S.ro:
  	${CC} ${CFLAGS} -DBOOTROM -o ${.TARGET} -c ${.IMPSRC}
  
  ns8390.o:	ns8390.c
  	${CC} $(CFLAGS) $(NS8390) -o ${.TARGET} -c $<
  
--- 40,53 ----
  ROMSIZE=16384
  RELOCADDR=0x90000
  
! .SUFFIXES:	.ro .no
  
  .S.ro:
  	${CC} ${CFLAGS} -DBOOTROM -o ${.TARGET} -c ${.IMPSRC}
  
+ .S.no:
+ 	${CC} ${CFLAGS} -DBOOTNET -o ${.TARGET} -c ${.IMPSRC}
+ 
  ns8390.o:	ns8390.c
  	${CC} $(CFLAGS) $(NS8390) -o ${.TARGET} -c $<
  
***************
*** 74,78 ****
--- 78,87 ----
  	size netboot.com
  	dd ibs=32 skip=1 if=netboot.com of=${.TARGET}
  
+ nb8390.kernel: start2.no ${SRCS:N*.h:R:S/$/.o/g} ns8390.o
+ 	$(LD) -Bstatic -Z -T ${RELOCADDR} -o $@ -X ${OBJS:S/start2.o/start2.no/} ns8390.o
+ 
+ nb3c509.kernel: start2.no ${SRCS:N*.h:R:S/$/.o/g} 3c509.o
+ 	$(LD) -Bstatic -Z -T ${RELOCADDR} -o $@ -X ${OBJS:S/start2.o/start2.no/} 3c509.o
  
  .include <bsd.prog.mk>

-- 
Chain Lee
Tandem Computers, Inc.                Voice: (512) 432-8969
14231 Tandem Boulevard                Email: chain@isd.tandem.com
Austin, TX 78728-6699                 Office: 2359



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