1 /* 2 * Simple program to generate defines out of facility lists that use the bit 3 * numbering scheme from the Princples of Operations: most significant bit 4 * has bit number 0. 5 * 6 * Copyright IBM Corp. 2015 7 * 8 */ 9 10 #include <strings.h> 11 #include <string.h> 12 #include <stdlib.h> 13 #include <stdio.h> 14 15 struct facility_def { 16 char *name; 17 int *bits; 18 }; 19 20 static struct facility_def facility_defs[] = { 21 { 22 /* 23 * FACILITIES_ALS contains the list of facilities that are 24 * required to run a kernel that is compiled e.g. with 25 * -march=<machine>. 26 */ 27 .name = "FACILITIES_ALS", 28 .bits = (int[]){ 29 #ifdef CONFIG_HAVE_MARCH_Z900_FEATURES 30 0, /* N3 instructions */ 31 1, /* z/Arch mode installed */ 32 #endif 33 #ifdef CONFIG_HAVE_MARCH_Z990_FEATURES 34 18, /* long displacement facility */ 35 #endif 36 #ifdef CONFIG_HAVE_MARCH_Z9_109_FEATURES 37 7, /* stfle */ 38 17, /* message security assist */ 39 21, /* extended-immediate facility */ 40 25, /* store clock fast */ 41 #endif 42 #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES 43 27, /* mvcos */ 44 32, /* compare and swap and store */ 45 33, /* compare and swap and store 2 */ 46 34, /* general extension facility */ 47 35, /* execute extensions */ 48 #endif 49 #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES 50 45, /* fast-BCR, etc. */ 51 #endif 52 #ifdef CONFIG_HAVE_MARCH_ZEC12_FEATURES 53 49, /* misc-instruction-extensions */ 54 52, /* interlocked facility 2 */ 55 #endif 56 #ifdef CONFIG_HAVE_MARCH_Z13_FEATURES 57 53, /* load-and-zero-rightmost-byte, etc. */ 58 #endif 59 -1 /* END */ 60 } 61 }, 62 { 63 .name = "FACILITIES_KVM", 64 .bits = (int[]){ 65 0, /* N3 instructions */ 66 1, /* z/Arch mode installed */ 67 2, /* z/Arch mode active */ 68 3, /* DAT-enhancement */ 69 4, /* idte segment table */ 70 5, /* idte region table */ 71 6, /* ASN-and-LX reuse */ 72 7, /* stfle */ 73 8, /* enhanced-DAT 1 */ 74 9, /* sense-running-status */ 75 10, /* conditional sske */ 76 13, /* ipte-range */ 77 14, /* nonquiescing key-setting */ 78 73, /* transactional execution */ 79 75, /* access-exception-fetch/store indication */ 80 76, /* msa extension 3 */ 81 77, /* msa extension 4 */ 82 78, /* enhanced-DAT 2 */ 83 130, /* instruction-execution-protection */ 84 131, /* enhanced-SOP 2 and side-effect */ 85 146, /* msa extension 8 */ 86 -1 /* END */ 87 } 88 }, 89 }; 90 91 static void print_facility_list(struct facility_def *def) 92 { 93 unsigned int high, bit, dword, i; 94 unsigned long long *array; 95 96 array = calloc(1, 8); 97 if (!array) 98 exit(EXIT_FAILURE); 99 high = 0; 100 for (i = 0; def->bits[i] != -1; i++) { 101 bit = 63 - (def->bits[i] & 63); 102 dword = def->bits[i] / 64; 103 if (dword > high) { 104 array = realloc(array, (dword + 1) * 8); 105 if (!array) 106 exit(EXIT_FAILURE); 107 memset(array + high + 1, 0, (dword - high) * 8); 108 high = dword; 109 } 110 array[dword] |= 1ULL << bit; 111 } 112 printf("#define %s ", def->name); 113 for (i = 0; i <= high; i++) 114 printf("_AC(0x%016llx,UL)%c", array[i], i < high ? ',' : '\n'); 115 free(array); 116 } 117 118 static void print_facility_lists(void) 119 { 120 unsigned int i; 121 122 for (i = 0; i < sizeof(facility_defs) / sizeof(facility_defs[0]); i++) 123 print_facility_list(&facility_defs[i]); 124 } 125 126 int main(int argc, char **argv) 127 { 128 printf("#ifndef __ASM_S390_FACILITIES__\n"); 129 printf("#define __ASM_S390_FACILITIES__\n"); 130 printf("/*\n"); 131 printf(" * DO NOT MODIFY.\n"); 132 printf(" *\n"); 133 printf(" * This file was generated by %s\n", __FILE__); 134 printf(" */\n\n"); 135 printf("#include <linux/const.h>\n\n"); 136 print_facility_lists(); 137 printf("\n#endif\n"); 138 return 0; 139 } 140