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