Re: [x86 setup 22/33] CPU features verification for the new x86setup code

From: SÃbastien DuguÃ
Date: Tue Jul 10 2007 - 03:39:42 EST



Hi Peter,

Only two sub-minor nits:

On Mon, 9 Jul 2007 19:52:01 -0700 "H. Peter Anvin" <hpa@xxxxxxxxx> wrote:

> From: H. Peter Anvin <hpa@xxxxxxxxx>
>
> Verify that the CPU has enough features to run the kernel. This may
> entail enabling features on some CPUs.
>
> By doing this in the setup code we can be guaranteed to still be able to
> write to the console through the BIOS.
>
> Signed-off-by: H. Peter Anvin <hpa@xxxxxxxxx>
> ---
> arch/i386/boot/cpu.c | 69 ++++++++++++
> arch/i386/boot/cpucheck.c | 267 +++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 336 insertions(+), 0 deletions(-)
> create mode 100644 arch/i386/boot/cpu.c
> create mode 100644 arch/i386/boot/cpucheck.c
>
> diff --git a/arch/i386/boot/cpu.c b/arch/i386/boot/cpu.c
> new file mode 100644
> index 0000000..042d894
> --- /dev/null
> +++ b/arch/i386/boot/cpu.c
> @@ -0,0 +1,69 @@
> +/* -*- linux-c -*- ------------------------------------------------------- *
> + *
> + * Copyright (C) 1991, 1992 Linus Torvalds
> + * Copyright 2007 rPath, Inc. - All Rights Reserved
> + *
> + * This file is part of the Linux kernel, and is made available under
> + * the terms of the GNU General Public License version 2.
> + *
> + * ----------------------------------------------------------------------- */
> +
> +/*
> + * arch/i386/boot/cpucheck.c

^^^^^
cpu.c ?

> + *
> + * Check for obligatory CPU features and abort if the features are not
> + * present.
> + */
> +
> +#include "boot.h"
> +#include "bitops.h"
> +#include <asm/cpufeature.h>
> +
> +static char *cpu_name(int level)
> +{
> + static char buf[6];
> +
> + if (level == 64) {
> + return "x86-64";
> + } else {
> + sprintf(buf, "i%d86", level);
> + return buf;
> + }
> +}
> +
> +int validate_cpu(void)
> +{
> + u32 *err_flags;
> + int cpu_level, req_level;
> +
> + check_cpu(&cpu_level, &req_level, &err_flags);
> +
> + if (cpu_level < req_level) {
> + printf("This kernel requires an %s CPU, ",
> + cpu_name(req_level));
> + printf("but only detected an %s CPU.\n",
> + cpu_name(cpu_level));
> + return -1;
> + }
> +
> + if (err_flags) {
> + int i, j;
> + puts("This kernel requires the following features "
> + "not present on the CPU:\n");
> +
> + for (i = 0; i < NCAPINTS; i++) {
> + u32 e = err_flags[i];
> +
> + for (j = 0; j < 32; j++) {
> + if (e & 1)
> + printf("%d:%d ", i, j);
> +
> + e >>= 1;
> + }
> + }
> + putchar('\n');
> + return -1;
> + } else {
> + return 0;
> + }
> +}
> diff --git a/arch/i386/boot/cpucheck.c b/arch/i386/boot/cpucheck.c
> new file mode 100644
> index 0000000..431bef8
> --- /dev/null
> +++ b/arch/i386/boot/cpucheck.c
> @@ -0,0 +1,267 @@
> +/* -*- linux-c -*- ------------------------------------------------------- *
> + *
> + * Copyright (C) 1991, 1992 Linus Torvalds
> + * Copyright 2007 rPath, Inc. - All Rights Reserved
> + *
> + * This file is part of the Linux kernel, and is made available under
> + * the terms of the GNU General Public License version 2.
> + *
> + * ----------------------------------------------------------------------- */
> +
> +/*
> + * arch/i386/boot/cpu.c

^^^^^
cpucheck.c ?

> + *
> + * Check for obligatory CPU features and abort if the features are not
> + * present. This code should be compilable as 16-, 32- or 64-bit
> + * code, so be very careful with types and inline assembly.
> + *
> + * This code should not contain any messages; that requires an
> + * additional wrapper.
> + *


SÃbastien.


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/