xref: /DragonStub/inc/riscv64/efibind.h (revision 056bdaa53e8dbffbf5363cc9a58ccea666334be3)
10f9c15feSbmeng@tinylab.org /* SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause */
2b1364609SPete Batard /*
3b1364609SPete Batard  * Copright (C) 2014 - 2015 Linaro Ltd.
4b1364609SPete Batard  * Author: Ard Biesheuvel <ard.biesheuvel@linaro.org>
5b1364609SPete Batard  *
6b1364609SPete Batard  * Redistribution and use in source and binary forms, with or without
7b1364609SPete Batard  * modification, are permitted provided that the following conditions
8b1364609SPete Batard  * are met:
9b1364609SPete Batard  * 1. Redistributions of source code must retain the above copyright
10b1364609SPete Batard  *    notice and this list of conditions, without modification.
11b1364609SPete Batard  * 2. The name of the author may not be used to endorse or promote products
12b1364609SPete Batard  *    derived from this software without specific prior written permission.
13b1364609SPete Batard  *
14b1364609SPete Batard  * Alternatively, this software may be distributed under the terms of the
15b1364609SPete Batard  * GNU General Public License as published by the Free Software Foundation;
16b1364609SPete Batard  * either version 2 of the License, or (at your option) any later version.
17b1364609SPete Batard  */
18b95f138fSHeinrich Schuchardt 
19b95f138fSHeinrich Schuchardt #include <stdint.h>
20b95f138fSHeinrich Schuchardt 
21b1364609SPete Batard //
22b1364609SPete Batard // Basic EFI types of various widths
23b1364609SPete Batard //
24b95f138fSHeinrich Schuchardt 
25189200d0SCallum Farmer #include <stddef.h>
26b1364609SPete Batard 
27b1364609SPete Batard typedef uint64_t                UINT64;
28b1364609SPete Batard typedef int64_t                 INT64;
29b1364609SPete Batard typedef uint32_t                UINT32;
30b1364609SPete Batard typedef int32_t                 INT32;
31b1364609SPete Batard typedef uint16_t                UINT16;
32b1364609SPete Batard typedef int16_t                 INT16;
33b1364609SPete Batard typedef uint8_t                 UINT8;
34b1364609SPete Batard typedef int8_t                  INT8;
35189200d0SCallum Farmer typedef wchar_t                 CHAR16;
36189200d0SCallum Farmer #define WCHAR                   CHAR16
37b1364609SPete Batard #ifndef BOOLEAN
38b95f138fSHeinrich Schuchardt typedef uint8_t                 BOOLEAN;
39b1364609SPete Batard #endif
40b1364609SPete Batard #undef VOID
41*056bdaa5SCallum Farmer typedef void                    VOID;
42b95f138fSHeinrich Schuchardt typedef int64_t                 INTN;
43b95f138fSHeinrich Schuchardt typedef uint64_t                UINTN;
44b1364609SPete Batard 
45b1364609SPete Batard #define EFI_ERROR_MASK          0x8000000000000000
46b1364609SPete Batard #define EFIERR(a)               (EFI_ERROR_MASK | a)
47b1364609SPete Batard #define EFIERR_OEM(a)           (0xc000000000000000 | a)
48b1364609SPete Batard 
49b1364609SPete Batard #define BAD_POINTER             0xFBFBFBFBFBFBFBFB
50b1364609SPete Batard #define MAX_ADDRESS             0xFFFFFFFFFFFFFFFF
51b95f138fSHeinrich Schuchardt 
52b95f138fSHeinrich Schuchardt #define BREAKPOINT()            while(1);
53b95f138fSHeinrich Schuchardt 
54b1364609SPete Batard //
55b1364609SPete Batard // Pointers must be aligned to these address to function
56b1364609SPete Batard //
57b1364609SPete Batard #define MIN_ALIGNMENT_SIZE      8
58b1364609SPete Batard 
59b1364609SPete Batard #define ALIGN_VARIABLE(Value, Adjustment) \
60b1364609SPete Batard    (UINTN)Adjustment = 0; \
61b1364609SPete Batard    if((UINTN)Value % MIN_ALIGNMENT_SIZE) \
62b1364609SPete Batard        (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \
63b1364609SPete Batard    Value = (UINTN)Value + (UINTN)Adjustment
64b1364609SPete Batard 
65b1364609SPete Batard //
66b1364609SPete Batard // Define macros to build data structure signatures from characters.
67b1364609SPete Batard //
68b95f138fSHeinrich Schuchardt #define EFI_SIGNATURE_16(A,B)             ((A) | (B<<8))
69b95f138fSHeinrich Schuchardt #define EFI_SIGNATURE_32(A,B,C,D)         (EFI_SIGNATURE_16(A,B)     | (EFI_SIGNATURE_16(C,D)     << 16))
70b95f138fSHeinrich Schuchardt #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))
71b5f98d40SHeinrich Schuchardt 
72b1364609SPete Batard //
73b1364609SPete Batard // EFIAPI - prototype calling convention for EFI function pointers
74b1364609SPete Batard // BOOTSERVICE - prototype for implementation of a boot service interface
75b1364609SPete Batard // RUNTIMESERVICE - prototype for implementation of a runtime service interface
76b1364609SPete Batard // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service
77b1364609SPete Batard // RUNTIME_CODE - pragma macro for declaring runtime code
78b1364609SPete Batard //
79b1364609SPete Batard #ifndef EFIAPI                  // Forces EFI calling conventions reguardless of compiler options
80b1364609SPete Batard #define EFIAPI                  // Substitute expresion to force C calling convention
81b1364609SPete Batard #endif
82b1364609SPete Batard #define BOOTSERVICE
83b1364609SPete Batard #define RUNTIMESERVICE
84b1364609SPete Batard #define RUNTIMEFUNCTION
85b1364609SPete Batard #define RUNTIME_CODE(a)         alloc_text("rtcode", a)
86b1364609SPete Batard #define BEGIN_RUNTIME_DATA()    data_seg("rtdata")
87b1364609SPete Batard #define END_RUNTIME_DATA()      data_seg("")
88b1364609SPete Batard 
89b1364609SPete Batard #define VOLATILE                volatile
90b1364609SPete Batard #define MEMORY_FENCE            __sync_synchronize
91b1364609SPete Batard 
92b1364609SPete Batard //
93b1364609SPete Batard // When build similiar to FW, then link everything together as
94b1364609SPete Batard // one big module. For the MSVC toolchain, we simply tell the
95b1364609SPete Batard // linker what our driver init function is using /ENTRY.
96b1364609SPete Batard //
97b1364609SPete Batard #if defined(_MSC_EXTENSIONS)
98b1364609SPete Batard #define EFI_DRIVER_ENTRY_POINT(InitFunction) \
99b1364609SPete Batard     __pragma(comment(linker, "/ENTRY:" # InitFunction))
100b1364609SPete Batard #else
101b1364609SPete Batard #define EFI_DRIVER_ENTRY_POINT(InitFunction)    \
102b1364609SPete Batard     UINTN                                       \
103b1364609SPete Batard     InitializeDriver (                          \
104b1364609SPete Batard         VOID    *ImageHandle,                   \
105b1364609SPete Batard         VOID    *SystemTable                    \
106b1364609SPete Batard         )                                       \
107b1364609SPete Batard     {                                           \
108b1364609SPete Batard         return InitFunction(ImageHandle,        \
109b1364609SPete Batard                 SystemTable);                   \
110b1364609SPete Batard     }                                           \
111b1364609SPete Batard                                                 \
112b1364609SPete Batard     EFI_STATUS efi_main(                        \
113b1364609SPete Batard         EFI_HANDLE image,                       \
114b1364609SPete Batard         EFI_SYSTEM_TABLE *systab                \
115b1364609SPete Batard         ) __attribute__((weak,                  \
116b1364609SPete Batard                 alias ("InitializeDriver")));
117b1364609SPete Batard #endif
118b1364609SPete Batard 
119b1364609SPete Batard #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \
120b1364609SPete Batard    (_if)->LoadInternal(type, name, entry)
121b1364609SPete Batard 
122b1364609SPete Batard //
123b1364609SPete Batard // Some compilers don't support the forward reference construct:
124b1364609SPete Batard //  typedef struct XXXXX
125b1364609SPete Batard //
126b1364609SPete Batard // The following macro provide a workaround for such cases.
127b1364609SPete Batard #define INTERFACE_DECL(x)       struct x
128b1364609SPete Batard 
129b1364609SPete Batard #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__)
130b5f98d40SHeinrich Schuchardt #define EFI_FUNCTION
131