Home | History | Annotate | Line # | Download | only in mips64el
efibind.h revision 1.1
      1 /*	$NetBSD: efibind.h,v 1.1 2018/08/16 18:17:47 jmcneill Exp $	*/
      2 
      3 /*
      4  * Copright (C) 2014 - 2015 Linaro Ltd.
      5  * Author: Ard Biesheuvel <ard.biesheuvel (at) linaro.org>
      6  * Copright (C) 2017 Lemote Co.
      7  * Author: Heiher <r (at) hev.cc>
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice and this list of conditions, without modification.
     14  * 2. The name of the author may not be used to endorse or promote products
     15  *    derived from this software without specific prior written permission.
     16  *
     17  * Alternatively, this software may be distributed under the terms of the
     18  * GNU General Public License as published by the Free Software Foundation;
     19  * either version 2 of the License, or (at your option) any later version.
     20  */
     21 
     22 #if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L )
     23 
     24 // ANSI C 1999/2000 stdint.h integer width declarations
     25 
     26 typedef unsigned long       uint64_t;
     27 typedef long                int64_t;
     28 typedef unsigned int        uint32_t;
     29 typedef int                 int32_t;
     30 typedef unsigned short      uint16_t;
     31 typedef short               int16_t;
     32 typedef unsigned char       uint8_t;
     33 typedef signed char         int8_t;   // unqualified 'char' is unsigned on ARM
     34 
     35 #else
     36 #include <stdint.h>
     37 #endif
     38 
     39 //
     40 // Basic EFI types of various widths
     41 //
     42 
     43 #ifndef __WCHAR_TYPE__
     44 # define __WCHAR_TYPE__ short
     45 #endif
     46 
     47 typedef uint64_t   UINT64;
     48 typedef int64_t    INT64;
     49 
     50 typedef uint32_t   UINT32;
     51 typedef int32_t    INT32;
     52 
     53 typedef uint16_t   UINT16;
     54 typedef int16_t    INT16;
     55 typedef uint8_t    UINT8;
     56 typedef int8_t     INT8;
     57 typedef __WCHAR_TYPE__ WCHAR;
     58 
     59 #undef VOID
     60 #define VOID    void
     61 
     62 typedef int64_t    INTN;
     63 typedef uint64_t   UINTN;
     64 
     65 #define EFIERR(a)           (0x8000000000000000 | a)
     66 #define EFI_ERROR_MASK      0x8000000000000000
     67 #define EFIERR_OEM(a)       (0xc000000000000000 | a)
     68 
     69 #define BAD_POINTER         0xFBFBFBFBFBFBFBFB
     70 #define MAX_ADDRESS         0xFFFFFFFFFFFFFFFF
     71 
     72 #define BREAKPOINT()        while (TRUE);    // Make it hang on Bios[Dbg]32
     73 
     74 //
     75 // Pointers must be aligned to these address to function
     76 //
     77 
     78 #define MIN_ALIGNMENT_SIZE  8
     79 
     80 #define ALIGN_VARIABLE(Value ,Adjustment) \
     81             (UINTN)Adjustment = 0; \
     82             if((UINTN)Value % MIN_ALIGNMENT_SIZE) \
     83                 (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \
     84             Value = (UINTN)Value + (UINTN)Adjustment
     85 
     86 
     87 //
     88 // Define macros to build data structure signatures from characters.
     89 //
     90 
     91 #define EFI_SIGNATURE_16(A,B)             ((A) | (B<<8))
     92 #define EFI_SIGNATURE_32(A,B,C,D)         (EFI_SIGNATURE_16(A,B)     | (EFI_SIGNATURE_16(C,D)     << 16))
     93 #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32))
     94 
     95 //
     96 // EFIAPI - prototype calling convention for EFI function pointers
     97 // BOOTSERVICE - prototype for implementation of a boot service interface
     98 // RUNTIMESERVICE - prototype for implementation of a runtime service interface
     99 // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service
    100 // RUNTIME_CODE - pragma macro for declaring runtime code
    101 //
    102 
    103 #ifndef EFIAPI          // Forces EFI calling conventions reguardless of compiler options
    104 #define EFIAPI          // Substitute expresion to force C calling convention
    105 #endif
    106 
    107 #define BOOTSERVICE
    108 #define RUNTIMESERVICE
    109 #define RUNTIMEFUNCTION
    110 
    111 
    112 #define RUNTIME_CODE(a)         alloc_text("rtcode", a)
    113 #define BEGIN_RUNTIME_DATA()    data_seg("rtdata")
    114 #define END_RUNTIME_DATA()      data_seg("")
    115 
    116 #define VOLATILE                volatile
    117 
    118 #define MEMORY_FENCE            __sync_synchronize
    119 
    120 //
    121 // When build similiar to FW, then link everything together as
    122 // one big module.
    123 //
    124 
    125 #define EFI_DRIVER_ENTRY_POINT(InitFunction)    \
    126     UINTN                                       \
    127     InitializeDriver (                          \
    128         VOID    *ImageHandle,                   \
    129         VOID    *SystemTable                    \
    130         )                                       \
    131     {                                           \
    132         return InitFunction(ImageHandle,        \
    133                 SystemTable);                   \
    134     }                                           \
    135                                                 \
    136     EFI_STATUS efi_main(                        \
    137         EFI_HANDLE image,                       \
    138         EFI_SYSTEM_TABLE *systab                \
    139         ) __attribute__((weak,                  \
    140                 alias ("InitializeDriver")));
    141 
    142 #define LOAD_INTERNAL_DRIVER(_if, type, name, entry)    \
    143         (_if)->LoadInternal(type, name, entry)
    144 
    145 
    146 //
    147 // Some compilers don't support the forward reference construct:
    148 //  typedef struct XXXXX
    149 //
    150 // The following macro provide a workaround for such cases.
    151 
    152 #define INTERFACE_DECL(x) struct x
    153 
    154 #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__)
    155 #define EFI_FUNCTION
    156 
    157 static inline UINT64 swap_uint64 (UINT64 v)
    158 {
    159 	asm volatile (
    160 		"dsbh	%[v], %[v] \n\t"
    161 		"dshd	%[v], %[v] \n\t"
    162 		:[v]"+r"(v)
    163 	);
    164 
    165 	return v;
    166 }
    167