1
2
3
4
5
6
7
8
9
10
11#include <strings.h>
12#include <string.h>
13#include <stdlib.h>
14#include <stdio.h>
15
16struct facility_def {
17 char *name;
18 int *bits;
19};
20
21static struct facility_def facility_defs[] = {
22 {
23
24
25
26
27
28 .name = "FACILITIES_ALS",
29 .bits = (int[]){
30#ifdef CONFIG_HAVE_MARCH_Z900_FEATURES
31 0,
32 1,
33#endif
34#ifdef CONFIG_HAVE_MARCH_Z990_FEATURES
35 18,
36#endif
37#ifdef CONFIG_HAVE_MARCH_Z9_109_FEATURES
38 21,
39 25,
40#endif
41#ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
42 27,
43 32,
44 33,
45 34,
46 35,
47#endif
48#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
49 45,
50#endif
51#ifdef CONFIG_HAVE_MARCH_ZEC12_FEATURES
52 49,
53 52,
54#endif
55#ifdef CONFIG_HAVE_MARCH_Z13_FEATURES
56 53,
57#endif
58#ifdef CONFIG_HAVE_MARCH_Z14_FEATURES
59 58,
60#endif
61#ifdef CONFIG_HAVE_MARCH_Z15_FEATURES
62 61,
63#endif
64 -1
65 }
66 },
67 {
68
69
70
71
72
73
74
75 .name = "FACILITIES_KVM",
76 .bits = (int[]){
77 0,
78 1,
79 2,
80 3,
81 4,
82 5,
83 6,
84 7,
85 8,
86 9,
87 10,
88 13,
89 14,
90 73,
91 75,
92 76,
93 77,
94 78,
95 130,
96 131,
97 139,
98 146,
99 150,
100 151,
101 155,
102 -1
103 }
104 },
105 {
106
107
108
109
110
111
112
113 .name = "FACILITIES_KVM_CPUMODEL",
114 .bits = (int[]){
115 12,
116 15,
117 156,
118 165,
119 193,
120 194,
121 196,
122 -1
123 }
124 },
125};
126
127static void print_facility_list(struct facility_def *def)
128{
129 unsigned int high, bit, dword, i;
130 unsigned long long *array;
131
132 array = calloc(1, 8);
133 if (!array)
134 exit(EXIT_FAILURE);
135 high = 0;
136 for (i = 0; def->bits[i] != -1; i++) {
137 bit = 63 - (def->bits[i] & 63);
138 dword = def->bits[i] / 64;
139 if (dword > high) {
140 array = realloc(array, (dword + 1) * 8);
141 if (!array)
142 exit(EXIT_FAILURE);
143 memset(array + high + 1, 0, (dword - high) * 8);
144 high = dword;
145 }
146 array[dword] |= 1ULL << bit;
147 }
148 printf("#define %s ", def->name);
149 for (i = 0; i <= high; i++)
150 printf("_AC(0x%016llx,UL)%c", array[i], i < high ? ',' : '\n');
151 free(array);
152}
153
154static void print_facility_lists(void)
155{
156 unsigned int i;
157
158 for (i = 0; i < sizeof(facility_defs) / sizeof(facility_defs[0]); i++)
159 print_facility_list(&facility_defs[i]);
160}
161
162int main(int argc, char **argv)
163{
164 printf("#ifndef __ASM_S390_FACILITY_DEFS__\n");
165 printf("#define __ASM_S390_FACILITY_DEFS__\n");
166 printf("/*\n");
167 printf(" * DO NOT MODIFY.\n");
168 printf(" *\n");
169 printf(" * This file was generated by %s\n", __FILE__);
170 printf(" */\n\n");
171 printf("#include <linux/const.h>\n\n");
172 print_facility_lists();
173 printf("\n#endif\n");
174 return 0;
175}
176