]>
Commit | Line | Data |
---|---|---|
099524d7 LP |
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 | ||
cf0fbc49 | 22 | #include "architecture.h" |
a8fbdf54 | 23 | #include "macro.h" |
8b43440b | 24 | #include "string-table.h" |
07630cea | 25 | #include "string-util.h" |
099524d7 | 26 | |
592fd144 | 27 | int uname_architecture(void) { |
099524d7 LP |
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 | * | |
45afd519 | 39 | * We do not try to distinguish CPUs not CPU features, but |
099524d7 LP |
40 | * actual architectures, i.e. that have genuinely different |
41 | * code. */ | |
42 | ||
43 | static const struct { | |
44 | const char *machine; | |
592fd144 | 45 | int arch; |
099524d7 LP |
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 }, | |
ae0e60fb | 55 | { "ppc64le", ARCHITECTURE_PPC64_LE }, |
099524d7 | 56 | { "ppc", ARCHITECTURE_PPC }, |
ae0e60fb | 57 | { "ppcle", ARCHITECTURE_PPC_LE }, |
099524d7 LP |
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 }, | |
cd042078 | 66 | #elif defined(__sparc__) |
099524d7 LP |
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__) | |
3a867c6a JPAG |
112 | { "sh5", ARCHITECTURE_SH64 }, |
113 | { "sh2", ARCHITECTURE_SH }, | |
114 | { "sh2a", ARCHITECTURE_SH }, | |
115 | { "sh3", ARCHITECTURE_SH }, | |
116 | { "sh4", ARCHITECTURE_SH }, | |
117 | { "sh4a", ARCHITECTURE_SH }, | |
099524d7 LP |
118 | #elif defined(__m68k__) |
119 | { "m68k", ARCHITECTURE_M68K }, | |
46eea341 HGB |
120 | #elif defined(__tilegx__) |
121 | { "tilegx", ARCHITECTURE_TILEGX }, | |
86bafac9 | 122 | #elif defined(__cris__) |
9b3a0ba3 | 123 | { "crisv32", ARCHITECTURE_CRIS }, |
b79660e6 ZJS |
124 | #elif defined(__nios2__) |
125 | { "nios2", ARCHITECTURE_NIOS2 }, | |
171b5338 RJ |
126 | #elif defined(__riscv__) |
127 | { "riscv32", ARCHITECTURE_RISCV32 }, | |
128 | { "riscv64", ARCHITECTURE_RISCV64 }, | |
129 | # if __SIZEOF_POINTER__ == 4 | |
130 | { "riscv", ARCHITECTURE_RISCV32 }, | |
131 | # elif __SIZEOF_POINTER__ == 8 | |
132 | { "riscv", ARCHITECTURE_RISCV64 }, | |
133 | # endif | |
099524d7 LP |
134 | #else |
135 | #error "Please register your architecture here!" | |
136 | #endif | |
137 | }; | |
138 | ||
592fd144 | 139 | static int cached = _ARCHITECTURE_INVALID; |
099524d7 LP |
140 | struct utsname u; |
141 | unsigned i; | |
142 | ||
143 | if (cached != _ARCHITECTURE_INVALID) | |
144 | return cached; | |
145 | ||
146 | assert_se(uname(&u) >= 0); | |
147 | ||
148 | for (i = 0; i < ELEMENTSOF(arch_map); i++) | |
149 | if (streq(arch_map[i].machine, u.machine)) | |
150 | return cached = arch_map[i].arch; | |
151 | ||
152 | assert_not_reached("Couldn't identify architecture. You need to patch systemd."); | |
153 | return _ARCHITECTURE_INVALID; | |
154 | } | |
155 | ||
156 | static const char *const architecture_table[_ARCHITECTURE_MAX] = { | |
157 | [ARCHITECTURE_X86] = "x86", | |
158 | [ARCHITECTURE_X86_64] = "x86-64", | |
159 | [ARCHITECTURE_PPC] = "ppc", | |
ae0e60fb | 160 | [ARCHITECTURE_PPC_LE] = "ppc-le", |
099524d7 | 161 | [ARCHITECTURE_PPC64] = "ppc64", |
ae0e60fb | 162 | [ARCHITECTURE_PPC64_LE] = "ppc64-le", |
099524d7 LP |
163 | [ARCHITECTURE_IA64] = "ia64", |
164 | [ARCHITECTURE_PARISC] = "parisc", | |
165 | [ARCHITECTURE_PARISC64] = "parisc64", | |
166 | [ARCHITECTURE_S390] = "s390", | |
167 | [ARCHITECTURE_S390X] = "s390x", | |
168 | [ARCHITECTURE_SPARC] = "sparc", | |
169 | [ARCHITECTURE_SPARC64] = "sparc64", | |
170 | [ARCHITECTURE_MIPS] = "mips", | |
037c26d0 | 171 | [ARCHITECTURE_MIPS_LE] = "mips-le", |
099524d7 | 172 | [ARCHITECTURE_MIPS64] = "mips64", |
037c26d0 | 173 | [ARCHITECTURE_MIPS64_LE] = "mips64-le", |
099524d7 LP |
174 | [ARCHITECTURE_ALPHA] = "alpha", |
175 | [ARCHITECTURE_ARM] = "arm", | |
176 | [ARCHITECTURE_ARM_BE] = "arm-be", | |
177 | [ARCHITECTURE_ARM64] = "arm64", | |
178 | [ARCHITECTURE_ARM64_BE] = "arm64-be", | |
179 | [ARCHITECTURE_SH] = "sh", | |
180 | [ARCHITECTURE_SH64] = "sh64", | |
181 | [ARCHITECTURE_M68K] = "m68k", | |
46eea341 | 182 | [ARCHITECTURE_TILEGX] = "tilegx", |
86bafac9 | 183 | [ARCHITECTURE_CRIS] = "cris", |
b79660e6 | 184 | [ARCHITECTURE_NIOS2] = "nios2", |
171b5338 RJ |
185 | [ARCHITECTURE_RISCV32] = "riscv32", |
186 | [ARCHITECTURE_RISCV64] = "riscv64", | |
099524d7 LP |
187 | }; |
188 | ||
592fd144 | 189 | DEFINE_STRING_TABLE_LOOKUP(architecture, int); |