]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/architecture.h
Merge pull request #2708 from vcaputo/journal-restore-offline-state-on-error
[thirdparty/systemd.git] / src / basic / architecture.h
1 #pragma once
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2014 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <endian.h>
23
24 #include "macro.h"
25 #include "util.h"
26
27 /* A cleaned up architecture definition. We don't want to get lost in
28 * processor features, models, generations or even ABIs. Hence we
29 * focus on general family, and distinguish word width and
30 * endianness. */
31
32 enum {
33 ARCHITECTURE_X86 = 0,
34 ARCHITECTURE_X86_64,
35 ARCHITECTURE_PPC,
36 ARCHITECTURE_PPC_LE,
37 ARCHITECTURE_PPC64,
38 ARCHITECTURE_PPC64_LE,
39 ARCHITECTURE_IA64,
40 ARCHITECTURE_PARISC,
41 ARCHITECTURE_PARISC64,
42 ARCHITECTURE_S390,
43 ARCHITECTURE_S390X,
44 ARCHITECTURE_SPARC,
45 ARCHITECTURE_SPARC64,
46 ARCHITECTURE_MIPS,
47 ARCHITECTURE_MIPS_LE,
48 ARCHITECTURE_MIPS64,
49 ARCHITECTURE_MIPS64_LE,
50 ARCHITECTURE_ALPHA,
51 ARCHITECTURE_ARM,
52 ARCHITECTURE_ARM_BE,
53 ARCHITECTURE_ARM64,
54 ARCHITECTURE_ARM64_BE,
55 ARCHITECTURE_SH,
56 ARCHITECTURE_SH64,
57 ARCHITECTURE_M68K,
58 ARCHITECTURE_TILEGX,
59 ARCHITECTURE_CRIS,
60 _ARCHITECTURE_MAX,
61 _ARCHITECTURE_INVALID = -1
62 };
63
64 int uname_architecture(void);
65
66 /*
67 * LIB_ARCH_TUPLE should resolve to the local library path
68 * architecture tuple systemd is built for, according to the Debian
69 * tuple list:
70 *
71 * https://wiki.debian.org/Multiarch/Tuples
72 *
73 * This is used in library search paths that should understand
74 * Debian's paths on all distributions.
75 */
76
77 #if defined(__x86_64__)
78 # define native_architecture() ARCHITECTURE_X86_64
79 # define LIB_ARCH_TUPLE "x86_64-linux-gnu"
80 # define PROC_CPUINFO_MODEL "model name"
81 # define SECONDARY_ARCHITECTURE ARCHITECTURE_X86
82 #elif defined(__i386__)
83 # define native_architecture() ARCHITECTURE_X86
84 # define LIB_ARCH_TUPLE "i386-linux-gnu"
85 # define PROC_CPUINFO_MODEL "model name"
86 #elif defined(__powerpc64__)
87 # if __BYTE_ORDER == __BIG_ENDIAN
88 # define native_architecture() ARCHITECTURE_PPC64
89 # define LIB_ARCH_TUPLE "ppc64-linux-gnu"
90 # define SECONDARY_ARCHITECTURE ARCHITECTURE_PPC
91 # else
92 # define native_architecture() ARCHITECTURE_PPC64_LE
93 # define LIB_ARCH_TUPLE "powerpc64le-linux-gnu"
94 # define SECONDARY_ARCHITECTURE ARCHITECTURE_PPC_LE
95 # endif
96 # define PROC_CPUINFO_MODEL "cpu"
97 #elif defined(__powerpc__)
98 # if __BYTE_ORDER == __BIG_ENDIAN
99 # define native_architecture() ARCHITECTURE_PPC
100 # define LIB_ARCH_TUPLE "powerpc-linux-gnu"
101 # else
102 # define native_architecture() ARCHITECTURE_PPC_LE
103 # error "Missing LIB_ARCH_TUPLE for PPCLE"
104 # endif
105 # define PROC_CPUINFO_MODEL "cpu"
106 #elif defined(__ia64__)
107 # define native_architecture() ARCHITECTURE_IA64
108 # define LIB_ARCH_TUPLE "ia64-linux-gnu"
109 #elif defined(__hppa64__)
110 # define native_architecture() ARCHITECTURE_PARISC64
111 # error "Missing LIB_ARCH_TUPLE for HPPA64"
112 # define PROC_CPUINFO_MODEL "cpu"
113 #elif defined(__hppa__)
114 # define native_architecture() ARCHITECTURE_PARISC
115 # define LIB_ARCH_TUPLE "hppa‑linux‑gnu"
116 # define PROC_CPUINFO_MODEL "cpu"
117 #elif defined(__s390x__)
118 # define native_architecture() ARCHITECTURE_S390X
119 # define LIB_ARCH_TUPLE "s390x-linux-gnu"
120 # define SECONDARY_ARCHITECTURE ARCHITECTURE_S390
121 #elif defined(__s390__)
122 # define native_architecture() ARCHITECTURE_S390
123 # define LIB_ARCH_TUPLE "s390-linux-gnu"
124 #elif defined(__sparc64__)
125 # define native_architecture() ARCHITECTURE_SPARC64
126 # define LIB_ARCH_TUPLE "sparc64-linux-gnu"
127 # define PROC_CPUINFO_MODEL "cpu"
128 #elif defined(__sparc__)
129 # define native_architecture() ARCHITECTURE_SPARC
130 # define LIB_ARCH_TUPLE "sparc-linux-gnu"
131 # define PROC_CPUINFO_MODEL "cpu"
132 #elif defined(__mips64__)
133 # if __BYTE_ORDER == __BIG_ENDIAN
134 # define native_architecture() ARCHITECTURE_MIPS64
135 # error "Missing LIB_ARCH_TUPLE for MIPS64"
136 # else
137 # define native_architecture() ARCHITECTURE_MIPS64_LE
138 # error "Missing LIB_ARCH_TUPLE for MIPS64_LE"
139 # endif
140 # define PROC_CPUINFO_MODEL "cpu model"
141 #elif defined(__mips__)
142 # if __BYTE_ORDER == __BIG_ENDIAN
143 # define native_architecture() ARCHITECTURE_MIPS
144 # define LIB_ARCH_TUPLE "mips-linux-gnu"
145 # else
146 # define native_architecture() ARCHITECTURE_MIPS_LE
147 # define LIB_ARCH_TUPLE "mipsel-linux-gnu"
148 # endif
149 # define PROC_CPUINFO_MODEL "cpu model"
150 #elif defined(__alpha__)
151 # define native_architecture() ARCHITECTURE_ALPHA
152 # define LIB_ARCH_TUPLE "alpha-linux-gnu"
153 #elif defined(__aarch64__)
154 # if __BYTE_ORDER == __BIG_ENDIAN
155 # define native_architecture() ARCHITECTURE_ARM64_BE
156 # define LIB_ARCH_TUPLE "aarch64_be-linux-gnu"
157 # else
158 # define native_architecture() ARCHITECTURE_ARM64
159 # define LIB_ARCH_TUPLE "aarch64-linux-gnu"
160 # endif
161 #elif defined(__arm__)
162 # if __BYTE_ORDER == __BIG_ENDIAN
163 # define native_architecture() ARCHITECTURE_ARM_BE
164 # if defined(__ARM_EABI__)
165 # if defined(__ARM_PCS_VFP)
166 # define LIB_ARCH_TUPLE "armeb-linux-gnueabihf"
167 # else
168 # define LIB_ARCH_TUPLE "armeb-linux-gnueabi"
169 # endif
170 # else
171 # define LIB_ARCH_TUPLE "armeb-linux-gnu"
172 # endif
173 # else
174 # define native_architecture() ARCHITECTURE_ARM
175 # if defined(__ARM_EABI__)
176 # if defined(__ARM_PCS_VFP)
177 # define LIB_ARCH_TUPLE "arm-linux-gnueabihf"
178 # else
179 # define LIB_ARCH_TUPLE "arm-linux-gnueabi"
180 # endif
181 # else
182 # define LIB_ARCH_TUPLE "arm-linux-gnu"
183 # endif
184 # endif
185 # define PROC_CPUINFO_MODEL "model name"
186 #elif defined(__sh64__)
187 # define native_architecture() ARCHITECTURE_SH64
188 # error "Missing LIB_ARCH_TUPLE for SH64"
189 #elif defined(__sh__)
190 # define native_architecture() ARCHITECTURE_SH
191 # define LIB_ARCH_TUPLE "sh4-linux-gnu"
192 #elif defined(__m68k__)
193 # define native_architecture() ARCHITECTURE_M68K
194 # define LIB_ARCH_TUPLE "m68k-linux-gnu"
195 #elif defined(__tilegx__)
196 # define native_architecture() ARCHITECTURE_TILEGX
197 # error "Missing LIB_ARCH_TUPLE for TILEGX"
198 #elif defined(__cris__)
199 # define native_architecture() ARCHITECTURE_CRIS
200 # error "Missing LIB_ARCH_TUPLE for CRIS"
201 #else
202 # error "Please register your architecture here!"
203 #endif
204
205 #ifndef PROC_CPUINFO_MODEL
206 #warning "PROC_CPUINFO_MODEL not defined for your architecture"
207 #define PROC_CPUINFO_MODEL "model name"
208 #endif
209
210 const char *architecture_to_string(int a) _const_;
211 int architecture_from_string(const char *s) _pure_;