From owner-svn-src-head@FreeBSD.ORG Thu Oct 30 22:18:50 2014 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 074152CB; Thu, 30 Oct 2014 22:18:50 +0000 (UTC) Received: from c.mail.sonic.net (c.mail.sonic.net [64.142.111.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id D9F19AD4; Thu, 30 Oct 2014 22:18:49 +0000 (UTC) Received: from aurora.physics.berkeley.edu (aurora.Physics.Berkeley.EDU [128.32.117.67]) (authenticated bits=0) by c.mail.sonic.net (8.14.9/8.14.9) with ESMTP id s9UMIenU021663 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Thu, 30 Oct 2014 15:18:41 -0700 Message-ID: <5452B940.1090609@freebsd.org> Date: Thu, 30 Oct 2014 15:18:40 -0700 From: Nathan Whitehorn User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Doug Ambrisko , src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r273865 - in head: sbin/fsck_msdosfs sys/boot/amd64/boot1.efi References: <201410301552.s9UFq1WV098951@svn.freebsd.org> In-Reply-To: <201410301552.s9UFq1WV098951@svn.freebsd.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Sonic-CAuth: UmFuZG9tSVZnTPuQG0D/ijmDfOCi8A8ruBFO5wSSymW02lkfHCSoiH01fLNO9+CQOOcSzf8NKC2uVKXYVPtkXIIWrujFzh6n1XntWfA3xXk= X-Sonic-ID: C;4j6Us4Jg5BG90IkFBSAIFQ== M;HK4ItIJg5BG90IkFBSAIFQ== X-Spam-Flag: No X-Sonic-Spam-Details: 0.0/5.0 by cerberusd X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Oct 2014 22:18:50 -0000 You may want to change the generation of boot1.efifat to have a 4096 byte sector size. We also need to find out if all EFI BIOSes can deal with 4096-byte FAT filesystems on 512-byte disks. -Nathan On 10/30/14 08:52, Doug Ambrisko wrote: > Author: ambrisko > Date: Thu Oct 30 15:52:01 2014 > New Revision: 273865 > URL: https://svnweb.freebsd.org/changeset/base/273865 > > Log: > Make UEFI booting of 4Kn disks work: > - convert boot1.efi to corrrectly calculate the lba for what the > media reports and convert the size based on what FreeBSD uses. > The existing code would use the 512 byte lba and convert the > size using 4K byte size. > - make fsck_msdosfs read the boot block as 4K so the read doesn't > fail on a 4Kn drive since FreeBSD will error out parition reads > of a block. Make the bpbBytesPerSec check a multiple of 512 since > it can be 512 or 4K depending on the disk. This allows fsck to > pass checking the EFI partition on a 4Kn disk. > > To create the EFI file system I used: > newfs_msdos -F 32 -S 4096 -c 1 -m 0xf8 > This works for booting 512 and 4Kn disks. > > Caveat is that loader.efi cannot read the 4Kn EFI partition. This isn't > critical right now since boot1.efi will read loader.efi from the ufs > partition. It looks like loader.efi can be fixed via making some of the > 512 bytes reads more flexible. loader.efi doesn't have trouble reading > the ufs partition. This is probably a simple fix. > > I now have FreeBSD installed on a system with 4Kn drives and tested the > same code works on 512. > > MFC after: 1 week > > Modified: > head/sbin/fsck_msdosfs/boot.c > head/sbin/fsck_msdosfs/dosfs.h > head/sys/boot/amd64/boot1.efi/boot1.c > > Modified: head/sbin/fsck_msdosfs/boot.c > ============================================================================== > --- head/sbin/fsck_msdosfs/boot.c Thu Oct 30 15:41:25 2014 (r273864) > +++ head/sbin/fsck_msdosfs/boot.c Thu Oct 30 15:52:01 2014 (r273865) > @@ -181,7 +181,7 @@ readboot(int dosfs, struct bootblock *bo > boot->bpbResSectors + boot->bpbFATs * boot->FATsecs - > CLUST_FIRST * boot->bpbSecPerClust; > > - if (boot->bpbBytesPerSec % DOSBOOTBLOCKSIZE != 0) { > + if (boot->bpbBytesPerSec % DOSBOOTBLOCKSIZE_REAL != 0) { > pfatal("Invalid sector size: %u", boot->bpbBytesPerSec); > return FSFATAL; > } > > Modified: head/sbin/fsck_msdosfs/dosfs.h > ============================================================================== > --- head/sbin/fsck_msdosfs/dosfs.h Thu Oct 30 15:41:25 2014 (r273864) > +++ head/sbin/fsck_msdosfs/dosfs.h Thu Oct 30 15:52:01 2014 (r273865) > @@ -30,7 +30,9 @@ > #ifndef DOSFS_H > #define DOSFS_H > > -#define DOSBOOTBLOCKSIZE 512 > +/* support 4Kn disk reads */ > +#define DOSBOOTBLOCKSIZE_REAL 512 > +#define DOSBOOTBLOCKSIZE 4096 > > typedef u_int32_t cl_t; /* type holding a cluster number */ > > > Modified: head/sys/boot/amd64/boot1.efi/boot1.c > ============================================================================== > --- head/sys/boot/amd64/boot1.efi/boot1.c Thu Oct 30 15:41:25 2014 (r273864) > +++ head/sys/boot/amd64/boot1.efi/boot1.c Thu Oct 30 15:52:01 2014 (r273865) > @@ -168,9 +168,12 @@ static int > dskread(void *buf, u_int64_t lba, int nblk) > { > EFI_STATUS status; > + int size; > > + lba = lba / (bootdev->Media->BlockSize / DEV_BSIZE); > + size = nblk * DEV_BSIZE; > status = bootdev->ReadBlocks(bootdev, bootdev->Media->MediaId, lba, > - nblk * bootdev->Media->BlockSize, buf); > + size, buf); > > if (EFI_ERROR(status)) > return (-1); >