// SPDX-License-Identifier: GPL-2.0
/*
* Simple program to generate defines out of facility lists that use the bit
* numbering scheme from the Princples of Operations: most significant bit
* has bit number 0.
*
* Copyright IBM Corp. 2015, 2018
*
*/
#include <strings.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
struct facility_def {
char *name;
int *bits;
};
static struct facility_def facility_defs[] = {
{
/*
* FACILITIES_ALS contains the list of facilities that are
* required to run a kernel that is compiled e.g. with
* -march=<machine>.
*/
.name = "FACILITIES_ALS" ,
.bits = (int []){
0 , /* N3 instructions */
1 , /* z/Arch mode installed */
18 , /* long displacement facility */
21 , /* extended-immediate facility */
25 , /* store clock fast */
27 , /* mvcos */
32 , /* compare and swap and store */
33 , /* compare and swap and store 2 */
34 , /* general instructions extension */
35 , /* execute extensions */
#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
45 , /* fast-BCR, etc. */
#endif
#ifdef CONFIG_HAVE_MARCH_ZEC12_FEATURES
49 , /* misc-instruction-extensions */
52 , /* interlocked facility 2 */
#endif
#ifdef CONFIG_HAVE_MARCH_Z13_FEATURES
53 , /* load-and-zero-rightmost-byte, etc. */
129 , /* vector */
#endif
#ifdef CONFIG_HAVE_MARCH_Z14_FEATURES
58 , /* miscellaneous-instruction-extension 2 */
#endif
#ifdef CONFIG_HAVE_MARCH_Z15_FEATURES
61 , /* miscellaneous-instruction-extension 3 */
#endif
#ifdef CONFIG_HAVE_MARCH_Z17_FEATURES
84 , /* miscellaneous-instruction-extension 4 */
#endif
-1 /* END */
}
},
{
/*
* FACILITIES_KVM contains the list of facilities that are part
* of the default facility mask and list that are passed to the
* initial CPU model. If no CPU model is used, this, together
* with the non-hypervisor managed bits, is the maximum list of
* guest facilities supported by KVM.
*/
.name = "FACILITIES_KVM" ,
.bits = (int []){
0 , /* N3 instructions */
1 , /* z/Arch mode installed */
2 , /* z/Arch mode active */
3 , /* DAT-enhancement */
4 , /* idte segment table */
5 , /* idte region table */
6 , /* ASN-and-LX reuse */
7 , /* stfle */
8 , /* enhanced-DAT 1 */
9 , /* sense-running-status */
10 , /* conditional sske */
13 , /* ipte-range */
14 , /* nonquiescing key-setting */
73 , /* transactional execution */
75 , /* access-exception-fetch/store indication */
76 , /* msa extension 3 */
77 , /* msa extension 4 */
78 , /* enhanced-DAT 2 */
130 , /* instruction-execution-protection */
131 , /* enhanced-SOP 2 and side-effect */
139 , /* multiple epoch facility */
146 , /* msa extension 8 */
150 , /* enhanced sort */
151 , /* deflate conversion */
155 , /* msa extension 9 */
-1 /* END */
}
},
{
/*
* FACILITIES_KVM_CPUMODEL contains the list of facilities
* that can be enabled by CPU model code if the host supports
* it. These facilities are not passed to the guest without
* CPU model support.
*/
.name = "FACILITIES_KVM_CPUMODEL" ,
.bits = (int []){
12 , /* AP Query Configuration Information */
15 , /* AP Facilities Test */
156 , /* etoken facility */
165 , /* nnpa facility */
170 , /* ineffective-nonconstrained-transaction facility */
193 , /* bear enhancement facility */
194 , /* rdp enhancement facility */
196 , /* processor activity instrumentation facility */
197 , /* processor activity instrumentation extension 1 */
201 , /* concurrent-functions facility */
-1 /* END */
}
},
};
static void print_facility_list(struct facility_def *def)
{
unsigned int high, bit, dword, i;
unsigned long long *array;
array = calloc(1 , 8 );
if (!array)
exit (EXIT_FAILURE);
high = 0 ;
for (i = 0 ; def->bits[i] != -1 ; i++) {
bit = 63 - (def->bits[i] & 63 );
dword = def->bits[i] / 64 ;
if (dword > high) {
array = realloc(array, (dword + 1 ) * 8 );
if (!array)
exit (EXIT_FAILURE);
memset(array + high + 1 , 0 , (dword - high) * 8 );
high = dword;
}
array[dword] |= 1 ULL << bit;
}
printf("#define %s " , def->name);
for (i = 0 ; i <= high; i++)
printf("_AC(0x%016llx,UL)%c" , array[i], i < high ? ',' : '\n' );
free(array);
}
static void print_facility_lists(void )
{
unsigned int i;
for (i = 0 ; i < sizeof (facility_defs) / sizeof (facility_defs[0 ]); i++)
print_facility_list(&facility_defs[i]);
}
int main(int argc, char **argv)
{
printf("#ifndef __ASM_S390_FACILITY_DEFS__\n" );
printf("#define __ASM_S390_FACILITY_DEFS__\n" );
printf("/*\n");
printf(" * DO NOT MODIFY.\n" );
printf(" *\n" );
printf(" * This file was generated by %s\n" , __FILE__);
printf(" */\n\n" );
printf("#include <linux/const.h>\n\n" );
print_facility_lists();
printf("\n#endif\n" );
return 0 ;
}
Messung V0.5 in Prozent C=91 H=88 G=89
¤ Dauer der Verarbeitung: 0.8 Sekunden
(vorverarbeitet am 2026-06-07)
¤
*© Formatika GbR, Deutschland