Changeset View
Changeset View
Standalone View
Standalone View
sys/boot/efi/libefi/efizfs.c
- This file was added.
/*- | |||||
* Copyright (c) 2008-2010 Rui Paulo | |||||
* Copyright (c) 2006 Marcel Moolenaar | |||||
manu: Most of this code isn't your as it comes from loader/main.c, please add the original license. | |||||
Done Inline ActionsTrue. That was an file auto-creation mistake... eric_metricspace.net: True. That was an file auto-creation mistake... | |||||
* All rights reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in the | |||||
* documentation and/or other materials provided with the distribution. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | |||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | |||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | |||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
*/ | |||||
#include <sys/param.h> | |||||
#include <sys/disk.h> | |||||
#include <stdint.h> | |||||
#ifdef EFI_ZFS_BOOT | |||||
#include <libzfs.h> | |||||
#endif | |||||
#include <efi.h> | |||||
#include <efilib.h> | |||||
#include "efizfs.h" | |||||
#ifdef EFI_ZFS_BOOT | |||||
static zfsinfo_list_t zfsinfo; | |||||
uint64_t pool_guid; | |||||
zfsinfo_list_t * | |||||
efizfs_get_zfsinfo_list(void) | |||||
{ | |||||
return (&zfsinfo); | |||||
} | |||||
static void | |||||
insert_zfs(EFI_HANDLE handle, uint64_t guid) | |||||
{ | |||||
zfsinfo_t *zi; | |||||
zi = malloc(sizeof(zfsinfo_t)); | |||||
zi->zi_handle = handle; | |||||
zi->zi_pool_guid = guid; | |||||
STAILQ_INSERT_TAIL(&zfsinfo, zi, zi_link); | |||||
} | |||||
void | |||||
efi_zfs_probe(void) | |||||
{ | |||||
pdinfo_list_t *hdi; | |||||
pdinfo_t *hd, *pd = NULL; | |||||
EFI_GUID imgid = LOADED_IMAGE_PROTOCOL; | |||||
EFI_LOADED_IMAGE *img; | |||||
char devname[SPECNAMELEN + 1]; | |||||
uint64_t guid; | |||||
BS->HandleProtocol(IH, &imgid, (VOID**)&img); | |||||
hdi = efiblk_get_pdinfo_list(&efipart_hddev); | |||||
STAILQ_INIT(&zfsinfo); | |||||
/* | |||||
* Find the handle for the boot device. The boot1 did find the | |||||
* device with loader binary, now we need to search for the | |||||
* same device and if it is part of the zfs pool, we record the | |||||
* pool GUID for currdev setup. | |||||
*/ | |||||
STAILQ_FOREACH(hd, hdi, pd_link) { | |||||
STAILQ_FOREACH(pd, &hd->pd_part, pd_link) { | |||||
snprintf(devname, sizeof(devname), "%s%dp%d:", | |||||
efipart_hddev.dv_name, hd->pd_unit, pd->pd_unit); | |||||
if (zfs_probe_dev(devname, &guid) == 0) { | |||||
insert_zfs(pd->pd_handle, guid); | |||||
if (pd->pd_handle == img->DeviceHandle) | |||||
pool_guid = guid; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
uint64_t | |||||
ldi_get_size(void *priv) | |||||
{ | |||||
int fd = (uintptr_t) priv; | |||||
uint64_t size; | |||||
ioctl(fd, DIOCGMEDIASIZE, &size); | |||||
return (size); | |||||
} | |||||
#endif |
Most of this code isn't your as it comes from loader/main.c, please add the original license.