]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/architecture.c
Merge pull request #5600 from fbuihuu/make-logind-restartable
[thirdparty/systemd.git] / src / basic / architecture.c
1 /***
2 This file is part of systemd.
3
4 Copyright 2014 Lennart Poettering
5
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #include <sys/utsname.h>
21
22 #include "architecture.h"
23 #include "macro.h"
24 #include "string-table.h"
25 #include "string-util.h"
26
27 int uname_architecture(void) {
28
29 /* Return a sanitized enum identifying the architecture we are
30 * running on. This is based on uname(), and the user may
31 * hence control what this returns by using
32 * personality(). This puts the user in control on systems
33 * that can run binaries of multiple architectures.
34 *
35 * We do not translate the string returned by uname()
36 * 1:1. Instead we try to clean it up and break down the
37 * confusion on x86 and arm in particular.
38 *
39 * We do not try to distinguish CPUs not CPU features, but
40 * actual architectures, i.e. that have genuinely different
41 * code. */
42
43 static const struct {
44 const char *machine;
45 int arch;
46 } arch_map[] = {
47 #if defined(__x86_64__) || defined(__i386__)
48 { "x86_64", ARCHITECTURE_X86_64 },
49 { "i686", ARCHITECTURE_X86 },
50 { "i586", ARCHITECTURE_X86 },
51 { "i486", ARCHITECTURE_X86 },
52 { "i386", ARCHITECTURE_X86 },
53 #elif defined(__powerpc__) || defined(__powerpc64__)
54 { "ppc64", ARCHITECTURE_PPC64 },
55 { "ppc64le", ARCHITECTURE_PPC64_LE },
56 { "ppc", ARCHITECTURE_PPC },
57 { "ppcle", ARCHITECTURE_PPC_LE },
58 #elif defined(__ia64__)
59 { "ia64", ARCHITECTURE_IA64 },
60 #elif defined(__hppa__) || defined(__hppa64__)
61 { "parisc64", ARCHITECTURE_PARISC64 },
62 { "parisc", ARCHITECTURE_PARISC },
63 #elif defined(__s390__) || defined(__s390x__)
64 { "s390x", ARCHITECTURE_S390X },
65 { "s390", ARCHITECTURE_S390 },
66 #elif defined(__sparc__)
67 { "sparc64", ARCHITECTURE_SPARC64 },
68 { "sparc", ARCHITECTURE_SPARC },
69 #elif defined(__mips__) || defined(__mips64__)
70 { "mips64", ARCHITECTURE_MIPS64 },
71 { "mips", ARCHITECTURE_MIPS },
72 #elif defined(__alpha__)
73 { "alpha" , ARCHITECTURE_ALPHA },
74 #elif defined(__arm__) || defined(__aarch64__)
75 { "aarch64", ARCHITECTURE_ARM64 },
76 { "aarch64_be", ARCHITECTURE_ARM64_BE },
77 { "armv4l", ARCHITECTURE_ARM },
78 { "armv4b", ARCHITECTURE_ARM_BE },
79 { "armv4tl", ARCHITECTURE_ARM },
80 { "armv4tb", ARCHITECTURE_ARM_BE },
81 { "armv5tl", ARCHITECTURE_ARM },
82 { "armv5tb", ARCHITECTURE_ARM_BE },
83 { "armv5tel", ARCHITECTURE_ARM },
84 { "armv5teb" , ARCHITECTURE_ARM_BE },
85 { "armv5tejl", ARCHITECTURE_ARM },
86 { "armv5tejb", ARCHITECTURE_ARM_BE },
87 { "armv6l", ARCHITECTURE_ARM },
88 { "armv6b", ARCHITECTURE_ARM_BE },
89 { "armv7l", ARCHITECTURE_ARM },
90 { "armv7b", ARCHITECTURE_ARM_BE },
91 { "armv7ml", ARCHITECTURE_ARM },
92 { "armv7mb", ARCHITECTURE_ARM_BE },
93 { "armv4l", ARCHITECTURE_ARM },
94 { "armv4b", ARCHITECTURE_ARM_BE },
95 { "armv4tl", ARCHITECTURE_ARM },
96 { "armv4tb", ARCHITECTURE_ARM_BE },
97 { "armv5tl", ARCHITECTURE_ARM },
98 { "armv5tb", ARCHITECTURE_ARM_BE },
99 { "armv5tel", ARCHITECTURE_ARM },
100 { "armv5teb", ARCHITECTURE_ARM_BE },
101 { "armv5tejl", ARCHITECTURE_ARM },
102 { "armv5tejb", ARCHITECTURE_ARM_BE },
103 { "armv6l", ARCHITECTURE_ARM },
104 { "armv6b", ARCHITECTURE_ARM_BE },
105 { "armv7l", ARCHITECTURE_ARM },
106 { "armv7b", ARCHITECTURE_ARM_BE },
107 { "armv7ml", ARCHITECTURE_ARM },
108 { "armv7mb", ARCHITECTURE_ARM_BE },
109 { "armv8l", ARCHITECTURE_ARM },
110 { "armv8b", ARCHITECTURE_ARM_BE },
111 #elif defined(__sh__) || defined(__sh64__)
112 { "sh5", ARCHITECTURE_SH64 },
113 { "sh2", ARCHITECTURE_SH },
114 { "sh2a", ARCHITECTURE_SH },
115 { "sh3", ARCHITECTURE_SH },
116 { "sh4", ARCHITECTURE_SH },
117 { "sh4a", ARCHITECTURE_SH },
118 #elif defined(__m68k__)
119 { "m68k", ARCHITECTURE_M68K },
120 #elif defined(__tilegx__)
121 { "tilegx", ARCHITECTURE_TILEGX },
122 #elif defined(__cris__)
123 { "crisv32", ARCHITECTURE_CRIS },
124 #elif defined(__nios2__)
125 { "nios2", ARCHITECTURE_NIOS2 },
126 #elif defined(__riscv__) || defined(__riscv)
127 /* __riscv__ is obsolete, remove in 2018 */
128 { "riscv32", ARCHITECTURE_RISCV32 },
129 { "riscv64", ARCHITECTURE_RISCV64 },
130 # if __SIZEOF_POINTER__ == 4
131 { "riscv", ARCHITECTURE_RISCV32 },
132 # elif __SIZEOF_POINTER__ == 8
133 { "riscv", ARCHITECTURE_RISCV64 },
134 # endif
135 #elif defined(__arc__)
136 { "arc", ARCHITECTURE_ARC },
137 { "arceb", ARCHITECTURE_ARC_BE },
138 #else
139 #error "Please register your architecture here!"
140 #endif
141 };
142
143 static int cached = _ARCHITECTURE_INVALID;
144 struct utsname u;
145 unsigned i;
146
147 if (cached != _ARCHITECTURE_INVALID)
148 return cached;
149
150 assert_se(uname(&u) >= 0);
151
152 for (i = 0; i < ELEMENTSOF(arch_map); i++)
153 if (streq(arch_map[i].machine, u.machine))
154 return cached = arch_map[i].arch;
155
156 assert_not_reached("Couldn't identify architecture. You need to patch systemd.");
157 return _ARCHITECTURE_INVALID;
158 }
159
160 static const char *const architecture_table[_ARCHITECTURE_MAX] = {
161 [ARCHITECTURE_X86] = "x86",
162 [ARCHITECTURE_X86_64] = "x86-64",
163 [ARCHITECTURE_PPC] = "ppc",
164 [ARCHITECTURE_PPC_LE] = "ppc-le",
165 [ARCHITECTURE_PPC64] = "ppc64",
166 [ARCHITECTURE_PPC64_LE] = "ppc64-le",
167 [ARCHITECTURE_IA64] = "ia64",
168 [ARCHITECTURE_PARISC] = "parisc",
169 [ARCHITECTURE_PARISC64] = "parisc64",
170 [ARCHITECTURE_S390] = "s390",
171 [ARCHITECTURE_S390X] = "s390x",
172 [ARCHITECTURE_SPARC] = "sparc",
173 [ARCHITECTURE_SPARC64] = "sparc64",
174 [ARCHITECTURE_MIPS] = "mips",
175 [ARCHITECTURE_MIPS_LE] = "mips-le",
176 [ARCHITECTURE_MIPS64] = "mips64",
177 [ARCHITECTURE_MIPS64_LE] = "mips64-le",
178 [ARCHITECTURE_ALPHA] = "alpha",
179 [ARCHITECTURE_ARM] = "arm",
180 [ARCHITECTURE_ARM_BE] = "arm-be",
181 [ARCHITECTURE_ARM64] = "arm64",
182 [ARCHITECTURE_ARM64_BE] = "arm64-be",
183 [ARCHITECTURE_SH] = "sh",
184 [ARCHITECTURE_SH64] = "sh64",
185 [ARCHITECTURE_M68K] = "m68k",
186 [ARCHITECTURE_TILEGX] = "tilegx",
187 [ARCHITECTURE_CRIS] = "cris",
188 [ARCHITECTURE_NIOS2] = "nios2",
189 [ARCHITECTURE_RISCV32] = "riscv32",
190 [ARCHITECTURE_RISCV64] = "riscv64",
191 [ARCHITECTURE_ARC] = "arc",
192 [ARCHITECTURE_ARC_BE] = "arc-be",
193 };
194
195 DEFINE_STRING_TABLE_LOOKUP(architecture, int);