Commit ac72e7888a612dccfbc15b34698aad441bdfda10

Authored by Andi Kleen
Committed by Ingo Molnar
1 parent 191679fdfa

x86: add generic clearcpuid=... option

Add a generic option to clear any cpuid bit. I added it because it was
very easy to add with the new generic cpuid disable bitmap and perhaps
it will be useful in the future.

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

Showing 3 changed files with 35 additions and 0 deletions Side-by-side Diff

Documentation/kernel-parameters.txt
... ... @@ -416,6 +416,19 @@
416 416 [SPARC64] tick
417 417 [X86-64] hpet,tsc
418 418  
  419 + clearcpuid=BITNUM [X86]
  420 + Disable CPUID feature X for the kernel. See
  421 + include/asm-x86/cpufeature.h for the valid bit numbers.
  422 + Note the Linux specific bits are not necessarily
  423 + stable over kernel options, but the vendor specific
  424 + ones should be.
  425 + Also note that user programs calling CPUID directly
  426 + or using the feature without checking anything
  427 + will still see it. This just prevents it from
  428 + being used by the kernel or shown in /proc/cpuinfo.
  429 + Also note the kernel might malfunction if you disable
  430 + some critical bits.
  431 +
419 432 code_bytes [IA32/X86_64] How many bytes of object code to print
420 433 in an oops report.
421 434 Range: 0 - 8192
arch/x86/kernel/cpu/common.c
... ... @@ -572,6 +572,17 @@
572 572 printk("\n");
573 573 }
574 574  
  575 +static __init int setup_disablecpuid(char *arg)
  576 +{
  577 + int bit;
  578 + if (get_option(&arg, &bit) && bit < NCAPINTS*32)
  579 + setup_clear_cpu_cap(bit);
  580 + else
  581 + return 0;
  582 + return 1;
  583 +}
  584 +__setup("clearcpuid=", setup_disablecpuid);
  585 +
575 586 cpumask_t cpu_initialized __cpuinitdata = CPU_MASK_NONE;
576 587  
577 588 /* This is hacky. :)
arch/x86/kernel/setup_64.c
... ... @@ -1050,6 +1050,17 @@
1050 1050 printk(KERN_CONT "\n");
1051 1051 }
1052 1052  
  1053 +static __init int setup_disablecpuid(char *arg)
  1054 +{
  1055 + int bit;
  1056 + if (get_option(&arg, &bit) && bit < NCAPINTS*32)
  1057 + setup_clear_cpu_cap(bit);
  1058 + else
  1059 + return 0;
  1060 + return 1;
  1061 +}
  1062 +__setup("clearcpuid=", setup_disablecpuid);
  1063 +
1053 1064 /*
1054 1065 * Get CPU information for use by the procfs.
1055 1066 */