Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97fc0555 authored by H. Peter Anvin's avatar H. Peter Anvin
Browse files

x86 setup: handle more than 8 CPU flag words



Checkin e38e05a8 added a 9th CPU flag
word, but didn't adjust the boot code to match.  This patch adds the
necessary boot code support.

Note: due to a typo in an #if statement, it didn't trigger the #error
this was supposed to do.

Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent a9853dd6
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -59,17 +59,18 @@ int validate_cpu(void)
			u32 e = err_flags[i];

			for (j = 0; j < 32; j++) {
				int n = (i << 5)+j;
				if (*msg_strs < n) {
				if (msg_strs[0] < i ||
				    (msg_strs[0] == i && msg_strs[1] < j)) {
					/* Skip to the next string */
					do {
						msg_strs++;
					} while (*msg_strs);
					msg_strs++;
					msg_strs += 2;
					while (*msg_strs++)
						;
				}
				if (e & 1) {
					if (*msg_strs == n && msg_strs[1])
						printf("%s ", msg_strs+1);
					if (msg_strs[0] == i &&
					    msg_strs[1] == j &&
					    msg_strs[2])
						printf("%s ", msg_strs+2);
					else
						printf("%d:%d ", i, j);
				}
+19 −19
Original line number Diff line number Diff line
@@ -17,31 +17,31 @@

#include "../kernel/cpu/capflags.c"

#if NCAPFLAGS > 8
# error "Need to adjust the boot code handling of CPUID strings"
#endif

int main(void)
{
	int i;
	int i, j;
	const char *str;

	printf("static const char x86_cap_strs[] = \n");

	for (i = 0; i < NCAPINTS*32; i++) {
		str = x86_cap_flags[i];
	for (i = 0; i < NCAPINTS; i++) {
		for (j = 0; j < 32; j++) {
			str = x86_cap_flags[i*32+j];

		if (i == NCAPINTS*32-1) {
			if (i == NCAPINTS-1 && j == 31) {
				/* The last entry must be unconditional; this
			   also consumes the compiler-added null character */
				   also consumes the compiler-added null
				   character */
				if (!str)
					str = "";
			printf("\t\"\\x%02x\"\"%s\"\n", i, str);
				printf("\t\"\\x%02x\\x%02x\"\"%s\"\n",
				       i, j, str);
			} else if (str) {
				printf("#if REQUIRED_MASK%d & (1 << %d)\n"
			       "\t\"\\x%02x\"\"%s\\0\"\n"
				       "\t\"\\x%02x\\x%02x\"\"%s\\0\"\n"
				       "#endif\n",
			       i >> 5, i & 31, i, str);
				       i, j, i, j, str);
			}
		}
	}
	printf("\t;\n");