Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:05

0001 /*-
0002  * Copyright (c) 2000 Doug Rabson
0003  * Copyright (c) 2006 Marcel Moolenaar
0004  * All rights reserved.
0005  *
0006  * Redistribution and use in source and binary forms, with or without
0007  * modification, are permitted provided that the following conditions
0008  * are met:
0009  * 1. Redistributions of source code must retain the above copyright
0010  *    notice, this list of conditions and the following disclaimer.
0011  * 2. Redistributions in binary form must reproduce the above copyright
0012  *    notice, this list of conditions and the following disclaimer in the
0013  *    documentation and/or other materials provided with the distribution.
0014  *
0015  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
0016  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0018  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
0019  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
0020  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
0021  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
0022  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
0023  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
0024  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
0025  * SUCH DAMAGE.
0026  *
0027  * $FreeBSD$
0028  */
0029 
0030 #ifndef _LOADER_EFILIB_H
0031 #define _LOADER_EFILIB_H
0032 
0033 #ifndef __rtems__
0034 #include <stand.h>
0035 #endif /* __rtems__ */
0036 #include <stdbool.h>
0037 #include <sys/queue.h>
0038 #ifdef __rtems__
0039 #include <errno.h>
0040 #include <stdbool.h>
0041 #include <stdlib.h>
0042 #endif /* __rtems__ */
0043 
0044 extern EFI_HANDLE       IH;
0045 extern EFI_SYSTEM_TABLE     *ST;
0046 extern EFI_BOOT_SERVICES    *BS;
0047 extern EFI_RUNTIME_SERVICES *RS;
0048 
0049 #ifndef __rtems__
0050 
0051 extern struct devsw efipart_fddev;
0052 extern struct devsw efipart_cddev;
0053 extern struct devsw efipart_hddev;
0054 extern struct devsw efihttp_dev;
0055 extern struct devsw efinet_dev;
0056 extern struct netif_driver efinetif;
0057 
0058 /* EFI block device data, included here to help efi_zfs_probe() */
0059 typedef STAILQ_HEAD(pdinfo_list, pdinfo) pdinfo_list_t;
0060 
0061 typedef struct pdinfo
0062 {
0063     STAILQ_ENTRY(pdinfo)    pd_link;    /* link in device list */
0064     pdinfo_list_t       pd_part;    /* list of partitions */
0065     EFI_HANDLE      pd_handle;
0066     EFI_HANDLE      pd_alias;
0067     EFI_DEVICE_PATH     *pd_devpath;
0068     EFI_BLOCK_IO        *pd_blkio;
0069     uint32_t        pd_unit;    /* unit number */
0070     uint32_t        pd_open;    /* reference counter */
0071     void            *pd_bcache; /* buffer cache data */
0072     struct pdinfo       *pd_parent; /* Linked items (eg partitions) */
0073     struct devsw        *pd_devsw;  /* Back pointer to devsw */
0074 } pdinfo_t;
0075 
0076 pdinfo_list_t *efiblk_get_pdinfo_list(struct devsw *dev);
0077 pdinfo_t *efiblk_get_pdinfo(struct devdesc *dev);
0078 pdinfo_t *efiblk_get_pdinfo_by_handle(EFI_HANDLE h);
0079 pdinfo_t *efiblk_get_pdinfo_by_device_path(EFI_DEVICE_PATH *path);
0080 
0081 /* libefi.c */
0082 void *efi_get_table(EFI_GUID *tbl);
0083 EFI_STATUS OpenProtocolByHandle(EFI_HANDLE, EFI_GUID *, void **);
0084 
0085 static inline EFI_STATUS
0086 efi_exit_boot_services(UINTN key)
0087 {
0088     EFI_STATUS status;
0089 
0090     status = BS->ExitBootServices(IH, key);
0091     if (!EFI_ERROR(status))
0092         boot_services_active = false;
0093     return (status);
0094 }
0095 
0096 int efi_getdev(void **vdev, const char *devspec, const char **path);
0097 
0098 int efi_register_handles(struct devsw *, EFI_HANDLE *, EFI_HANDLE *, int);
0099 EFI_HANDLE efi_find_handle(struct devsw *, int);
0100 int efi_handle_lookup(EFI_HANDLE, struct devsw **, int *,  uint64_t *);
0101 int efi_handle_update_dev(EFI_HANDLE, struct devsw *, int, uint64_t);
0102 
0103 EFI_DEVICE_PATH *efi_lookup_image_devpath(EFI_HANDLE);
0104 EFI_DEVICE_PATH *efi_lookup_devpath(EFI_HANDLE);
0105 void efi_close_devpath(EFI_HANDLE);
0106 EFI_HANDLE efi_devpath_handle(EFI_DEVICE_PATH *);
0107 EFI_DEVICE_PATH *efi_devpath_last_node(EFI_DEVICE_PATH *);
0108 EFI_DEVICE_PATH *efi_devpath_trim(EFI_DEVICE_PATH *);
0109 bool efi_devpath_match(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *);
0110 bool efi_devpath_match_node(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *);
0111 bool efi_devpath_is_prefix(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *);
0112 CHAR16 *efi_devpath_name(EFI_DEVICE_PATH *);
0113 void efi_free_devpath_name(CHAR16 *);
0114 bool efi_devpath_same_disk(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *);
0115 EFI_DEVICE_PATH *efi_devpath_to_media_path(EFI_DEVICE_PATH *);
0116 UINTN efi_devpath_length(EFI_DEVICE_PATH *);
0117 EFI_DEVICE_PATH *efi_name_to_devpath(const char *path);
0118 EFI_DEVICE_PATH *efi_name_to_devpath16(CHAR16 *path);
0119 void efi_devpath_free(EFI_DEVICE_PATH *dp);
0120 EFI_HANDLE efi_devpath_to_handle(EFI_DEVICE_PATH *path, EFI_HANDLE *handles, unsigned nhandles);
0121 
0122 int efi_status_to_errno(EFI_STATUS);
0123 EFI_STATUS errno_to_efi_status(int errno);
0124 
0125 void efi_time_init(void);
0126 void efi_time_fini(void);
0127 
0128 int parse_uefi_con_out(void);
0129 EFI_STATUS efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE* Xsystab);
0130 
0131 EFI_STATUS main(int argc, CHAR16 *argv[]);
0132 void efi_exit(EFI_STATUS status) __dead2;
0133 
0134 /* EFI environment initialization. */
0135 void efi_init_environment(void);
0136 
0137 /* EFI Memory type strings. */
0138 const char *efi_memory_type(EFI_MEMORY_TYPE);
0139 #endif /* __rtems__ */
0140 
0141 /* CHAR16 utility functions. */
0142 int wcscmp(CHAR16 *, CHAR16 *);
0143 void cpy8to16(const char *, CHAR16 *, size_t);
0144 void cpy16to8(const CHAR16 *, char *, size_t);
0145 
0146 #ifndef __rtems__
0147 /*
0148  * Routines for interacting with EFI's env vars in a more unix-like
0149  * way than the standard APIs. In addition, convenience routines for
0150  * the loader setting / getting FreeBSD specific variables.
0151  */
0152 
0153 EFI_STATUS efi_delenv(EFI_GUID *guid, const char *varname);
0154 EFI_STATUS efi_freebsd_delenv(const char *varname);
0155 EFI_STATUS efi_freebsd_getenv(const char *v, void *data, __size_t *len);
0156 EFI_STATUS efi_getenv(EFI_GUID *g, const char *v, void *data, __size_t *len);
0157 EFI_STATUS efi_global_getenv(const char *v, void *data, __size_t *len);
0158 EFI_STATUS efi_setenv(EFI_GUID *guid, const char *varname, UINT32 attr, void *data, __size_t len);
0159 EFI_STATUS efi_setenv_freebsd_wcs(const char *varname, CHAR16 *valstr);
0160 
0161 /* guids and names */
0162 bool efi_guid_to_str(const EFI_GUID *, char **);
0163 bool efi_str_to_guid(const char *, EFI_GUID *);
0164 bool efi_name_to_guid(const char *, EFI_GUID *);
0165 bool efi_guid_to_name(EFI_GUID *, char **);
0166 
0167 /* efipart.c */
0168 int efipart_inithandles(void);
0169 
0170 #endif /* __rtems__ */
0171 
0172 #endif  /* _LOADER_EFILIB_H */