From owner-freebsd-stable Wed Aug 28 9:39:41 2002 Delivered-To: freebsd-stable@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A94E737B400 for ; Wed, 28 Aug 2002 09:39:35 -0700 (PDT) Received: from fsp1.physik.ruhr-uni-bochum.de (fsp1.physik.ruhr-uni-bochum.de [134.147.168.26]) by mx1.FreeBSD.org (Postfix) with ESMTP id A8F2843E77 for ; Wed, 28 Aug 2002 09:39:34 -0700 (PDT) (envelope-from strattbo@fsp1.physik.ruhr-uni-bochum.de) Received: (from strattbo@localhost) by fsp1.physik.ruhr-uni-bochum.de (8.11.6/8.11.6/SuSE Linux 0.5) id g7SGdbc28336 for stable@freebsd.org; Wed, 28 Aug 2002 18:39:37 +0200 Date: Wed, 28 Aug 2002 18:39:37 +0200 From: Thomas Stratmann To: stable@freebsd.org Subject: BAD DISKLABEL - BIOS problem w/ workaround Message-ID: <20020828183937.A26822@fsp1.physik.ruhr-uni-bochum.de> Mail-Followup-To: stable@freebsd.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.22.1i Sender: owner-freebsd-stable@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG Hi folks, I post this to the stable list since the workaround I found for my problem involves a bit of source hacking, so this addresses people who are a bit fearless about that. Before I digged into the source and started debugging I queried Google for "BAD DISKLABEL" (see Symptom below) and got no relevant hit, so I hope this post will appear on the search engines and maybe help people with similar problems. It could save a lot of time! Debugging before the kernel is nontrivial... Symptom: /boot/loader (the bootstrap code startet by/after the code which prompts ">> FreeBSD/i386 BOOT" reports "BAD DISKLABEL" for my FreeBSD slice. BUT the involved slice was absolutely intact! (I have another bootable slice; no kernel complaints after booting into it, and mounting the "infected" slice partitions works as it should) It took about two days of hacking to find out that: (skip this if you need to get your bootstrap work NOW!) * the output of "BAD DISKLABEL" is only triggered by checking for the magic key in the label block. But: I verified that the label block was in the right position and had the right magic at the right offset! * /boot/loader tries to load the right block from disk before checking the magic (actually, I only went so far as to see that the code which prepares and runs the real-mode BIOS call uses the right cylinder/ head/sector parameters, I did not check if the registers were correctly assigned. But I believe it should be VERY improbable to have the registers wrong, since this must be a well-known issue. Am I wrong here?) * the block actually read comes from somewhere else on the disk, probably sector # 256, starting from 1 (I enabled hexdumping of the read block to find this out), but definitely not from the second sector from the beginning of the slice. This all lead me to the assumption that my BIOS must be buggy. By the way: I have an AWARD BIOS and stable-source from two days ago. If your symptoms are similar, the following might work out as it did for me: FIX: Replace your BIOS with a correct one (I did not try this ;-) WORKAROUND: You need another bootable system, of course! I feel I have to warn that the method described here is rather dirty. Please ensure that your "infected" slice is really OK! Back up /boot/loader ! Edit /usr/src/sys/boot/i386/libi386/biosdisk.c : Look for the function "bd_read(...", and inside it, the line if (cyl > 1023) { Replace (or: duplicate;comment one out;change the other) to: if (1) { Then cd to /usr/src/sys/boot and type make clean all install or make and install your (complete) world instead. This will replace your /boot/loader with a version which might work for you. Assuming you do this from inside a system which you can boot into without any problems, mount the problem system and copy /boot/loader over. I also suggest you keep a spare copy like /boot/loader.LBA which does not get overwritten by make installworld. I also keep a copy in my linux system since I use GRUB in my boot sector which can access the linux filesystems. A few words of explanation: /boot/loader loads blocks from disk using cylinder/head/sector parameters for BIOS by default. Only when this is not possible (i.e. cyl > 1023) it uses LBA addressing, if available. The above "patch" makes it use LBA mode in every situation. The BIOS bug seems to appear in C/H/S mode only, so I'm fine with this. Scope for the workaround: Your BIOS needs to support LBA mode (means it can theoretically boot into partitions beyond cylinder 1023), otherwise you're lost. As you can see in the paths, this applies to i386 platform. I hope this is helpful for those who need it and not too annoying for the rest. Yours Thomas Stratmann thomas.stratmann@ruhr-uni-bochum.de To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-stable" in the body of the message