diff options
Diffstat (limited to 'usr/src/boot/efi/libefi/handles.c')
| -rw-r--r-- | usr/src/boot/efi/libefi/handles.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/usr/src/boot/efi/libefi/handles.c b/usr/src/boot/efi/libefi/handles.c new file mode 100644 index 0000000000..1e4ef6ffbd --- /dev/null +++ b/usr/src/boot/efi/libefi/handles.c @@ -0,0 +1,118 @@ +/*- + * Copyright (c) 2006 Marcel Moolenaar + * 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/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <efi.h> +#include <efilib.h> + +struct entry { + EFI_HANDLE handle; + EFI_HANDLE alias; + struct devsw *dev; + int unit; + uint64_t extra; +}; + +struct entry *entry; +int nentries; + +int +efi_register_handles(struct devsw *sw, EFI_HANDLE *handles, + EFI_HANDLE *aliases, int count) +{ + size_t sz; + int idx, unit; + + idx = nentries; + nentries += count; + sz = nentries * sizeof(struct entry); + entry = (entry == NULL) ? malloc(sz) : realloc(entry, sz); + for (unit = 0; idx < nentries; idx++, unit++) { + entry[idx].handle = handles[unit]; + if (aliases != NULL) + entry[idx].alias = aliases[unit]; + else + entry[idx].alias = NULL; + entry[idx].dev = sw; + entry[idx].unit = unit; + } + return (0); +} + +EFI_HANDLE +efi_find_handle(struct devsw *dev, int unit) +{ + int idx; + + for (idx = 0; idx < nentries; idx++) { + if (entry[idx].dev != dev) + continue; + if (entry[idx].unit != unit) + continue; + return (entry[idx].handle); + } + return (NULL); +} + +int +efi_handle_lookup(EFI_HANDLE h, struct devsw **dev, int *unit, uint64_t *extra) +{ + int idx; + + for (idx = 0; idx < nentries; idx++) { + if (entry[idx].handle != h && entry[idx].alias != h) + continue; + if (dev != NULL) + *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); +} |
