Return to BSD News archive
Path: sserve!manuel.anu.edu.au!munnari.oz.au!hp9000.csc.cuhk.hk!saimiri.primate.wisc.edu!zaphod.mps.ohio-state.edu!cs.utexas.edu!sun-barr!olivea!charnel!rat!ucselx!crash!fpm From: fpm@crash.cts.com (Frank Maclachlan) Newsgroups: comp.unix.bsd Subject: Re: [386BSD] Troublesome SCSI problems with VL-BUS machine Summary: Patch for 386bsd stage 1 floppy boot Keywords: 386BSD floppy boot patch Message-ID: <1992Dec08.132820.29435@crash> Date: 8 Dec 92 21:28:19 GMT References: <1992Dec1.185127.4785@umr.edu> <1992Dec03.193746.7352@kithrup.COM> Organization: CTS Network Services (crash, ctsnet), El Cajon, CA Lines: 114 In article <1992Dec03.193746.7352@kithrup.COM> wilson@moria.cygnus.com (jim Wilson) writes: >This motherboard won't boot from any available floppy boot disk. I believe >that this is a bug in the 386bsd floppy disk bootblocks, but don't know enough >about pc hardware (yet!) to fix it myself. > >I know of two ways to boot 386bsd from a floppy on this motherboard: >1) From the CMOS screen, change the LPT1 IRQ from 7 to 5. (And while you're > at it, turn off the shadow bios too.) You can now boot from any 386bsd > boot floppy. After installing 386bsd on your hard disk, change the LPT1 > IRQ back to 7 so you can use it. Simply disabling LPT1 does not work, you > must change its IRQ. Also, note, if you ever want to boot from a floppy > again, you must go toggle the IRQ again. >2) Edit a dist.fs file with emacs, search for `<^F', and change the ^F to ^G. > Write the file to a floppy, and you can now boot from it. (This changes > an instruction in the boot blocks (fdbootblk.c) from cmpb $0x6,%al to > cmpb $0x7,%al. This is a horrible hack, but it works.) You should also > do the same thing to a fixit.fs file. The relevant code from the stage 1 floppy boot, '/sys/i386/stand/fdbootblk.c', is polling for an interrupt from the floppy disk controller on interrupt level 6 (line 251). Jim's patch modifies the poll loop to wait for an interrupt on IRQ 7 (normally the first line printer); this seems like the wrong thing to do. The problem, I think, is in line 179 wo enable interrupts *only* from the floppy controller. I suspect that Jim's system is generating *lots* of interrupts from the printer port. Also, Ákihiro Higashi, in article <1992Sep11.051554.29192@mlab.nttdocomo.co.jp>, reported that he had to change 3rd & 4th "NOP"s to "JMP .+2"s on his COMPAQ 486/50L. 'NOP' is a delay macro which alters the AL register. The specific ange 3rd & 4th "NOP"s to "JMP .+2"s on his COMPAQ 486/50L. 'NOP' is a delay macro which alters the AL register. The specific instances mentioned involve code resetting the DMA controller's first/last flip-flop and then programming the DMA controller's mode register. The initialization byte for the mode register is clobbered by a NOP (I am amazed that the boot works on most systems!). This can be fixed by rearranging the code slightly. I have not had a problem w/ the floppy boot, so I can't really test the efficacy of my changes; I can still boot from the floppy, so I don't think I've broken anything. I would appreciate any feedback from those of you who have had problems. If it works, I'll send a bug report to Nate Williams for inclusion in the buglist. The patch to the boot follows: *** fdbootblk.c.ORIG Sun Jun 21 23:56:47 1992 --- fdbootblk.c Fri Nov 13 22:46:17 1992 *************** *** 176,182 **** outb %al,$0x20 NOP ! movb $0x07,%al outb %al,$0x21 NOP 8: --- 176,182 ---- outb %al,$0x20 NOP ! movb $0xbf,%al # enable floppy interrupt, mask out rest outb %al,$0x21 NOP 8: *************** *** 185,196 **** /* Set read/write bytes */ xorl %edx,%edx ! movb $0x0c,%dl # outb(0xC,0x46); outb(0xB,0x46); ! movb $0x46,%al ! outb %al,%dx NOP decb %dx ! outb %al,%dx /* Send start address */ movb $0x04,%dl # outb(0x4, addr); --- 185,196 ---- /* Set read/write bytes */ xorl %edx,%edx ! movb $0x0c,%dl # outb(0xC,junk); outb(0xB,0x46); ! outb %al,%dx # reset DMA controller first/last flip-flop NOP decb %dx ! movb $0x46,%al # single mode, write mem, chan 2 ! outb %al,%dx # output DMA controller mode byte /* Send start address */ movb $0x04,%dl # outb(0x4, addr); -- Fortunately, these changes do not shift the boot code, so a binary patch is possible. The changes to the first sector on the disk (fixit.fs or dist.fs) are given below: Offset Old New ------ ---- ---- 0x00e1 0x07 0xbf 0x00f2 0xb0 0xee 0x00f3 0x46 0xe4 0x00f4 0xee 0x84 0x00f5 0xe4 0x4a 0x00f6 0x84 0xb0 0x00f7 0x4a 0x46 Hope this helps, Frank -- UUCP: {hplabs!hp-sdd ucsd nosc}!crash!fpm INET: fpm@crash.cts.com