#!/usr/bin/awk # # Convert cpufeatures.h to a list of compile-time masks # Note: this blithely assumes that each word has at least one # feature defined in it; if not, something else is wrong! # BEGIN { printf "#ifndef _ASM_X86_CPUFEATUREMASKS_H\n"; printf "#define _ASM_X86_CPUFEATUREMASKS_H\n\n"; file = 0 } FNR == 1 { ++file; # arch/x86/include/asm/cpufeatures.h if (file == 1) FS = "[ \t()*+]+"; # .config if (file == 2) FS = "="; } # Create a dictionary of sorts, containing all defined feature bits file == 1 && $1 ~ /^#define$/ && $2 ~ /^X86_FEATURE_/ { nfeat = $3 * $4 + $5; feat = $2; sub(/^X86_FEATURE_/, "", feat); feats[nfeat] = feat; } file == 1 && $1 ~ /^#define$/ && $2 == "NCAPINTS" { ncapints = int($3); } # Create a dictionary featstat[REQUIRED|DISABLED, FEATURE_NAME] = on | off file == 2 && $1 ~ /^CONFIG_X86_(REQUIRED|DISABLED)_FEATURE_/ { on = ($2 == "y"); if (split($1, fs, "CONFIG_X86_|_FEATURE_") == 3) featstat[fs[2], fs[3]] = on; } END { sets[1] = "REQUIRED"; sets[2] = "DISABLED"; for (ns in sets) { s = sets[ns]; printf "/*\n"; printf " * %s features:\n", s; printf " *\n"; fstr = ""; for (i = 0; i < ncapints; i++) { mask = 0; for (j = 0; j < 32; j++) { feat = feats[i*32 + j]; if (featstat[s, feat]) { nfstr = fstr " " feat; if (length(nfstr) > 72) { printf " * %s\n", fstr; nfstr = " " feat; } fstr = nfstr; mask += (2 ^ j); } } masks[i] = mask; } printf " * %s\n */\n", fstr; for (i = 0; i < ncapints; i++) printf "#define %s_MASK%d\t0x%08xU\n", s, i, masks[i]; printf "\n#define %s_MASK_BIT_SET(x)\t\t\t\\\n", s; printf "\t((\t\t\t\t\t"; for (i = 0; i < ncapints; i++) { if (masks[i]) printf "\t\\\n\t\t((x) >> 5) == %2d ? %s_MASK%d :", i, s, i; } printf " 0\t\\\n"; printf "\t) & (1U << ((x) & 31)))\n\n"; } printf "#endif /* _ASM_X86_CPUFEATUREMASKS_H */\n"; }