]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/architecture.c
tree-wide: drop 'This file is part of systemd' blurb
[thirdparty/systemd.git] / src / basic / architecture.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
099524d7 2/***
099524d7 3 Copyright 2014 Lennart Poettering
099524d7
LP
4***/
5
6#include <sys/utsname.h>
7
cf0fbc49 8#include "architecture.h"
a8fbdf54 9#include "macro.h"
8b43440b 10#include "string-table.h"
07630cea 11#include "string-util.h"
099524d7 12
592fd144 13int uname_architecture(void) {
099524d7
LP
14
15 /* Return a sanitized enum identifying the architecture we are
16 * running on. This is based on uname(), and the user may
17 * hence control what this returns by using
18 * personality(). This puts the user in control on systems
19 * that can run binaries of multiple architectures.
20 *
21 * We do not translate the string returned by uname()
22 * 1:1. Instead we try to clean it up and break down the
23 * confusion on x86 and arm in particular.
24 *
45afd519 25 * We do not try to distinguish CPUs not CPU features, but
099524d7
LP
26 * actual architectures, i.e. that have genuinely different
27 * code. */
28
29 static const struct {
30 const char *machine;
592fd144 31 int arch;
099524d7
LP
32 } arch_map[] = {
33#if defined(__x86_64__) || defined(__i386__)
34 { "x86_64", ARCHITECTURE_X86_64 },
35 { "i686", ARCHITECTURE_X86 },
36 { "i586", ARCHITECTURE_X86 },
37 { "i486", ARCHITECTURE_X86 },
38 { "i386", ARCHITECTURE_X86 },
39#elif defined(__powerpc__) || defined(__powerpc64__)
40 { "ppc64", ARCHITECTURE_PPC64 },
ae0e60fb 41 { "ppc64le", ARCHITECTURE_PPC64_LE },
099524d7 42 { "ppc", ARCHITECTURE_PPC },
ae0e60fb 43 { "ppcle", ARCHITECTURE_PPC_LE },
099524d7
LP
44#elif defined(__ia64__)
45 { "ia64", ARCHITECTURE_IA64 },
46#elif defined(__hppa__) || defined(__hppa64__)
47 { "parisc64", ARCHITECTURE_PARISC64 },
48 { "parisc", ARCHITECTURE_PARISC },
49#elif defined(__s390__) || defined(__s390x__)
50 { "s390x", ARCHITECTURE_S390X },
51 { "s390", ARCHITECTURE_S390 },
cd042078 52#elif defined(__sparc__)
099524d7
LP
53 { "sparc64", ARCHITECTURE_SPARC64 },
54 { "sparc", ARCHITECTURE_SPARC },
55#elif defined(__mips__) || defined(__mips64__)
56 { "mips64", ARCHITECTURE_MIPS64 },
57 { "mips", ARCHITECTURE_MIPS },
58#elif defined(__alpha__)
59 { "alpha" , ARCHITECTURE_ALPHA },
60#elif defined(__arm__) || defined(__aarch64__)
61 { "aarch64", ARCHITECTURE_ARM64 },
62 { "aarch64_be", ARCHITECTURE_ARM64_BE },
63 { "armv4l", ARCHITECTURE_ARM },
64 { "armv4b", ARCHITECTURE_ARM_BE },
65 { "armv4tl", ARCHITECTURE_ARM },
66 { "armv4tb", ARCHITECTURE_ARM_BE },
67 { "armv5tl", ARCHITECTURE_ARM },
68 { "armv5tb", ARCHITECTURE_ARM_BE },
69 { "armv5tel", ARCHITECTURE_ARM },
70 { "armv5teb" , ARCHITECTURE_ARM_BE },
71 { "armv5tejl", ARCHITECTURE_ARM },
72 { "armv5tejb", ARCHITECTURE_ARM_BE },
73 { "armv6l", ARCHITECTURE_ARM },
74 { "armv6b", ARCHITECTURE_ARM_BE },
75 { "armv7l", ARCHITECTURE_ARM },
76 { "armv7b", ARCHITECTURE_ARM_BE },
77 { "armv7ml", ARCHITECTURE_ARM },
78 { "armv7mb", ARCHITECTURE_ARM_BE },
79 { "armv4l", ARCHITECTURE_ARM },
80 { "armv4b", ARCHITECTURE_ARM_BE },
81 { "armv4tl", ARCHITECTURE_ARM },
82 { "armv4tb", ARCHITECTURE_ARM_BE },
83 { "armv5tl", ARCHITECTURE_ARM },
84 { "armv5tb", ARCHITECTURE_ARM_BE },
85 { "armv5tel", ARCHITECTURE_ARM },
86 { "armv5teb", ARCHITECTURE_ARM_BE },
87 { "armv5tejl", ARCHITECTURE_ARM },
88 { "armv5tejb", ARCHITECTURE_ARM_BE },
89 { "armv6l", ARCHITECTURE_ARM },
90 { "armv6b", ARCHITECTURE_ARM_BE },
91 { "armv7l", ARCHITECTURE_ARM },
92 { "armv7b", ARCHITECTURE_ARM_BE },
93 { "armv7ml", ARCHITECTURE_ARM },
94 { "armv7mb", ARCHITECTURE_ARM_BE },
95 { "armv8l", ARCHITECTURE_ARM },
96 { "armv8b", ARCHITECTURE_ARM_BE },
97#elif defined(__sh__) || defined(__sh64__)
3a867c6a
JPAG
98 { "sh5", ARCHITECTURE_SH64 },
99 { "sh2", ARCHITECTURE_SH },
100 { "sh2a", ARCHITECTURE_SH },
101 { "sh3", ARCHITECTURE_SH },
102 { "sh4", ARCHITECTURE_SH },
103 { "sh4a", ARCHITECTURE_SH },
099524d7
LP
104#elif defined(__m68k__)
105 { "m68k", ARCHITECTURE_M68K },
46eea341
HGB
106#elif defined(__tilegx__)
107 { "tilegx", ARCHITECTURE_TILEGX },
86bafac9 108#elif defined(__cris__)
9b3a0ba3 109 { "crisv32", ARCHITECTURE_CRIS },
b79660e6
ZJS
110#elif defined(__nios2__)
111 { "nios2", ARCHITECTURE_NIOS2 },
680a752c
ZJS
112#elif defined(__riscv__) || defined(__riscv)
113 /* __riscv__ is obsolete, remove in 2018 */
171b5338
RJ
114 { "riscv32", ARCHITECTURE_RISCV32 },
115 { "riscv64", ARCHITECTURE_RISCV64 },
116# if __SIZEOF_POINTER__ == 4
117 { "riscv", ARCHITECTURE_RISCV32 },
118# elif __SIZEOF_POINTER__ == 8
119 { "riscv", ARCHITECTURE_RISCV64 },
120# endif
27b09f1f
AB
121#elif defined(__arc__)
122 { "arc", ARCHITECTURE_ARC },
123 { "arceb", ARCHITECTURE_ARC_BE },
099524d7
LP
124#else
125#error "Please register your architecture here!"
126#endif
127 };
128
592fd144 129 static int cached = _ARCHITECTURE_INVALID;
099524d7
LP
130 struct utsname u;
131 unsigned i;
132
133 if (cached != _ARCHITECTURE_INVALID)
134 return cached;
135
136 assert_se(uname(&u) >= 0);
137
138 for (i = 0; i < ELEMENTSOF(arch_map); i++)
139 if (streq(arch_map[i].machine, u.machine))
140 return cached = arch_map[i].arch;
141
142 assert_not_reached("Couldn't identify architecture. You need to patch systemd.");
143 return _ARCHITECTURE_INVALID;
144}
145
146static const char *const architecture_table[_ARCHITECTURE_MAX] = {
147 [ARCHITECTURE_X86] = "x86",
148 [ARCHITECTURE_X86_64] = "x86-64",
149 [ARCHITECTURE_PPC] = "ppc",
ae0e60fb 150 [ARCHITECTURE_PPC_LE] = "ppc-le",
099524d7 151 [ARCHITECTURE_PPC64] = "ppc64",
ae0e60fb 152 [ARCHITECTURE_PPC64_LE] = "ppc64-le",
099524d7
LP
153 [ARCHITECTURE_IA64] = "ia64",
154 [ARCHITECTURE_PARISC] = "parisc",
155 [ARCHITECTURE_PARISC64] = "parisc64",
156 [ARCHITECTURE_S390] = "s390",
157 [ARCHITECTURE_S390X] = "s390x",
158 [ARCHITECTURE_SPARC] = "sparc",
159 [ARCHITECTURE_SPARC64] = "sparc64",
160 [ARCHITECTURE_MIPS] = "mips",
037c26d0 161 [ARCHITECTURE_MIPS_LE] = "mips-le",
099524d7 162 [ARCHITECTURE_MIPS64] = "mips64",
037c26d0 163 [ARCHITECTURE_MIPS64_LE] = "mips64-le",
099524d7
LP
164 [ARCHITECTURE_ALPHA] = "alpha",
165 [ARCHITECTURE_ARM] = "arm",
166 [ARCHITECTURE_ARM_BE] = "arm-be",
167 [ARCHITECTURE_ARM64] = "arm64",
168 [ARCHITECTURE_ARM64_BE] = "arm64-be",
169 [ARCHITECTURE_SH] = "sh",
170 [ARCHITECTURE_SH64] = "sh64",
171 [ARCHITECTURE_M68K] = "m68k",
46eea341 172 [ARCHITECTURE_TILEGX] = "tilegx",
86bafac9 173 [ARCHITECTURE_CRIS] = "cris",
b79660e6 174 [ARCHITECTURE_NIOS2] = "nios2",
171b5338
RJ
175 [ARCHITECTURE_RISCV32] = "riscv32",
176 [ARCHITECTURE_RISCV64] = "riscv64",
27b09f1f
AB
177 [ARCHITECTURE_ARC] = "arc",
178 [ARCHITECTURE_ARC_BE] = "arc-be",
099524d7
LP
179};
180
592fd144 181DEFINE_STRING_TABLE_LOOKUP(architecture, int);