svn commit: r273865 - in head: sbin/fsck_msdosfs sys/boot/amd64/boot1.efi
Nathan Whitehorn
nwhitehorn at freebsd.org
Thu Oct 30 22:18:50 UTC 2014
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);
>
More information about the svn-src-head
mailing list