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