efi.h revision 1.3
1/* $NetBSD: efi.h,v 1.3 2023/05/22 16:27:49 riastradh Exp $ */ 2 3/*- 4 * Copyright (c) 2004 Marcel Moolenaar 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#ifndef _DEV_EFI_EFI_H_ 30#define _DEV_EFI_EFI_H_ 31 32/* 33 * Machine-independent UEFI protocol definitions. Based on: 34 * 35 * Unified Extensible Firmware Interface (UEFI) Specification, 36 * Version 2.9, UEFI Forum, Inc., March 2021. 37 * 38 * https://uefi.org/sites/default/files/resources/UEFI_Spec_2_9_2021_03_18.pdf 39 */ 40 41#if defined(__i386__) || defined(__x86_64__) 42#define EFIAPI __attribute__((__ms_abi__)) 43#else 44#define EFIAPI /* empty */ 45#endif 46 47#ifdef _LP64 48#define EFIERR(x) (0x8000000000000000 | (x)) 49#else 50#define EFIERR(x) (0x80000000 | (x)) 51#endif 52 53#define EFI_SUCCESS 0 54#define EFI_INVALID_PARAMETER EFIERR(2) 55#define EFI_UNSUPPORTED EFIERR(3) 56#define EFI_BUFFER_TOO_SMALL EFIERR(5) 57#define EFI_DEVICE_ERROR EFIERR(7) 58#define EFI_WRITE_PROTECTED EFIERR(8) 59#define EFI_OUT_OF_RESOURCES EFIERR(9) 60#define EFI_NOT_FOUND EFIERR(14) 61#define EFI_SECURITY_VIOLATION EFIERR(26) 62 63enum efi_reset { 64 EFI_RESET_COLD, 65 EFI_RESET_WARM, 66 EFI_RESET_SHUTDOWN, 67 EFI_RESET_PLATFORM_SPECIFIC, 68}; 69 70typedef uint16_t efi_char; 71typedef unsigned long efi_status; 72 73struct efi_cfgtbl { 74 struct uuid ct_uuid; 75 void *ct_data; 76}; 77 78struct efi_md { 79 uint32_t md_type; 80#define EFI_MD_TYPE_NULL 0 81#define EFI_MD_TYPE_CODE 1 /* Loader text. */ 82#define EFI_MD_TYPE_DATA 2 /* Loader data. */ 83#define EFI_MD_TYPE_BS_CODE 3 /* Boot services text. */ 84#define EFI_MD_TYPE_BS_DATA 4 /* Boot services data. */ 85#define EFI_MD_TYPE_RT_CODE 5 /* Runtime services text. */ 86#define EFI_MD_TYPE_RT_DATA 6 /* Runtime services data. */ 87#define EFI_MD_TYPE_FREE 7 /* Unused/free memory. */ 88#define EFI_MD_TYPE_BAD 8 /* Bad memory */ 89#define EFI_MD_TYPE_RECLAIM 9 /* ACPI reclaimable memory. */ 90#define EFI_MD_TYPE_FIRMWARE 10 /* ACPI NV memory */ 91#define EFI_MD_TYPE_IOMEM 11 /* Memory-mapped I/O. */ 92#define EFI_MD_TYPE_IOPORT 12 /* I/O port space. */ 93#define EFI_MD_TYPE_PALCODE 13 /* PAL */ 94#define EFI_MD_TYPE_PMEM 14 /* Persistent memory. */ 95 uint32_t __pad; 96 uint64_t md_phys; 97 uint64_t md_virt; 98 uint64_t md_pages; 99 uint64_t md_attr; 100#define EFI_MD_ATTR_UC 0x0000000000000001UL 101#define EFI_MD_ATTR_WC 0x0000000000000002UL 102#define EFI_MD_ATTR_WT 0x0000000000000004UL 103#define EFI_MD_ATTR_WB 0x0000000000000008UL 104#define EFI_MD_ATTR_UCE 0x0000000000000010UL 105#define EFI_MD_ATTR_WP 0x0000000000001000UL 106#define EFI_MD_ATTR_RP 0x0000000000002000UL 107#define EFI_MD_ATTR_XP 0x0000000000004000UL 108#define EFI_MD_ATTR_NV 0x0000000000008000UL 109#define EFI_MD_ATTR_MORE_RELIABLE 0x0000000000010000UL 110#define EFI_MD_ATTR_RO 0x0000000000020000UL 111#define EFI_MD_ATTR_SP 0x0000000000040000UL 112#define EFI_MD_ATTR_CPU_CRYPTO 0x0000000000080000UL 113#define EFI_MD_ATTR_RT 0x8000000000000000UL 114}; 115 116struct efi_tm { 117 uint16_t tm_year; /* 1998 - 20XX */ 118 uint8_t tm_mon; /* 1 - 12 */ 119 uint8_t tm_mday; /* 1 - 31 */ 120 uint8_t tm_hour; /* 0 - 23 */ 121 uint8_t tm_min; /* 0 - 59 */ 122 uint8_t tm_sec; /* 0 - 59 */ 123 uint8_t __pad1; 124 uint32_t tm_nsec; /* 0 - 999,999,999 */ 125 int16_t tm_tz; /* -1440 to 1440 or 2047 */ 126 uint8_t tm_dst; 127 uint8_t __pad2; 128}; 129 130struct efi_tmcap { 131 uint32_t tc_res; /* 1e-6 parts per million */ 132 uint32_t tc_prec; /* hertz */ 133 uint8_t tc_stz; /* Set clears sub-second time */ 134}; 135 136struct efi_tblhdr { 137 uint64_t th_sig; 138 uint32_t th_rev; 139 uint32_t th_hdrsz; 140 uint32_t th_crc32; 141 uint32_t __res; 142}; 143 144struct efi_rt { 145 struct efi_tblhdr rt_hdr; 146 efi_status (*rt_gettime)(struct efi_tm *, struct efi_tmcap *) 147 EFIAPI; 148 efi_status (*rt_settime)(struct efi_tm *) EFIAPI; 149 efi_status (*rt_getwaketime)(uint8_t *, uint8_t *, 150 struct efi_tm *) EFIAPI; 151 efi_status (*rt_setwaketime)(uint8_t, struct efi_tm *) EFIAPI; 152 efi_status (*rt_setvirtual)(u_long, u_long, uint32_t, 153 struct efi_md *) EFIAPI; 154 efi_status (*rt_cvtptr)(u_long, void **) EFIAPI; 155 efi_status (*rt_getvar)(efi_char *, struct uuid *, uint32_t *, 156 u_long *, void *) EFIAPI; 157 efi_status (*rt_scanvar)(u_long *, efi_char *, struct uuid *) 158 EFIAPI; 159 efi_status (*rt_setvar)(efi_char *, struct uuid *, uint32_t, 160 u_long, void *) EFIAPI; 161 efi_status (*rt_gethicnt)(uint32_t *) EFIAPI; 162 efi_status (*rt_reset)(enum efi_reset, efi_status, u_long, 163 efi_char *) EFIAPI; 164}; 165 166struct efi_systbl { 167 struct efi_tblhdr st_hdr; 168#define EFI_SYSTBL_SIG 0x5453595320494249UL 169 efi_char *st_fwvendor; 170 uint32_t st_fwrev; 171#ifdef _LP64 172 uint32_t __pad; 173#endif 174 void *st_cin; 175 void *st_cinif; 176 void *st_cout; 177 void *st_coutif; 178 void *st_cerr; 179 void *st_cerrif; 180 struct efi_rt *st_rt; 181 void *st_bs; 182 u_long st_entries; 183 struct efi_cfgtbl *st_cfgtbl; 184}; 185#ifdef _LP64 186__CTASSERT(sizeof(struct efi_systbl) == 120); 187#else 188__CTASSERT(sizeof(struct efi_systbl) == 72); 189#endif 190 191#endif /* _DEV_EFI_EFI_H_ */ 192