17c478bd9Sstevel@tonic-gate /****************************************************************************** 27c478bd9Sstevel@tonic-gate * 37c478bd9Sstevel@tonic-gate * Name: acefi.h - OS specific defines, etc. 47c478bd9Sstevel@tonic-gate * 57c478bd9Sstevel@tonic-gate *****************************************************************************/ 67c478bd9Sstevel@tonic-gate 726f3cdf0SGordon Ross /* 8*7b1019a6SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 97c478bd9Sstevel@tonic-gate * All rights reserved. 107c478bd9Sstevel@tonic-gate * 1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 1326f3cdf0SGordon Ross * are met: 1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 1626f3cdf0SGordon Ross * without modification. 1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 2126f3cdf0SGordon Ross * binary redistribution. 2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 2426f3cdf0SGordon Ross * from this software without specific prior written permission. 2526f3cdf0SGordon Ross * 2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 2826f3cdf0SGordon Ross * Software Foundation. 2926f3cdf0SGordon Ross * 3026f3cdf0SGordon Ross * NO WARRANTY 3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 4226f3cdf0SGordon Ross */ 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate #ifndef __ACEFI_H__ 457c478bd9Sstevel@tonic-gate #define __ACEFI_H__ 467c478bd9Sstevel@tonic-gate 47*7b1019a6SJerry Jelinek #include <stdarg.h> 48*7b1019a6SJerry Jelinek #if defined(_GNU_EFI) 49*7b1019a6SJerry Jelinek #include <stdint.h> 50*7b1019a6SJerry Jelinek #include <unistd.h> 51*7b1019a6SJerry Jelinek #endif 527c478bd9Sstevel@tonic-gate 53*7b1019a6SJerry Jelinek #if defined(__x86_64__) 54*7b1019a6SJerry Jelinek #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) 55*7b1019a6SJerry Jelinek #define USE_MS_ABI 1 56*7b1019a6SJerry Jelinek #endif 57*7b1019a6SJerry Jelinek #endif 58*7b1019a6SJerry Jelinek 59*7b1019a6SJerry Jelinek #ifdef _MSC_EXTENSIONS 60*7b1019a6SJerry Jelinek #define EFIAPI __cdecl 61*7b1019a6SJerry Jelinek #elif USE_MS_ABI 62*7b1019a6SJerry Jelinek #define EFIAPI __attribute__((ms_abi)) 63*7b1019a6SJerry Jelinek #else 64*7b1019a6SJerry Jelinek #define EFIAPI 65*7b1019a6SJerry Jelinek #endif 66*7b1019a6SJerry Jelinek 67*7b1019a6SJerry Jelinek typedef uint8_t UINT8; 68*7b1019a6SJerry Jelinek typedef uint16_t UINT16; 69*7b1019a6SJerry Jelinek typedef int16_t INT16; 70*7b1019a6SJerry Jelinek typedef uint32_t UINT32; 71*7b1019a6SJerry Jelinek typedef int32_t INT32; 72*7b1019a6SJerry Jelinek typedef uint64_t UINT64; 73*7b1019a6SJerry Jelinek typedef int64_t INT64; 74*7b1019a6SJerry Jelinek typedef uint8_t BOOLEAN; 75*7b1019a6SJerry Jelinek typedef uint16_t CHAR16; 76*7b1019a6SJerry Jelinek 77*7b1019a6SJerry Jelinek #define VOID void 78*7b1019a6SJerry Jelinek 79*7b1019a6SJerry Jelinek #if defined(__ia64__) || defined(__x86_64__) 80*7b1019a6SJerry Jelinek 81*7b1019a6SJerry Jelinek #define ACPI_MACHINE_WIDTH 64 82*7b1019a6SJerry Jelinek 83*7b1019a6SJerry Jelinek #if defined(__x86_64__) 84*7b1019a6SJerry Jelinek 85*7b1019a6SJerry Jelinek /* for x86_64, EFI_FUNCTION_WRAPPER must be defined */ 86*7b1019a6SJerry Jelinek 87*7b1019a6SJerry Jelinek #ifndef USE_MS_ABI 88*7b1019a6SJerry Jelinek #define USE_EFI_FUNCTION_WRAPPER 89*7b1019a6SJerry Jelinek #endif 90*7b1019a6SJerry Jelinek 91*7b1019a6SJerry Jelinek #ifdef _MSC_EXTENSIONS 92*7b1019a6SJerry Jelinek #pragma warning ( disable : 4731 ) /* Suppress warnings about modification of EBP */ 93*7b1019a6SJerry Jelinek #endif 94*7b1019a6SJerry Jelinek 95*7b1019a6SJerry Jelinek #endif 96*7b1019a6SJerry Jelinek 97*7b1019a6SJerry Jelinek typedef uint64_t UINTN; 98*7b1019a6SJerry Jelinek typedef int64_t INTN; 99*7b1019a6SJerry Jelinek 100*7b1019a6SJerry Jelinek #define EFIERR(a) (0x8000000000000000 | a) 101*7b1019a6SJerry Jelinek 102*7b1019a6SJerry Jelinek #else 103*7b1019a6SJerry Jelinek 104*7b1019a6SJerry Jelinek #define ACPI_MACHINE_WIDTH 32 105*7b1019a6SJerry Jelinek #define ACPI_USE_NATIVE_DIVIDE 106*7b1019a6SJerry Jelinek 107*7b1019a6SJerry Jelinek typedef uint32_t UINTN; 108*7b1019a6SJerry Jelinek typedef int32_t INTN; 109*7b1019a6SJerry Jelinek 110*7b1019a6SJerry Jelinek #define EFIERR(a) (0x80000000 | a) 111*7b1019a6SJerry Jelinek 112*7b1019a6SJerry Jelinek #endif 113*7b1019a6SJerry Jelinek 114*7b1019a6SJerry Jelinek 115*7b1019a6SJerry Jelinek #ifdef USE_EFI_FUNCTION_WRAPPER 116*7b1019a6SJerry Jelinek #define __VA_NARG__(...) \ 117*7b1019a6SJerry Jelinek __VA_NARG_(_0, ## __VA_ARGS__, __RSEQ_N()) 118*7b1019a6SJerry Jelinek #define __VA_NARG_(...) \ 119*7b1019a6SJerry Jelinek __VA_ARG_N(__VA_ARGS__) 120*7b1019a6SJerry Jelinek #define __VA_ARG_N( \ 121*7b1019a6SJerry Jelinek _0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,N,...) N 122*7b1019a6SJerry Jelinek #define __RSEQ_N() \ 123*7b1019a6SJerry Jelinek 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 124*7b1019a6SJerry Jelinek 125*7b1019a6SJerry Jelinek #define __VA_ARG_NSUFFIX__(prefix,...) \ 126*7b1019a6SJerry Jelinek __VA_ARG_NSUFFIX_N(prefix, __VA_NARG__(__VA_ARGS__)) 127*7b1019a6SJerry Jelinek #define __VA_ARG_NSUFFIX_N(prefix,nargs) \ 128*7b1019a6SJerry Jelinek __VA_ARG_NSUFFIX_N_(prefix, nargs) 129*7b1019a6SJerry Jelinek #define __VA_ARG_NSUFFIX_N_(prefix,nargs) \ 130*7b1019a6SJerry Jelinek prefix ## nargs 131*7b1019a6SJerry Jelinek 132*7b1019a6SJerry Jelinek /* Prototypes of EFI cdecl -> stdcall trampolines */ 133*7b1019a6SJerry Jelinek 134*7b1019a6SJerry Jelinek UINT64 efi_call0(void *func); 135*7b1019a6SJerry Jelinek UINT64 efi_call1(void *func, UINT64 arg1); 136*7b1019a6SJerry Jelinek UINT64 efi_call2(void *func, UINT64 arg1, UINT64 arg2); 137*7b1019a6SJerry Jelinek UINT64 efi_call3(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3); 138*7b1019a6SJerry Jelinek UINT64 efi_call4(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, 139*7b1019a6SJerry Jelinek UINT64 arg4); 140*7b1019a6SJerry Jelinek UINT64 efi_call5(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, 141*7b1019a6SJerry Jelinek UINT64 arg4, UINT64 arg5); 142*7b1019a6SJerry Jelinek UINT64 efi_call6(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, 143*7b1019a6SJerry Jelinek UINT64 arg4, UINT64 arg5, UINT64 arg6); 144*7b1019a6SJerry Jelinek UINT64 efi_call7(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, 145*7b1019a6SJerry Jelinek UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7); 146*7b1019a6SJerry Jelinek UINT64 efi_call8(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, 147*7b1019a6SJerry Jelinek UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7, 148*7b1019a6SJerry Jelinek UINT64 arg8); 149*7b1019a6SJerry Jelinek UINT64 efi_call9(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, 150*7b1019a6SJerry Jelinek UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7, 151*7b1019a6SJerry Jelinek UINT64 arg8, UINT64 arg9); 152*7b1019a6SJerry Jelinek UINT64 efi_call10(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3, 153*7b1019a6SJerry Jelinek UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7, 154*7b1019a6SJerry Jelinek UINT64 arg8, UINT64 arg9, UINT64 arg10); 155*7b1019a6SJerry Jelinek 156*7b1019a6SJerry Jelinek /* Front-ends to efi_callX to avoid compiler warnings */ 157*7b1019a6SJerry Jelinek 158*7b1019a6SJerry Jelinek #define _cast64_efi_call0(f) \ 159*7b1019a6SJerry Jelinek efi_call0(f) 160*7b1019a6SJerry Jelinek #define _cast64_efi_call1(f,a1) \ 161*7b1019a6SJerry Jelinek efi_call1(f, (UINT64)(a1)) 162*7b1019a6SJerry Jelinek #define _cast64_efi_call2(f,a1,a2) \ 163*7b1019a6SJerry Jelinek efi_call2(f, (UINT64)(a1), (UINT64)(a2)) 164*7b1019a6SJerry Jelinek #define _cast64_efi_call3(f,a1,a2,a3) \ 165*7b1019a6SJerry Jelinek efi_call3(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3)) 166*7b1019a6SJerry Jelinek #define _cast64_efi_call4(f,a1,a2,a3,a4) \ 167*7b1019a6SJerry Jelinek efi_call4(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4)) 168*7b1019a6SJerry Jelinek #define _cast64_efi_call5(f,a1,a2,a3,a4,a5) \ 169*7b1019a6SJerry Jelinek efi_call5(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ 170*7b1019a6SJerry Jelinek (UINT64)(a5)) 171*7b1019a6SJerry Jelinek #define _cast64_efi_call6(f,a1,a2,a3,a4,a5,a6) \ 172*7b1019a6SJerry Jelinek efi_call6(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ 173*7b1019a6SJerry Jelinek (UINT64)(a5), (UINT64)(a6)) 174*7b1019a6SJerry Jelinek #define _cast64_efi_call7(f,a1,a2,a3,a4,a5,a6,a7) \ 175*7b1019a6SJerry Jelinek efi_call7(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ 176*7b1019a6SJerry Jelinek (UINT64)(a5), (UINT64)(a6), (UINT64)(a7)) 177*7b1019a6SJerry Jelinek #define _cast64_efi_call8(f,a1,a2,a3,a4,a5,a6,a7,a8) \ 178*7b1019a6SJerry Jelinek efi_call8(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ 179*7b1019a6SJerry Jelinek (UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8)) 180*7b1019a6SJerry Jelinek #define _cast64_efi_call9(f,a1,a2,a3,a4,a5,a6,a7,a8,a9) \ 181*7b1019a6SJerry Jelinek efi_call9(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ 182*7b1019a6SJerry Jelinek (UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8), \ 183*7b1019a6SJerry Jelinek (UINT64)(a9)) 184*7b1019a6SJerry Jelinek #define _cast64_efi_call10(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) \ 185*7b1019a6SJerry Jelinek efi_call10(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \ 186*7b1019a6SJerry Jelinek (UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8), \ 187*7b1019a6SJerry Jelinek (UINT64)(a9), (UINT64)(a10)) 188*7b1019a6SJerry Jelinek 189*7b1019a6SJerry Jelinek /* main wrapper (va_num ignored) */ 190*7b1019a6SJerry Jelinek 191*7b1019a6SJerry Jelinek #define uefi_call_wrapper(func,va_num,...) \ 192*7b1019a6SJerry Jelinek __VA_ARG_NSUFFIX__(_cast64_efi_call, __VA_ARGS__) (func , ##__VA_ARGS__) 193*7b1019a6SJerry Jelinek 194*7b1019a6SJerry Jelinek #else 195*7b1019a6SJerry Jelinek 196*7b1019a6SJerry Jelinek #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) 197*7b1019a6SJerry Jelinek 198*7b1019a6SJerry Jelinek #endif 199*7b1019a6SJerry Jelinek 200*7b1019a6SJerry Jelinek /* AED EFI definitions */ 201*7b1019a6SJerry Jelinek 202*7b1019a6SJerry Jelinek #if defined(_AED_EFI) 2037c478bd9Sstevel@tonic-gate 2047c478bd9Sstevel@tonic-gate /* _int64 works for both IA32 and IA64 */ 2057c478bd9Sstevel@tonic-gate 2067c478bd9Sstevel@tonic-gate #define COMPILER_DEPENDENT_INT64 __int64 2077c478bd9Sstevel@tonic-gate #define COMPILER_DEPENDENT_UINT64 unsigned __int64 2087c478bd9Sstevel@tonic-gate 2097c478bd9Sstevel@tonic-gate /* 2107c478bd9Sstevel@tonic-gate * Calling conventions: 2117c478bd9Sstevel@tonic-gate * 2127c478bd9Sstevel@tonic-gate * ACPI_SYSTEM_XFACE - Interfaces to host OS (handlers, threads) 2137c478bd9Sstevel@tonic-gate * ACPI_EXTERNAL_XFACE - External ACPI interfaces 2147c478bd9Sstevel@tonic-gate * ACPI_INTERNAL_XFACE - Internal ACPI interfaces 2157c478bd9Sstevel@tonic-gate * ACPI_INTERNAL_VAR_XFACE - Internal variable-parameter list interfaces 2167c478bd9Sstevel@tonic-gate */ 2177c478bd9Sstevel@tonic-gate #define ACPI_SYSTEM_XFACE 2187c478bd9Sstevel@tonic-gate #define ACPI_EXTERNAL_XFACE 2197c478bd9Sstevel@tonic-gate #define ACPI_INTERNAL_XFACE 2207c478bd9Sstevel@tonic-gate #define ACPI_INTERNAL_VAR_XFACE 2217c478bd9Sstevel@tonic-gate 2227c478bd9Sstevel@tonic-gate /* warn C4142: redefinition of type */ 2237c478bd9Sstevel@tonic-gate 2247c478bd9Sstevel@tonic-gate #pragma warning(disable:4142) 2257c478bd9Sstevel@tonic-gate 226*7b1019a6SJerry Jelinek #endif 227*7b1019a6SJerry Jelinek 228*7b1019a6SJerry Jelinek 229*7b1019a6SJerry Jelinek /* GNU EFI definitions */ 230*7b1019a6SJerry Jelinek 231*7b1019a6SJerry Jelinek #if defined(_GNU_EFI) 232*7b1019a6SJerry Jelinek 233*7b1019a6SJerry Jelinek /* Using GCC for GNU EFI */ 234*7b1019a6SJerry Jelinek 235*7b1019a6SJerry Jelinek #include "acgcc.h" 236*7b1019a6SJerry Jelinek 237*7b1019a6SJerry Jelinek #undef ACPI_USE_SYSTEM_CLIBRARY 238*7b1019a6SJerry Jelinek #undef ACPI_USE_STANDARD_HEADERS 239*7b1019a6SJerry Jelinek #undef ACPI_USE_NATIVE_DIVIDE 240*7b1019a6SJerry Jelinek #define ACPI_USE_SYSTEM_INTTYPES 241*7b1019a6SJerry Jelinek 242*7b1019a6SJerry Jelinek /* 243*7b1019a6SJerry Jelinek * Math helpers 244*7b1019a6SJerry Jelinek */ 245*7b1019a6SJerry Jelinek #define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \ 246*7b1019a6SJerry Jelinek do { \ 247*7b1019a6SJerry Jelinek UINT64 __n = ((UINT64) n_hi) << 32 | (n_lo); \ 248*7b1019a6SJerry Jelinek (q32) = DivU64x32 ((__n), (d32), &(r32)); \ 249*7b1019a6SJerry Jelinek } while (0) 250*7b1019a6SJerry Jelinek 251*7b1019a6SJerry Jelinek #define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \ 252*7b1019a6SJerry Jelinek do { \ 253*7b1019a6SJerry Jelinek (n_lo) >>= 1; \ 254*7b1019a6SJerry Jelinek (n_lo) |= (((n_hi) & 1) << 31); \ 255*7b1019a6SJerry Jelinek (n_hi) >>= 1; \ 256*7b1019a6SJerry Jelinek } while (0) 257*7b1019a6SJerry Jelinek 258*7b1019a6SJerry Jelinek 259*7b1019a6SJerry Jelinek #endif 260*7b1019a6SJerry Jelinek 261*7b1019a6SJerry Jelinek struct _SIMPLE_TEXT_OUTPUT_INTERFACE; 262*7b1019a6SJerry Jelinek struct _SIMPLE_INPUT_INTERFACE; 263*7b1019a6SJerry Jelinek struct _EFI_FILE_IO_INTERFACE; 264*7b1019a6SJerry Jelinek struct _EFI_FILE_HANDLE; 265*7b1019a6SJerry Jelinek struct _EFI_BOOT_SERVICES; 266*7b1019a6SJerry Jelinek struct _EFI_SYSTEM_TABLE; 267*7b1019a6SJerry Jelinek 268*7b1019a6SJerry Jelinek extern struct _EFI_SYSTEM_TABLE *ST; 269*7b1019a6SJerry Jelinek extern struct _EFI_BOOT_SERVICES *BS; 270*7b1019a6SJerry Jelinek 271*7b1019a6SJerry Jelinek #define ACPI_FILE struct _SIMPLE_TEXT_OUTPUT_INTERFACE * 272*7b1019a6SJerry Jelinek #define ACPI_FILE_OUT ST->ConOut 273*7b1019a6SJerry Jelinek #define ACPI_FILE_ERR ST->ConOut 2747c478bd9Sstevel@tonic-gate 2757c478bd9Sstevel@tonic-gate #endif /* __ACEFI_H__ */ 276