Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F148559887
D12287.id32838.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D12287.id32838.diff
View Options
Index: sys/boot/efi/include/efilib.h
===================================================================
--- sys/boot/efi/include/efilib.h
+++ sys/boot/efi/include/efilib.h
@@ -61,6 +61,7 @@
} pdinfo_t;
pdinfo_list_t *efiblk_get_pdinfo_list(struct devsw *dev);
+pdinfo_t *efiblk_get_pdinfo(struct devdesc *dev);
void *efi_get_table(EFI_GUID *tbl);
Index: sys/boot/efi/include/efizfs.h
===================================================================
--- sys/boot/efi/include/efizfs.h
+++ sys/boot/efi/include/efizfs.h
@@ -45,6 +45,7 @@
extern void efi_zfs_probe(void);
extern zfsinfo_list_t *efizfs_get_zfsinfo_list(void);
+extern EFI_HANDLE efizfs_get_handle_by_guid(uint64_t);
#endif
Index: sys/boot/efi/libefi/efipart.c
===================================================================
--- sys/boot/efi/libefi/efipart.c
+++ sys/boot/efi/libefi/efipart.c
@@ -101,16 +101,33 @@
static EFI_HANDLE *efipart_handles = NULL;
static UINTN efipart_nhandles = 0;
-static pdinfo_t *
-efiblk_get_pdinfo(pdinfo_list_t *pdi, int unit)
+pdinfo_list_t *
+efiblk_get_pdinfo_list(struct devsw *dev)
{
- pdinfo_t *pd;
+ if (dev->dv_type == DEVT_DISK)
+ return (&hdinfo);
+ if (dev->dv_type == DEVT_CD)
+ return (&cdinfo);
+ if (dev->dv_type == DEVT_FD)
+ return (&fdinfo);
+ return (NULL);
+}
+pdinfo_t *
+efiblk_get_pdinfo(struct devdesc *dev)
+{
+ pdinfo_list_t *pdi;
+ pdinfo_t *pd = NULL;
+
+ pdi = efiblk_get_pdinfo_list(dev->d_dev);
+ if (pdi == NULL)
+ return (pd);
+
STAILQ_FOREACH(pd, pdi, pd_link) {
- if (pd->pd_unit == unit)
+ if (pd->pd_unit == dev->d_unit)
return (pd);
}
- return (NULL);
+ return (pd);
}
static int
@@ -671,24 +688,11 @@
return (efipart_print_common(&efipart_hddev, &hdinfo, verbose));
}
-pdinfo_list_t *
-efiblk_get_pdinfo_list(struct devsw *dev)
-{
- if (dev->dv_type == DEVT_DISK)
- return (&hdinfo);
- if (dev->dv_type == DEVT_CD)
- return (&cdinfo);
- if (dev->dv_type == DEVT_FD)
- return (&fdinfo);
- return (NULL);
-}
-
static int
efipart_open(struct open_file *f, ...)
{
va_list args;
struct disk_devdesc *dev;
- pdinfo_list_t *pdi;
pdinfo_t *pd;
EFI_BLOCK_IO *blkio;
EFI_STATUS status;
@@ -699,11 +703,7 @@
if (dev == NULL)
return (EINVAL);
- pdi = efiblk_get_pdinfo_list(dev->d_dev);
- if (pdi == NULL)
- return (EINVAL);
-
- pd = efiblk_get_pdinfo(pdi, dev->d_unit);
+ pd = efiblk_get_pdinfo((struct devdesc *)dev);
if (pd == NULL)
return (EIO);
@@ -734,17 +734,13 @@
efipart_close(struct open_file *f)
{
struct disk_devdesc *dev;
- pdinfo_list_t *pdi;
pdinfo_t *pd;
dev = (struct disk_devdesc *)(f->f_devdata);
if (dev == NULL)
return (EINVAL);
- pdi = efiblk_get_pdinfo_list(dev->d_dev);
- if (pdi == NULL)
- return (EINVAL);
- pd = efiblk_get_pdinfo(pdi, dev->d_unit);
+ pd = efiblk_get_pdinfo((struct devdesc *)dev);
if (pd == NULL)
return (EINVAL);
@@ -763,18 +759,14 @@
efipart_ioctl(struct open_file *f, u_long cmd, void *data)
{
struct disk_devdesc *dev;
- pdinfo_list_t *pdi;
pdinfo_t *pd;
int rc;
dev = (struct disk_devdesc *)(f->f_devdata);
if (dev == NULL)
return (EINVAL);
- pdi = efiblk_get_pdinfo_list(dev->d_dev);
- if (pdi == NULL)
- return (EINVAL);
- pd = efiblk_get_pdinfo(pdi, dev->d_unit);
+ pd = efiblk_get_pdinfo((struct devdesc *)dev);
if (pd == NULL)
return (EINVAL);
@@ -847,17 +839,13 @@
{
struct bcache_devdata bcd;
struct disk_devdesc *dev;
- pdinfo_list_t *pdi;
pdinfo_t *pd;
dev = (struct disk_devdesc *)devdata;
if (dev == NULL)
return (EINVAL);
- pdi = efiblk_get_pdinfo_list(dev->d_dev);
- if (pdi == NULL)
- return (EINVAL);
- pd = efiblk_get_pdinfo(pdi, dev->d_unit);
+ pd = efiblk_get_pdinfo((struct devdesc *)dev);
if (pd == NULL)
return (EINVAL);
@@ -881,7 +869,6 @@
char *buf, size_t *rsize)
{
struct disk_devdesc *dev = (struct disk_devdesc *)devdata;
- pdinfo_list_t *pdi;
pdinfo_t *pd;
EFI_BLOCK_IO *blkio;
uint64_t off, disk_blocks, d_offset = 0;
@@ -893,11 +880,7 @@
if (dev == NULL || blk < 0)
return (EINVAL);
- pdi = efiblk_get_pdinfo_list(dev->d_dev);
- if (pdi == NULL)
- return (EINVAL);
-
- pd = efiblk_get_pdinfo(pdi, dev->d_unit);
+ pd = efiblk_get_pdinfo((struct devdesc *)dev);
if (pd == NULL)
return (EINVAL);
Index: sys/boot/efi/libefi/efizfs.c
===================================================================
--- sys/boot/efi/libefi/efizfs.c
+++ sys/boot/efi/libefi/efizfs.c
@@ -52,6 +52,19 @@
return (&zfsinfo);
}
+EFI_HANDLE
+efizfs_get_handle_by_guid(uint64_t guid)
+{
+ zfsinfo_t *zi;
+
+ STAILQ_FOREACH(zi, &zfsinfo, zi_link) {
+ if (zi->zi_pool_guid == guid) {
+ return (zi->zi_handle);
+ }
+ }
+ return (NULL);
+}
+
static void
insert_zfs(EFI_HANDLE handle, uint64_t guid)
{
Index: sys/boot/efi/loader/main.c
===================================================================
--- sys/boot/efi/loader/main.c
+++ sys/boot/efi/loader/main.c
@@ -871,9 +871,41 @@
*(--argv) = 0;
}
- if (efi_getdev((void **)&dev, name, (const char **)&path) == 0)
- loaded_image->DeviceHandle =
- efi_find_handle(dev->d_dev, dev->d_unit);
+ if (efi_getdev((void **)&dev, name, (const char **)&path) == 0) {
+ struct zfs_devdesc *z_dev;
+ struct disk_devdesc *d_dev;
+ pdinfo_t *hd, *pd;
+
+ switch (dev->d_type) {
+ case DEVT_ZFS:
+ z_dev = (struct zfs_devdesc *)dev;
+ loaded_image->DeviceHandle =
+ efizfs_get_handle_by_guid(z_dev->pool_guid);
+ break;
+ case DEVT_NET:
+ loaded_image->DeviceHandle =
+ efi_find_handle(dev->d_dev, dev->d_unit);
+ break;
+ default:
+ hd = efiblk_get_pdinfo(dev);
+ if (STAILQ_EMPTY(&hd->pd_part)) {
+ loaded_image->DeviceHandle = hd->pd_handle;
+ break;
+ }
+ d_dev = (struct disk_devdesc *)dev;
+ STAILQ_FOREACH(pd, &hd->pd_part, pd_link) {
+ /*
+ * d_partition should be 255
+ */
+ if (pd->pd_unit == d_dev->d_slice) {
+ loaded_image->DeviceHandle =
+ pd->pd_handle;
+ break;
+ }
+ }
+ break;
+ }
+ }
dev_cleanup();
status = BS->StartImage(loaderhandle, NULL, NULL);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Mar 19, 6:17 PM (7 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29973350
Default Alt Text
D12287.id32838.diff (5 KB)
Attached To
Mode
D12287: loader.efi: chain loader should provide proper device handle
Attached
Detach File
Event Timeline
Log In to Comment