]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/powerpc/dl-procinfo.h
Update copyright notices with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / powerpc / dl-procinfo.h
CommitLineData
857a1627 1/* Processor capability information handling macros. PowerPC version.
d4697bc9 2 Copyright (C) 2005-2014 Free Software Foundation, Inc.
857a1627
RM
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
fac0c5f2 16 License along with the GNU C Library. If not, see
59ba27a6 17 <http://www.gnu.org/licenses/>. */
857a1627
RM
18
19#ifndef _DL_PROCINFO_H
fac0c5f2 20#define _DL_PROCINFO_H 1
857a1627
RM
21
22#include <ldsodefs.h>
89cd9569 23#include <sysdep.h> /* This defines the PPC_FEATURE[2]_* macros. */
857a1627 24
1642331d
UD
25/* There are 25 bits used, but they are bits 7..31. */
26#define _DL_HWCAP_FIRST 7
89cd9569
RA
27
28/* The total number of available bits (including those prior to
29 _DL_HWCAP_FIRST). Some of these bits might not be used. */
30#define _DL_HWCAP_COUNT 64
31
32/* Features started at bit 31 and decremented as new features were added. */
33#define _DL_HWCAP_LAST 31
34
35/* AT_HWCAP2 features started at bit 31 and decremented as new features were
36 added. HWCAP2 feature bits start at bit 0. */
37#define _DL_HWCAP2_LAST 31
857a1627
RM
38
39/* These bits influence library search. */
594d423a
UD
40#define HWCAP_IMPORTANT (PPC_FEATURE_HAS_ALTIVEC \
41 + PPC_FEATURE_HAS_DFP)
857a1627 42
2f063a6e 43#define _DL_PLATFORMS_COUNT 14
4cd3633d 44
fac0c5f2 45#define _DL_FIRST_PLATFORM 32
4cd3633d 46/* Mask to filter out platforms. */
fac0c5f2
RA
47#define _DL_HWCAP_PLATFORM (((1ULL << _DL_PLATFORMS_COUNT) - 1) \
48 << _DL_FIRST_PLATFORM)
857a1627 49
594d423a
UD
50/* Platform bits (relative to _DL_FIRST_PLATFORM). */
51#define PPC_PLATFORM_POWER4 0
52#define PPC_PLATFORM_PPC970 1
53#define PPC_PLATFORM_POWER5 2
54#define PPC_PLATFORM_POWER5_PLUS 3
55#define PPC_PLATFORM_POWER6 4
56#define PPC_PLATFORM_CELL_BE 5
57#define PPC_PLATFORM_POWER6X 6
1642331d 58#define PPC_PLATFORM_POWER7 7
d0b9e94f 59#define PPC_PLATFORM_PPCA2 8
fac0c5f2
RA
60#define PPC_PLATFORM_PPC405 9
61#define PPC_PLATFORM_PPC440 10
62#define PPC_PLATFORM_PPC464 11
63#define PPC_PLATFORM_PPC476 12
2f063a6e 64#define PPC_PLATFORM_POWER8 13
594d423a 65
857a1627
RM
66static inline const char *
67__attribute__ ((unused))
68_dl_hwcap_string (int idx)
69{
70 return GLRO(dl_powerpc_cap_flags)[idx - _DL_HWCAP_FIRST];
4cd3633d
UD
71}
72
73static inline const char *
74__attribute__ ((unused))
75_dl_platform_string (int idx)
76{
77 return GLRO(dl_powerpc_platforms)[idx - _DL_FIRST_PLATFORM];
78}
857a1627
RM
79
80static inline int
81__attribute__ ((unused))
82_dl_string_hwcap (const char *str)
83{
84 for (int i = _DL_HWCAP_FIRST; i < _DL_HWCAP_COUNT; ++i)
85 if (strcmp (str, _dl_hwcap_string (i)) == 0)
86 return i;
87 return -1;
4cd3633d
UD
88}
89
90static inline int
91__attribute__ ((unused, always_inline))
92_dl_string_platform (const char *str)
93{
94 if (str == NULL)
95 return -1;
96
594d423a 97 if (strncmp (str, GLRO(dl_powerpc_platforms)[PPC_PLATFORM_POWER4], 5) == 0)
4cd3633d
UD
98 {
99 int ret;
100 str += 5;
101 switch (*str)
102 {
103 case '4':
594d423a 104 ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER4;
4cd3633d
UD
105 break;
106 case '5':
594d423a 107 ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER5;
4cd3633d 108 if (str[1] == '+')
594d423a
UD
109 {
110 ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER5_PLUS;
111 ++str;
112 }
4cd3633d
UD
113 break;
114 case '6':
594d423a
UD
115 ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER6;
116 if (str[1] == 'x')
117 {
118 ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER6X;
119 ++str;
120 }
4cd3633d 121 break;
1642331d
UD
122 case '7':
123 ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER7;
124 break;
2f063a6e
RA
125 case '8':
126 ret = _DL_FIRST_PLATFORM + PPC_PLATFORM_POWER8;
127 break;
4cd3633d
UD
128 default:
129 return -1;
130 }
131 if (str[1] == '\0')
fac0c5f2 132 return ret;
4cd3633d 133 }
594d423a
UD
134 else if (strncmp (str, GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPC970],
135 3) == 0)
4cd3633d 136 {
594d423a
UD
137 if (strcmp (str + 3, GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPC970]
138 + 3) == 0)
139 return _DL_FIRST_PLATFORM + PPC_PLATFORM_PPC970;
140 else if (strcmp (str + 3,
141 GLRO(dl_powerpc_platforms)[PPC_PLATFORM_CELL_BE] + 3)
142 == 0)
143 return _DL_FIRST_PLATFORM + PPC_PLATFORM_CELL_BE;
d0b9e94f
MB
144 else if (strcmp (str + 3,
145 GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPCA2] + 3)
146 == 0)
147 return _DL_FIRST_PLATFORM + PPC_PLATFORM_PPCA2;
fac0c5f2
RA
148 else if (strcmp (str + 3,
149 GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPC405] + 3)
150 == 0)
151 return _DL_FIRST_PLATFORM + PPC_PLATFORM_PPC405;
152 else if (strcmp (str + 3,
153 GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPC440] + 3)
154 == 0)
155 return _DL_FIRST_PLATFORM + PPC_PLATFORM_PPC440;
156 else if (strcmp (str + 3,
157 GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPC464] + 3)
158 == 0)
159 return _DL_FIRST_PLATFORM + PPC_PLATFORM_PPC464;
160 else if (strcmp (str + 3,
161 GLRO(dl_powerpc_platforms)[PPC_PLATFORM_PPC476] + 3)
162 == 0)
163 return _DL_FIRST_PLATFORM + PPC_PLATFORM_PPC476;
4cd3633d
UD
164 }
165
166 return -1;
167}
857a1627
RM
168
169#ifdef IS_IN_rtld
170static inline int
171__attribute__ ((unused))
1ae8bfe0 172_dl_procinfo (unsigned int type, unsigned long int word)
857a1627 173{
89cd9569
RA
174 switch(type)
175 {
176 case AT_HWCAP:
177 _dl_printf ("AT_HWCAP: ");
178
179 for (int i = _DL_HWCAP_FIRST; i <= _DL_HWCAP_LAST; ++i)
180 if (word & (1 << i))
181 _dl_printf (" %s", _dl_hwcap_string (i));
182 break;
183 case AT_HWCAP2:
184 {
185 unsigned int offset = _DL_HWCAP_LAST + 1;
186
187 _dl_printf ("AT_HWCAP2: ");
188
189 /* We have to go through them all because the kernel added the
190 AT_HWCAP2 features starting with the high bits. */
191 for (int i = 0; i <= _DL_HWCAP2_LAST; ++i)
192 if (word & (1 << i))
193 _dl_printf (" %s", _dl_hwcap_string (offset + i));
194 break;
195 }
196 default:
197 /* This should not happen. */
198 return -1;
199 }
200 _dl_printf ("\n");
857a1627
RM
201 return 0;
202}
203#endif
204
205#endif /* dl-procinfo.h */