Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Jan 2016 19:03:11 +0000
From:      krad <kraduk@gmail.com>
To:        Steven Hartland <smh@freebsd.org>
Cc:        src-committers@freebsd.org, svn-src-all@freebsd.org,  svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   Re: svn commit: r294999 - in stable/10/sys/boot/efi: boot1 include libefi loader
Message-ID:  <CALfReyf5-rvdSZS7M0xEe9PGFqSshN=7S4Hzxc3in%2Bqa-23cww@mail.gmail.com>
In-Reply-To: <201601281724.u0SHOfgn050280@repo.freebsd.org>
References:  <201601281724.u0SHOfgn050280@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Just built 10-stable and upgraded my intel NUC 2820 and it boots fine on
the rootonzfs pool. This is on the old v32 firmware. I will test on the
newer firmware later tonight.

On 28 January 2016 at 17:24, Steven Hartland <smh@freebsd.org> wrote:

> Author: smh
> Date: Thu Jan 28 17:24:40 2016
> New Revision: 294999
> URL: https://svnweb.freebsd.org/changeset/base/294999
>
> Log:
>   MFC r294068, r294265
>
>   MFC r294068:
>   Add EFI ZFS boot support
>
>   MFC r294265:
>   Fix broken DPRINTF and wire up EFI_DEBUG so -DEFI_DEBUG to make works.
>
>   Relnotes:     Yes
>   Sponsored by: Multiplay
>
> Added:
>   stable/10/sys/boot/efi/boot1/zfs_module.c
>      - copied, changed from r294068, head/sys/boot/efi/boot1/zfs_module.c
> Modified:
>   stable/10/sys/boot/efi/boot1/Makefile
>   stable/10/sys/boot/efi/boot1/boot1.c
>   stable/10/sys/boot/efi/boot1/boot_module.h
>   stable/10/sys/boot/efi/include/efilib.h
>   stable/10/sys/boot/efi/libefi/handles.c
>   stable/10/sys/boot/efi/loader/Makefile
>   stable/10/sys/boot/efi/loader/conf.c
>   stable/10/sys/boot/efi/loader/devicename.c
>   stable/10/sys/boot/efi/loader/main.c
> Directory Properties:
>   stable/10/   (props changed)
>
> Modified: stable/10/sys/boot/efi/boot1/Makefile
>
> ==============================================================================
> --- stable/10/sys/boot/efi/boot1/Makefile       Thu Jan 28 16:58:49 2016
>       (r294998)
> +++ stable/10/sys/boot/efi/boot1/Makefile       Thu Jan 28 17:24:40 2016
>       (r294999)
> @@ -10,8 +10,22 @@ PROG=                boot1.sym
>  INTERNALPROG=
>  WARNS?=                6
>
> +.if ${MK_ZFS} != "no"
> +# Disable warnings that are currently incompatible with the zfs boot code
> +CWARNFLAGS.zfs_module.c += -Wno-array-bounds
> +CWARNFLAGS.zfs_module.c += -Wno-cast-align
> +CWARNFLAGS.zfs_module.c += -Wno-cast-qual
> +CWARNFLAGS.zfs_module.c += -Wno-missing-prototypes
> +CWARNFLAGS.zfs_module.c += -Wno-sign-compare
> +CWARNFLAGS.zfs_module.c += -Wno-unused-parameter
> +CWARNFLAGS.zfs_module.c += -Wno-unused-function
> +.endif
> +
>  # architecture-specific loader code
>  SRCS=  boot1.c reloc.c start.S ufs_module.c
> +.if ${MK_ZFS} != "no"
> +SRCS+=         zfs_module.c
> +.endif
>
>  CFLAGS+=       -fPIC
>  CFLAGS+=       -I.
> @@ -20,6 +34,15 @@ CFLAGS+=     -I${.CURDIR}/../include/${MACHI
>  CFLAGS+=       -I${.CURDIR}/../../../contrib/dev/acpica/include
>  CFLAGS+=       -I${.CURDIR}/../../..
>  CFLAGS+=       -DEFI_UFS_BOOT
> +.ifdef(EFI_DEBUG)
> +CFLAGS+=       -DEFI_DEBUG
> +.endif
> +
> +.if ${MK_ZFS} != "no"
> +CFLAGS+=       -I${.CURDIR}/../../zfs/
> +CFLAGS+=       -I${.CURDIR}/../../../cddl/boot/zfs/
> +CFLAGS+=       -DEFI_ZFS_BOOT
> +.endif
>
>  # Always add MI sources and REGULAR efi loader bits
>  .PATH:         ${.CURDIR}/../loader/arch/${MACHINE}
>
> Modified: stable/10/sys/boot/efi/boot1/boot1.c
>
> ==============================================================================
> --- stable/10/sys/boot/efi/boot1/boot1.c        Thu Jan 28 16:58:49 2016
>       (r294998)
> +++ stable/10/sys/boot/efi/boot1/boot1.c        Thu Jan 28 17:24:40 2016
>       (r294999)
> @@ -36,6 +36,9 @@ __FBSDID("$FreeBSD$");
>
>  static const boot_module_t *boot_modules[] =
>  {
> +#ifdef EFI_ZFS_BOOT
> +       &zfs_module,
> +#endif
>  #ifdef EFI_UFS_BOOT
>         &ufs_module
>  #endif
>
> Modified: stable/10/sys/boot/efi/boot1/boot_module.h
>
> ==============================================================================
> --- stable/10/sys/boot/efi/boot1/boot_module.h  Thu Jan 28 16:58:49 2016
>       (r294998)
> +++ stable/10/sys/boot/efi/boot1/boot_module.h  Thu Jan 28 17:24:40 2016
>       (r294999)
> @@ -36,12 +36,9 @@
>  #include <eficonsctl.h>
>
>  #ifdef EFI_DEBUG
> -#define DPRINTF(fmt, args...) \
> -        do { \
> -                printf(fmt, ##args) \
> -        } while (0)
> +#define DPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
>  #else
> -#define DPRINTF(fmt, args...) {}
> +#define DPRINTF(fmt, ...) {}
>  #endif
>
>  /* EFI device info */
> @@ -97,6 +94,9 @@ typedef struct boot_module_t
>  #ifdef EFI_UFS_BOOT
>  extern const boot_module_t ufs_module;
>  #endif
> +#ifdef EFI_ZFS_BOOT
> +extern const boot_module_t zfs_module;
> +#endif
>
>  /* Functions available to modules. */
>  extern void add_device(dev_info_t **devinfop, dev_info_t *devinfo);
>
> Copied and modified: stable/10/sys/boot/efi/boot1/zfs_module.c (from
> r294068, head/sys/boot/efi/boot1/zfs_module.c)
>
> ==============================================================================
> --- head/sys/boot/efi/boot1/zfs_module.c        Fri Jan 15 02:33:47 2016
>       (r294068, copy source)
> +++ stable/10/sys/boot/efi/boot1/zfs_module.c   Thu Jan 28 17:24:40 2016
>       (r294999)
> @@ -53,9 +53,9 @@ vdev_read(vdev_t *vdev, void *priv, off_
>         status = devinfo->dev->ReadBlocks(devinfo->dev,
>             devinfo->dev->Media->MediaId, lba, bytes, buf);
>         if (status != EFI_SUCCESS) {
> -               DPRINTF("vdev_read: failed dev: %p, id: %u, lba: %lu,
> size: %d,"
> +               DPRINTF("vdev_read: failed dev: %p, id: %u, lba: %zu,
> size: %zu,"
>                      " status: %lu\n", devinfo->dev,
> -                    devinfo->dev->Media->MediaId, lba, size,
> +                    devinfo->dev->Media->MediaId, lba, bytes,
>                      EFI_ERROR_CODE(status));
>                 return (-1);
>         }
>
> Modified: stable/10/sys/boot/efi/include/efilib.h
>
> ==============================================================================
> --- stable/10/sys/boot/efi/include/efilib.h     Thu Jan 28 16:58:49 2016
>       (r294998)
> +++ stable/10/sys/boot/efi/include/efilib.h     Thu Jan 28 17:24:40 2016
>       (r294999)
> @@ -42,7 +42,8 @@ void *efi_get_table(EFI_GUID *tbl);
>
>  int efi_register_handles(struct devsw *, EFI_HANDLE *, EFI_HANDLE *, int);
>  EFI_HANDLE efi_find_handle(struct devsw *, int);
> -int efi_handle_lookup(EFI_HANDLE, struct devsw **, int *);
> +int efi_handle_lookup(EFI_HANDLE, struct devsw **, int *,  uint64_t *);
> +int efi_handle_update_dev(EFI_HANDLE, struct devsw *, int, uint64_t);
>
>  int efi_status_to_errno(EFI_STATUS);
>  time_t efi_time(EFI_TIME *);
>
> Modified: stable/10/sys/boot/efi/libefi/handles.c
>
> ==============================================================================
> --- stable/10/sys/boot/efi/libefi/handles.c     Thu Jan 28 16:58:49 2016
>       (r294998)
> +++ stable/10/sys/boot/efi/libefi/handles.c     Thu Jan 28 17:24:40 2016
>       (r294999)
> @@ -35,6 +35,7 @@ struct entry {
>         EFI_HANDLE alias;
>         struct devsw *dev;
>         int unit;
> +       uint64_t extra;
>  };
>
>  struct entry *entry;
> @@ -79,7 +80,7 @@ efi_find_handle(struct devsw *dev, int u
>  }
>
>  int
> -efi_handle_lookup(EFI_HANDLE h, struct devsw **dev, int *unit)
> +efi_handle_lookup(EFI_HANDLE h, struct devsw **dev, int *unit, uint64_t
> *extra)
>  {
>         int idx;
>
> @@ -90,7 +91,28 @@ efi_handle_lookup(EFI_HANDLE h, struct d
>                         *dev = entry[idx].dev;
>                 if (unit != NULL)
>                         *unit = entry[idx].unit;
> +               if (extra != NULL)
> +                       *extra = entry[idx].extra;
>                 return (0);
>         }
>         return (ENOENT);
>  }
> +
> +int
> +efi_handle_update_dev(EFI_HANDLE h, struct devsw *dev, int unit,
> +    uint64_t guid)
> +{
> +       int idx;
> +
> +       for (idx = 0; idx < nentries; idx++) {
> +               if (entry[idx].handle != h)
> +                       continue;
> +               entry[idx].dev = dev;
> +               entry[idx].unit = unit;
> +               entry[idx].alias = NULL;
> +               entry[idx].extra = guid;
> +               return (0);
> +       }
> +
> +       return (ENOENT);
> +}
>
> Modified: stable/10/sys/boot/efi/loader/Makefile
>
> ==============================================================================
> --- stable/10/sys/boot/efi/loader/Makefile      Thu Jan 28 16:58:49 2016
>       (r294998)
> +++ stable/10/sys/boot/efi/loader/Makefile      Thu Jan 28 17:24:40 2016
>       (r294999)
> @@ -20,6 +20,16 @@ SRCS=        autoload.c \
>         smbios.c \
>         vers.c
>
> +.if ${MK_ZFS} != "no"
> +SRCS+=         zfs.c
> +.PATH:         ${.CURDIR}/../../zfs
> +
> +# Disable warnings that are currently incompatible with the zfs boot code
> +CWARNFLAGS.zfs.c+=     -Wno-sign-compare
> +CWARNFLAGS.zfs.c+=     -Wno-array-bounds
> +CWARNFLAGS.zfs.c+=     -Wno-missing-prototypes
> +.endif
> +
>  .PATH: ${.CURDIR}/arch/${MACHINE}
>  # For smbios.c
>  .PATH: ${.CURDIR}/../../i386/libi386
> @@ -33,6 +43,11 @@ CFLAGS+=     -I${.CURDIR}/../include/${MACHI
>  CFLAGS+=       -I${.CURDIR}/../../../contrib/dev/acpica/include
>  CFLAGS+=       -I${.CURDIR}/../../..
>  CFLAGS+=       -I${.CURDIR}/../../i386/libi386
> +.if ${MK_ZFS} != "no"
> +CFLAGS+=       -I${.CURDIR}/../../zfs
> +CFLAGS+=       -I${.CURDIR}/../../../cddl/boot/zfs
> +CFLAGS+=       -DEFI_ZFS_BOOT
> +.endif
>  CFLAGS+=       -DNO_PCI -DEFI
>
>  .if ${MK_FORTH} != "no"
>
> Modified: stable/10/sys/boot/efi/loader/conf.c
>
> ==============================================================================
> --- stable/10/sys/boot/efi/loader/conf.c        Thu Jan 28 16:58:49 2016
>       (r294998)
> +++ stable/10/sys/boot/efi/loader/conf.c        Thu Jan 28 17:24:40 2016
>       (r294999)
> @@ -31,14 +31,23 @@ __FBSDID("$FreeBSD$");
>  #include <bootstrap.h>
>  #include <efi.h>
>  #include <efilib.h>
> +#ifdef EFI_ZFS_BOOT
> +#include <libzfs.h>
> +#endif
>
>  struct devsw *devsw[] = {
>         &efipart_dev,
>         &efinet_dev,
> +#ifdef EFI_ZFS_BOOT
> +       &zfs_dev,
> +#endif
>         NULL
>  };
>
>  struct fs_ops *file_system[] = {
> +#ifdef EFI_ZFS_BOOT
> +       &zfs_fsops,
> +#endif
>         &dosfs_fsops,
>         &ufs_fsops,
>         &cd9660_fsops,
>
> Modified: stable/10/sys/boot/efi/loader/devicename.c
>
> ==============================================================================
> --- stable/10/sys/boot/efi/loader/devicename.c  Thu Jan 28 16:58:49 2016
>       (r294998)
> +++ stable/10/sys/boot/efi/loader/devicename.c  Thu Jan 28 17:24:40 2016
>       (r294999)
> @@ -33,6 +33,9 @@ __FBSDID("$FreeBSD$");
>  #include <sys/disklabel.h>
>  #include <sys/param.h>
>  #include <bootstrap.h>
> +#ifdef EFI_ZFS_BOOT
> +#include <libzfs.h>
> +#endif
>
>  #include <efi.h>
>  #include <efilib.h>
> @@ -104,6 +107,23 @@ efi_parsedev(struct devdesc **dev, const
>
>         np = devspec + strlen(dv->dv_name);
>
> +#ifdef EFI_ZFS_BOOT
> +       if (dv->dv_type == DEVT_ZFS) {
> +               int err;
> +
> +               idev = malloc(sizeof(struct zfs_devdesc));
> +               if (idev == NULL)
> +                       return (ENOMEM);
> +
> +               err = zfs_parsedev((struct zfs_devdesc*)idev, np, path);
> +               if (err != 0) {
> +                       free(idev);
> +                       return (err);
> +               }
> +               *dev = idev;
> +               cp = strchr(np + 1, ':');
> +       } else
> +#endif
>         {
>                 idev = malloc(sizeof(struct devdesc));
>                 if (idev == NULL)
> @@ -143,6 +163,10 @@ efi_fmtdev(void *vdev)
>         static char buf[SPECNAMELEN + 1];
>
>         switch(dev->d_type) {
> +#ifdef EFI_ZFS_BOOT
> +       case DEVT_ZFS:
> +               return (zfs_fmtdev(dev));
> +#endif
>         case DEVT_NONE:
>                 strcpy(buf, "(no device)");
>                 break;
>
> Modified: stable/10/sys/boot/efi/loader/main.c
>
> ==============================================================================
> --- stable/10/sys/boot/efi/loader/main.c        Thu Jan 28 16:58:49 2016
>       (r294998)
> +++ stable/10/sys/boot/efi/loader/main.c        Thu Jan 28 17:24:40 2016
>       (r294999)
> @@ -39,6 +39,10 @@ __FBSDID("$FreeBSD$");
>  #include <bootstrap.h>
>  #include <smbios.h>
>
> +#ifdef EFI_ZFS_BOOT
> +#include <libzfs.h>
> +#endif
> +
>  #include "loader_efi.h"
>
>  extern char bootprog_name[];
> @@ -60,6 +64,10 @@ EFI_GUID hoblist = HOB_LIST_TABLE_GUID;
>  EFI_GUID memtype = MEMORY_TYPE_INFORMATION_TABLE_GUID;
>  EFI_GUID debugimg = DEBUG_IMAGE_INFO_TABLE_GUID;
>
> +#ifdef EFI_ZFS_BOOT
> +static void efi_zfs_probe(void);
> +#endif
> +
>  /*
>   * Need this because EFI uses UTF-16 unicode string constants, but we
>   * use UTF-8. We can't use printf due to the possiblity of \0 and we
> @@ -82,6 +90,7 @@ main(int argc, CHAR16 *argv[])
>         EFI_GUID *guid;
>         int i, j, vargood, unit;
>         struct devsw *dev;
> +       uint64_t pool_guid;
>         UINTN k;
>
>         archsw.arch_autoload = efi_autoload;
> @@ -89,6 +98,10 @@ main(int argc, CHAR16 *argv[])
>         archsw.arch_copyin = efi_copyin;
>         archsw.arch_copyout = efi_copyout;
>         archsw.arch_readin = efi_readin;
> +#ifdef EFI_ZFS_BOOT
> +       /* Note this needs to be set before ZFS init. */
> +       archsw.arch_zfs_probe = efi_zfs_probe;
> +#endif
>
>         /*
>          * XXX Chicken-and-egg problem; we want to have console output
> @@ -167,10 +180,27 @@ main(int argc, CHAR16 *argv[])
>          */
>         BS->SetWatchdogTimer(0, 0, 0, NULL);
>
> -       if (efi_handle_lookup(img->DeviceHandle, &dev, &unit) != 0)
> +       if (efi_handle_lookup(img->DeviceHandle, &dev, &unit, &pool_guid)
> != 0)
>                 return (EFI_NOT_FOUND);
>
>         switch (dev->dv_type) {
> +#ifdef EFI_ZFS_BOOT
> +       case DEVT_ZFS: {
> +               struct zfs_devdesc currdev;
> +
> +               currdev.d_dev = dev;
> +               currdev.d_unit = unit;
> +               currdev.d_type = currdev.d_dev->dv_type;
> +               currdev.d_opendata = NULL;
> +               currdev.pool_guid = pool_guid;
> +               currdev.root_guid = 0;
> +               env_setenv("currdev", EV_VOLATILE, efi_fmtdev(&currdev),
> +                          efi_setcurrdev, env_nounset);
> +               env_setenv("loaddev", EV_VOLATILE, efi_fmtdev(&currdev),
> env_noset,
> +                          env_nounset);
> +               break;
> +       }
> +#endif
>         default: {
>                 struct devdesc currdev;
>
> @@ -452,3 +482,46 @@ command_nvram(int argc, char *argv[])
>
>         return (CMD_OK);
>  }
> +
> +#ifdef EFI_ZFS_BOOT
> +COMMAND_SET(lszfs, "lszfs", "list child datasets of a zfs dataset",
> +    command_lszfs);
> +
> +static int
> +command_lszfs(int argc, char *argv[])
> +{
> +       int err;
> +
> +       if (argc != 2) {
> +               command_errmsg = "wrong number of arguments";
> +               return (CMD_ERROR);
> +       }
> +
> +       err = zfs_list(argv[1]);
> +       if (err != 0) {
> +               command_errmsg = strerror(err);
> +               return (CMD_ERROR);
> +       }
> +       return (CMD_OK);
> +}
> +#endif
> +
> +#ifdef EFI_ZFS_BOOT
> +static void
> +efi_zfs_probe(void)
> +{
> +       EFI_HANDLE h;
> +       u_int unit;
> +       int i;
> +       char dname[SPECNAMELEN + 1];
> +       uint64_t guid;
> +
> +       unit = 0;
> +       h = efi_find_handle(&efipart_dev, 0);
> +       for (i = 0; h != NULL; h = efi_find_handle(&efipart_dev, ++i)) {
> +               snprintf(dname, sizeof(dname), "%s%d:",
> efipart_dev.dv_name, i);
> +               if (zfs_probe_dev(dname, &guid) == 0)
> +                       (void)efi_handle_update_dev(h, &zfs_dev, unit++,
> guid);
> +       }
> +}
> +#endif
> _______________________________________________
> svn-src-stable-10@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
> To unsubscribe, send any mail to "
> svn-src-stable-10-unsubscribe@freebsd.org"
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CALfReyf5-rvdSZS7M0xEe9PGFqSshN=7S4Hzxc3in%2Bqa-23cww>