Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 30 Oct 2014 15:18:40 -0700
From:      Nathan Whitehorn <nwhitehorn@freebsd.org>
To:        Doug Ambrisko <ambrisko@freebsd.org>, 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
Message-ID:  <5452B940.1090609@freebsd.org>
In-Reply-To: <201410301552.s9UFq1WV098951@svn.freebsd.org>
References:  <201410301552.s9UFq1WV098951@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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 <partition>
>    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);
>




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