xref: /aosp_15_r20/external/boringssl/src/include/openssl/target.h (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1*8fb009dcSAndroid Build Coastguard Worker /* Copyright (c) 2023, Google Inc.
2*8fb009dcSAndroid Build Coastguard Worker  *
3*8fb009dcSAndroid Build Coastguard Worker  * Permission to use, copy, modify, and/or distribute this software for any
4*8fb009dcSAndroid Build Coastguard Worker  * purpose with or without fee is hereby granted, provided that the above
5*8fb009dcSAndroid Build Coastguard Worker  * copyright notice and this permission notice appear in all copies.
6*8fb009dcSAndroid Build Coastguard Worker  *
7*8fb009dcSAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8*8fb009dcSAndroid Build Coastguard Worker  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9*8fb009dcSAndroid Build Coastguard Worker  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10*8fb009dcSAndroid Build Coastguard Worker  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11*8fb009dcSAndroid Build Coastguard Worker  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12*8fb009dcSAndroid Build Coastguard Worker  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13*8fb009dcSAndroid Build Coastguard Worker  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14*8fb009dcSAndroid Build Coastguard Worker 
15*8fb009dcSAndroid Build Coastguard Worker #ifndef OPENSSL_HEADER_TARGET_H
16*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HEADER_TARGET_H
17*8fb009dcSAndroid Build Coastguard Worker 
18*8fb009dcSAndroid Build Coastguard Worker // Preprocessor symbols that define the target platform.
19*8fb009dcSAndroid Build Coastguard Worker //
20*8fb009dcSAndroid Build Coastguard Worker // This file may be included in C, C++, and assembler and must be compatible
21*8fb009dcSAndroid Build Coastguard Worker // with each environment. It is separated out only to share code between
22*8fb009dcSAndroid Build Coastguard Worker // <openssl/base.h> and <openssl/asm_base.h>. Prefer to include those headers
23*8fb009dcSAndroid Build Coastguard Worker // instead.
24*8fb009dcSAndroid Build Coastguard Worker 
25*8fb009dcSAndroid Build Coastguard Worker #if defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64)
26*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_64_BIT
27*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_X86_64
28*8fb009dcSAndroid Build Coastguard Worker #elif defined(__x86) || defined(__i386) || defined(__i386__) || defined(_M_IX86)
29*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT
30*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_X86
31*8fb009dcSAndroid Build Coastguard Worker #elif defined(__AARCH64EL__) || defined(_M_ARM64)
32*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_64_BIT
33*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_AARCH64
34*8fb009dcSAndroid Build Coastguard Worker #elif defined(__ARMEL__) || defined(_M_ARM)
35*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT
36*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_ARM
37*8fb009dcSAndroid Build Coastguard Worker #elif defined(__MIPSEL__) && !defined(__LP64__)
38*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT
39*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_MIPS
40*8fb009dcSAndroid Build Coastguard Worker #elif defined(__MIPSEL__) && defined(__LP64__)
41*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_64_BIT
42*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_MIPS64
43*8fb009dcSAndroid Build Coastguard Worker #elif defined(__riscv) && __SIZEOF_POINTER__ == 8
44*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_64_BIT
45*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_RISCV64
46*8fb009dcSAndroid Build Coastguard Worker #elif defined(__riscv) && __SIZEOF_POINTER__ == 4
47*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT
48*8fb009dcSAndroid Build Coastguard Worker #elif defined(__pnacl__)
49*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT
50*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_PNACL
51*8fb009dcSAndroid Build Coastguard Worker #elif defined(__wasm__)
52*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT
53*8fb009dcSAndroid Build Coastguard Worker #elif defined(__asmjs__)
54*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT
55*8fb009dcSAndroid Build Coastguard Worker #elif defined(__myriad2__)
56*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_32_BIT
57*8fb009dcSAndroid Build Coastguard Worker #else
58*8fb009dcSAndroid Build Coastguard Worker // The list above enumerates the platforms that BoringSSL supports. For these
59*8fb009dcSAndroid Build Coastguard Worker // platforms we keep a reasonable bar of not breaking them: automated test
60*8fb009dcSAndroid Build Coastguard Worker // coverage, for one, but also we need access to these types for machines for
61*8fb009dcSAndroid Build Coastguard Worker // fixing them.
62*8fb009dcSAndroid Build Coastguard Worker //
63*8fb009dcSAndroid Build Coastguard Worker // However, we know that anything that seems to work will soon be expected
64*8fb009dcSAndroid Build Coastguard Worker // to work and, quickly, the implicit expectation is that every machine will
65*8fb009dcSAndroid Build Coastguard Worker // always work. So this list serves to mark the boundary of what we guarantee.
66*8fb009dcSAndroid Build Coastguard Worker // Of course, you can run the code any many more machines, but then you're
67*8fb009dcSAndroid Build Coastguard Worker // taking on the burden of fixing it and, if you're doing that, then you must
68*8fb009dcSAndroid Build Coastguard Worker // be able to carry local patches. In which case patching this list is trivial.
69*8fb009dcSAndroid Build Coastguard Worker //
70*8fb009dcSAndroid Build Coastguard Worker // BoringSSL will only possibly work on standard 32-bit and 64-bit
71*8fb009dcSAndroid Build Coastguard Worker // two's-complement, little-endian architectures. Functions will not produce
72*8fb009dcSAndroid Build Coastguard Worker // the correct answer on other systems. Run the crypto_test binary, notably
73*8fb009dcSAndroid Build Coastguard Worker // crypto/compiler_test.cc, before trying a new architecture.
74*8fb009dcSAndroid Build Coastguard Worker #error "Unknown target CPU"
75*8fb009dcSAndroid Build Coastguard Worker #endif
76*8fb009dcSAndroid Build Coastguard Worker 
77*8fb009dcSAndroid Build Coastguard Worker #if defined(__APPLE__)
78*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_APPLE
79*8fb009dcSAndroid Build Coastguard Worker #endif
80*8fb009dcSAndroid Build Coastguard Worker 
81*8fb009dcSAndroid Build Coastguard Worker #if defined(_WIN32)
82*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_WINDOWS
83*8fb009dcSAndroid Build Coastguard Worker #endif
84*8fb009dcSAndroid Build Coastguard Worker 
85*8fb009dcSAndroid Build Coastguard Worker // Trusty and Android baremetal aren't Linux but currently define __linux__.
86*8fb009dcSAndroid Build Coastguard Worker // As a workaround, we exclude them here.
87*8fb009dcSAndroid Build Coastguard Worker // We also exclude nanolibc/CrOS EC. nanolibc/CrOS EC sometimes build for a
88*8fb009dcSAndroid Build Coastguard Worker // non-Linux target (which should not define __linux__), but also sometimes
89*8fb009dcSAndroid Build Coastguard Worker // build for Linux. Although technically running in Linux userspace, this lacks
90*8fb009dcSAndroid Build Coastguard Worker // all the libc APIs we'd normally expect on Linux, so we treat it as a
91*8fb009dcSAndroid Build Coastguard Worker // non-Linux target.
92*8fb009dcSAndroid Build Coastguard Worker //
93*8fb009dcSAndroid Build Coastguard Worker // TODO(b/169780122): Remove this workaround once Trusty no longer defines it.
94*8fb009dcSAndroid Build Coastguard Worker // TODO(b/291101350): Remove this workaround once Android baremetal no longer
95*8fb009dcSAndroid Build Coastguard Worker // defines it.
96*8fb009dcSAndroid Build Coastguard Worker #if defined(__linux__) && !defined(__TRUSTY__) && \
97*8fb009dcSAndroid Build Coastguard Worker     !defined(ANDROID_BAREMETAL) && !defined(OPENSSL_NANOLIBC) && \
98*8fb009dcSAndroid Build Coastguard Worker     !defined(CROS_EC)
99*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_LINUX
100*8fb009dcSAndroid Build Coastguard Worker #endif
101*8fb009dcSAndroid Build Coastguard Worker 
102*8fb009dcSAndroid Build Coastguard Worker #if defined(__Fuchsia__)
103*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_FUCHSIA
104*8fb009dcSAndroid Build Coastguard Worker #endif
105*8fb009dcSAndroid Build Coastguard Worker 
106*8fb009dcSAndroid Build Coastguard Worker // Trusty is Android's TEE target. See
107*8fb009dcSAndroid Build Coastguard Worker // https://source.android.com/docs/security/features/trusty
108*8fb009dcSAndroid Build Coastguard Worker //
109*8fb009dcSAndroid Build Coastguard Worker // Defining this on any other platform is not supported. Other embedded
110*8fb009dcSAndroid Build Coastguard Worker // platforms must introduce their own defines.
111*8fb009dcSAndroid Build Coastguard Worker #if defined(__TRUSTY__)
112*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_TRUSTY
113*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_FILESYSTEM
114*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_POSIX_IO
115*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_SOCK
116*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED
117*8fb009dcSAndroid Build Coastguard Worker #endif
118*8fb009dcSAndroid Build Coastguard Worker 
119*8fb009dcSAndroid Build Coastguard Worker // nanolibc is a particular minimal libc implementation. Defining this on any
120*8fb009dcSAndroid Build Coastguard Worker // other platform is not supported. Other embedded platforms must introduce
121*8fb009dcSAndroid Build Coastguard Worker // their own defines.
122*8fb009dcSAndroid Build Coastguard Worker #if defined(OPENSSL_NANOLIBC)
123*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_FILESYSTEM
124*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_POSIX_IO
125*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_SOCK
126*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED
127*8fb009dcSAndroid Build Coastguard Worker #endif
128*8fb009dcSAndroid Build Coastguard Worker 
129*8fb009dcSAndroid Build Coastguard Worker // Android baremetal is an embedded target that uses a subset of bionic.
130*8fb009dcSAndroid Build Coastguard Worker // Defining this on any other platform is not supported. Other embedded
131*8fb009dcSAndroid Build Coastguard Worker // platforms must introduce their own defines.
132*8fb009dcSAndroid Build Coastguard Worker #if defined(ANDROID_BAREMETAL)
133*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_FILESYSTEM
134*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_POSIX_IO
135*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_SOCK
136*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED
137*8fb009dcSAndroid Build Coastguard Worker #endif
138*8fb009dcSAndroid Build Coastguard Worker 
139*8fb009dcSAndroid Build Coastguard Worker // CROS_EC is an embedded target for ChromeOS Embedded Controller. Defining
140*8fb009dcSAndroid Build Coastguard Worker // this on any other platform is not supported. Other embedded platforms must
141*8fb009dcSAndroid Build Coastguard Worker // introduce their own defines.
142*8fb009dcSAndroid Build Coastguard Worker //
143*8fb009dcSAndroid Build Coastguard Worker // https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/README.md
144*8fb009dcSAndroid Build Coastguard Worker #if defined(CROS_EC)
145*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_FILESYSTEM
146*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_POSIX_IO
147*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_SOCK
148*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED
149*8fb009dcSAndroid Build Coastguard Worker #endif
150*8fb009dcSAndroid Build Coastguard Worker 
151*8fb009dcSAndroid Build Coastguard Worker // Zephyr is an open source RTOS, optimized for embedded devices.
152*8fb009dcSAndroid Build Coastguard Worker // Defining this on any other platform is not supported. Other embedded
153*8fb009dcSAndroid Build Coastguard Worker // platforms must introduce their own defines.
154*8fb009dcSAndroid Build Coastguard Worker //
155*8fb009dcSAndroid Build Coastguard Worker // Zephyr supports multithreading with cooperative and preemptive scheduling.
156*8fb009dcSAndroid Build Coastguard Worker // It also implements POSIX Threads (pthread) API, so it's not necessary to
157*8fb009dcSAndroid Build Coastguard Worker // implement BoringSSL internal threading API using some custom API.
158*8fb009dcSAndroid Build Coastguard Worker //
159*8fb009dcSAndroid Build Coastguard Worker // https://www.zephyrproject.org/
160*8fb009dcSAndroid Build Coastguard Worker #if defined(__ZEPHYR__)
161*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_FILESYSTEM
162*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_POSIX_IO
163*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_SOCK
164*8fb009dcSAndroid Build Coastguard Worker #endif
165*8fb009dcSAndroid Build Coastguard Worker 
166*8fb009dcSAndroid Build Coastguard Worker #if defined(__ANDROID_API__)
167*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_ANDROID
168*8fb009dcSAndroid Build Coastguard Worker #endif
169*8fb009dcSAndroid Build Coastguard Worker 
170*8fb009dcSAndroid Build Coastguard Worker #if defined(__FreeBSD__)
171*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_FREEBSD
172*8fb009dcSAndroid Build Coastguard Worker #endif
173*8fb009dcSAndroid Build Coastguard Worker 
174*8fb009dcSAndroid Build Coastguard Worker #if defined(__OpenBSD__)
175*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_OPENBSD
176*8fb009dcSAndroid Build Coastguard Worker #endif
177*8fb009dcSAndroid Build Coastguard Worker 
178*8fb009dcSAndroid Build Coastguard Worker // BoringSSL requires platform's locking APIs to make internal global state
179*8fb009dcSAndroid Build Coastguard Worker // thread-safe, including the PRNG. On some single-threaded embedded platforms,
180*8fb009dcSAndroid Build Coastguard Worker // locking APIs may not exist, so this dependency may be disabled with the
181*8fb009dcSAndroid Build Coastguard Worker // following build flag.
182*8fb009dcSAndroid Build Coastguard Worker //
183*8fb009dcSAndroid Build Coastguard Worker // IMPORTANT: Doing so means the consumer promises the library will never be
184*8fb009dcSAndroid Build Coastguard Worker // used in any multi-threaded context. It causes BoringSSL to be globally
185*8fb009dcSAndroid Build Coastguard Worker // thread-unsafe. Setting it inappropriately will subtly and unpredictably
186*8fb009dcSAndroid Build Coastguard Worker // corrupt memory and leak secret keys.
187*8fb009dcSAndroid Build Coastguard Worker //
188*8fb009dcSAndroid Build Coastguard Worker // Do not set this flag on any platform where threads are possible. BoringSSL
189*8fb009dcSAndroid Build Coastguard Worker // maintainers will not provide support for any consumers that do so. Changes
190*8fb009dcSAndroid Build Coastguard Worker // which break such unsupported configurations will not be reverted.
191*8fb009dcSAndroid Build Coastguard Worker #if !defined(OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED)
192*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_THREADS
193*8fb009dcSAndroid Build Coastguard Worker #endif
194*8fb009dcSAndroid Build Coastguard Worker 
195*8fb009dcSAndroid Build Coastguard Worker #if defined(BORINGSSL_UNSAFE_FUZZER_MODE) && \
196*8fb009dcSAndroid Build Coastguard Worker     !defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE)
197*8fb009dcSAndroid Build Coastguard Worker #define BORINGSSL_UNSAFE_DETERMINISTIC_MODE
198*8fb009dcSAndroid Build Coastguard Worker #endif
199*8fb009dcSAndroid Build Coastguard Worker 
200*8fb009dcSAndroid Build Coastguard Worker #if defined(__has_feature)
201*8fb009dcSAndroid Build Coastguard Worker #if __has_feature(address_sanitizer)
202*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_ASAN
203*8fb009dcSAndroid Build Coastguard Worker #endif
204*8fb009dcSAndroid Build Coastguard Worker #if __has_feature(thread_sanitizer)
205*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_TSAN
206*8fb009dcSAndroid Build Coastguard Worker #endif
207*8fb009dcSAndroid Build Coastguard Worker #if __has_feature(memory_sanitizer)
208*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_MSAN
209*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_ASM_INCOMPATIBLE
210*8fb009dcSAndroid Build Coastguard Worker #endif
211*8fb009dcSAndroid Build Coastguard Worker #if __has_feature(hwaddress_sanitizer)
212*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HWASAN
213*8fb009dcSAndroid Build Coastguard Worker #endif
214*8fb009dcSAndroid Build Coastguard Worker #endif
215*8fb009dcSAndroid Build Coastguard Worker 
216*8fb009dcSAndroid Build Coastguard Worker // Disable 32-bit Arm assembly on Apple platforms. The last iOS version that
217*8fb009dcSAndroid Build Coastguard Worker // supported 32-bit Arm was iOS 10.
218*8fb009dcSAndroid Build Coastguard Worker #if defined(OPENSSL_APPLE) && defined(OPENSSL_ARM)
219*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_ASM_INCOMPATIBLE
220*8fb009dcSAndroid Build Coastguard Worker #endif
221*8fb009dcSAndroid Build Coastguard Worker 
222*8fb009dcSAndroid Build Coastguard Worker #if defined(OPENSSL_ASM_INCOMPATIBLE)
223*8fb009dcSAndroid Build Coastguard Worker #undef OPENSSL_ASM_INCOMPATIBLE
224*8fb009dcSAndroid Build Coastguard Worker #if !defined(OPENSSL_NO_ASM)
225*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_NO_ASM
226*8fb009dcSAndroid Build Coastguard Worker #endif
227*8fb009dcSAndroid Build Coastguard Worker #endif  // OPENSSL_ASM_INCOMPATIBLE
228*8fb009dcSAndroid Build Coastguard Worker 
229*8fb009dcSAndroid Build Coastguard Worker #endif  // OPENSSL_HEADER_TARGET_H
230