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