#endif
}
-static inline void parse_clearcpuid(char *arg)
+static inline void parse_set_clear_cpuid(char *arg, bool set)
{
char *opt;
int taint = 0;
- pr_info("Clearing CPUID bits:");
+ pr_info("%s CPUID bits:", set ? "Force-enabling" : "Clearing");
while (arg) {
bool found __maybe_unused = false;
else
pr_cont(" " X86_CAP_FMT, x86_cap_flag(bit));
- setup_clear_cpu_cap(bit);
+ if (set)
+ setup_force_cpu_cap(bit);
+ else
+ setup_clear_cpu_cap(bit);
taint++;
}
/*
continue;
pr_cont(" %s", opt);
- setup_clear_cpu_cap(bit);
+ if (set)
+ setup_force_cpu_cap(bit);
+ else
+ setup_clear_cpu_cap(bit);
taint++;
found = true;
break;
setup_clear_cpu_cap(X86_FEATURE_FRED);
arglen = cmdline_find_option(boot_command_line, "clearcpuid", arg, sizeof(arg));
- if (arglen <= 0)
- return;
- parse_clearcpuid(arg);
+ if (arglen > 0)
+ parse_set_clear_cpuid(arg, false);
+
+ arglen = cmdline_find_option(boot_command_line, "setcpuid", arg, sizeof(arg));
+ if (arglen > 0)
+ parse_set_clear_cpuid(arg, true);
}
/*
}
/*
- * clearcpuid= was already parsed in cpu_parse_early_param(). This dummy
- * function prevents it from becoming an environment variable for init.
+ * clearcpuid= and setcpuid= were already parsed in cpu_parse_early_param().
+ * These dummy functions prevent them from becoming an environment variable for
+ * init.
*/
+
static __init int setup_clearcpuid(char *arg)
{
return 1;
}
__setup("clearcpuid=", setup_clearcpuid);
+static __init int setup_setcpuid(char *arg)
+{
+ return 1;
+}
+__setup("setcpuid=", setup_setcpuid);
+
DEFINE_PER_CPU_ALIGNED(struct pcpu_hot, pcpu_hot) = {
.current_task = &init_task,
.preempt_count = INIT_PREEMPT_COUNT,