18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/* ----------------------------------------------------------------------- *
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci *   Copyright 2008 rPath, Inc. - All Rights Reserved
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * ----------------------------------------------------------------------- */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci/*
98c2ecf20Sopenharmony_ci * This is a host program to preprocess the CPU strings into a
108c2ecf20Sopenharmony_ci * compact format suitable for the setup code.
118c2ecf20Sopenharmony_ci */
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <stdio.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include "../include/asm/required-features.h"
168c2ecf20Sopenharmony_ci#include "../include/asm/disabled-features.h"
178c2ecf20Sopenharmony_ci#include "../include/asm/cpufeatures.h"
188c2ecf20Sopenharmony_ci#include "../include/asm/vmxfeatures.h"
198c2ecf20Sopenharmony_ci#include "../kernel/cpu/capflags.c"
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ciint main(void)
228c2ecf20Sopenharmony_ci{
238c2ecf20Sopenharmony_ci	int i, j;
248c2ecf20Sopenharmony_ci	const char *str;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	printf("static const char x86_cap_strs[] =\n");
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	for (i = 0; i < NCAPINTS; i++) {
298c2ecf20Sopenharmony_ci		for (j = 0; j < 32; j++) {
308c2ecf20Sopenharmony_ci			str = x86_cap_flags[i*32+j];
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci			if (i == NCAPINTS-1 && j == 31) {
338c2ecf20Sopenharmony_ci				/* The last entry must be unconditional; this
348c2ecf20Sopenharmony_ci				   also consumes the compiler-added null
358c2ecf20Sopenharmony_ci				   character */
368c2ecf20Sopenharmony_ci				if (!str)
378c2ecf20Sopenharmony_ci					str = "";
388c2ecf20Sopenharmony_ci				printf("\t\"\\x%02x\\x%02x\"\"%s\"\n",
398c2ecf20Sopenharmony_ci				       i, j, str);
408c2ecf20Sopenharmony_ci			} else if (str) {
418c2ecf20Sopenharmony_ci				printf("#if REQUIRED_MASK%d & (1 << %d)\n"
428c2ecf20Sopenharmony_ci				       "\t\"\\x%02x\\x%02x\"\"%s\\0\"\n"
438c2ecf20Sopenharmony_ci				       "#endif\n",
448c2ecf20Sopenharmony_ci				       i, j, i, j, str);
458c2ecf20Sopenharmony_ci			}
468c2ecf20Sopenharmony_ci		}
478c2ecf20Sopenharmony_ci	}
488c2ecf20Sopenharmony_ci	printf("\t;\n");
498c2ecf20Sopenharmony_ci	return 0;
508c2ecf20Sopenharmony_ci}
51