Line data Source code
1 : /* Object attribute tags for SPARC.
2 : Copyright (C) 2015 Oracle, Inc.
3 : This file is part of elfutils.
4 :
5 : This file is free software; you can redistribute it and/or modify
6 : it under the terms of either
7 :
8 : * the GNU Lesser General Public License as published by the Free
9 : Software Foundation; either version 3 of the License, or (at
10 : your option) any later version
11 :
12 : or
13 :
14 : * the GNU General Public License as published by the Free
15 : Software Foundation; either version 2 of the License, or (at
16 : your option) any later version
17 :
18 : or both in parallel, as here.
19 :
20 : elfutils is distributed in the hope that it will be useful, but
21 : WITHOUT ANY WARRANTY; without even the implied warranty of
22 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 : General Public License for more details.
24 :
25 : You should have received copies of the GNU General Public License and
26 : the GNU Lesser General Public License along with this program. If
27 : not, see <http://www.gnu.org/licenses/>. */
28 :
29 : #ifdef HAVE_CONFIG_H
30 : # include <config.h>
31 : #endif
32 :
33 : #include <string.h>
34 : #include <dwarf.h>
35 :
36 : #define BACKEND sparc_
37 : #include "libebl_CPU.h"
38 :
39 : bool
40 2 : sparc_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
41 : const char *vendor, int tag, uint64_t value,
42 : const char **tag_name, const char **value_name)
43 : {
44 2 : static const char *hwcaps[32] =
45 : {
46 : "mul32", "div32", "fsmuld", "v8plus", "popc", "vis", "vis2",
47 : "asi_blk_init", "fmaf", "vis3", "hpc", "random", "trans",
48 : "fjfmau", "ima", "asi_cache_sparing", "aes", "des", "kasumi",
49 : "camellia", "md5", "sha1", "sha256", "sha512", "mpmul", "mont",
50 : "pause", "cbcond", "crc32c", "resv30", "resv31"
51 : };
52 :
53 :
54 2 : static const char *hwcaps2[32] =
55 : {
56 : "fjathplus", "vis3b", "adp", "sparc5", "mwait", "xmpmul", "xmont",
57 : "nsec", "resv8", "resv9" , "resv10", "resv11", "fjathhpc", "fjdes",
58 : "fjaes", "resv15", "resv16", "resv17", "resv18", "resv19", "resv20",
59 : "resv21", "resv22", "resv23", "resv24", "resv25", "resv26", "resv27",
60 : "resv28", "resv29", "resv30", "resv31",
61 : };
62 :
63 : /* NAME should be big enough to hold any possible comma-separated
64 : list (no repetitions allowed) of attribute names from one of the
65 : arrays above. */
66 2 : static char name[32*17+32+1];
67 2 : name[0] = '\0';
68 :
69 2 : if (!strcmp (vendor, "gnu"))
70 2 : switch (tag)
71 : {
72 2 : case 4:
73 : case 8:
74 : {
75 2 : const char **caps;
76 2 : int cap;
77 :
78 2 : if (tag == 4)
79 : {
80 1 : *tag_name = "GNU_Sparc_HWCAPS";
81 1 : caps = hwcaps;
82 : }
83 : else
84 : {
85 1 : *tag_name = "GNU_Sparc_HWCAPS2";
86 1 : caps = hwcaps2;
87 : }
88 :
89 2 : char *s = name;
90 66 : for (cap = 0; cap < 32; cap++)
91 64 : if (value & (1U << cap))
92 : {
93 18 : if (*s != '\0')
94 32 : s = strcat (s, ",");
95 36 : s = strcat (s, caps[cap]);
96 : }
97 :
98 2 : *value_name = s;
99 2 : return true;
100 : }
101 : }
102 :
103 : return false;
104 : }
105 :
|