Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

x86/cpu: Create helper function to parse the 'clearcpuid=' boot parameter

This is in preparation for a later commit that will reuse this code, to
make review convenient.

Factor out a helper function which does the full handling for this arg
including printing info to the console.

No functional change intended.

Signed-off-by: Brendan Jackman <jackmanb@google.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20241220-force-cpu-bug-v2-1-7dc71bce742a@google.com

authored by

Brendan Jackman and committed by
Ingo Molnar
f034937f a4248ee1

+52 -44
+52 -44
arch/x86/kernel/cpu/common.c
··· 1479 1479 #endif 1480 1480 } 1481 1481 1482 - /* 1483 - * We parse cpu parameters early because fpu__init_system() is executed 1484 - * before parse_early_param(). 1485 - */ 1486 - static void __init cpu_parse_early_param(void) 1482 + static inline void parse_clearcpuid(char *arg) 1487 1483 { 1488 - char arg[128]; 1489 - char *argptr = arg, *opt; 1490 - int arglen, taint = 0; 1491 - 1492 - #ifdef CONFIG_X86_32 1493 - if (cmdline_find_option_bool(boot_command_line, "no387")) 1494 - #ifdef CONFIG_MATH_EMULATION 1495 - setup_clear_cpu_cap(X86_FEATURE_FPU); 1496 - #else 1497 - pr_err("Option 'no387' required CONFIG_MATH_EMULATION enabled.\n"); 1498 - #endif 1499 - 1500 - if (cmdline_find_option_bool(boot_command_line, "nofxsr")) 1501 - setup_clear_cpu_cap(X86_FEATURE_FXSR); 1502 - #endif 1503 - 1504 - if (cmdline_find_option_bool(boot_command_line, "noxsave")) 1505 - setup_clear_cpu_cap(X86_FEATURE_XSAVE); 1506 - 1507 - if (cmdline_find_option_bool(boot_command_line, "noxsaveopt")) 1508 - setup_clear_cpu_cap(X86_FEATURE_XSAVEOPT); 1509 - 1510 - if (cmdline_find_option_bool(boot_command_line, "noxsaves")) 1511 - setup_clear_cpu_cap(X86_FEATURE_XSAVES); 1512 - 1513 - if (cmdline_find_option_bool(boot_command_line, "nousershstk")) 1514 - setup_clear_cpu_cap(X86_FEATURE_USER_SHSTK); 1515 - 1516 - /* Minimize the gap between FRED is available and available but disabled. */ 1517 - arglen = cmdline_find_option(boot_command_line, "fred", arg, sizeof(arg)); 1518 - if (arglen != 2 || strncmp(arg, "on", 2)) 1519 - setup_clear_cpu_cap(X86_FEATURE_FRED); 1520 - 1521 - arglen = cmdline_find_option(boot_command_line, "clearcpuid", arg, sizeof(arg)); 1522 - if (arglen <= 0) 1523 - return; 1484 + char *opt; 1485 + int taint = 0; 1524 1486 1525 1487 pr_info("Clearing CPUID bits:"); 1526 1488 1527 - while (argptr) { 1489 + while (arg) { 1528 1490 bool found __maybe_unused = false; 1529 1491 unsigned int bit; 1530 1492 1531 - opt = strsep(&argptr, ","); 1493 + opt = strsep(&arg, ","); 1532 1494 1533 1495 /* 1534 1496 * Handle naked numbers first for feature flags which don't ··· 1532 1570 if (!found) 1533 1571 pr_cont(" (unknown: %s)", opt); 1534 1572 } 1535 - pr_cont("\n"); 1536 1573 1537 1574 if (taint) 1538 1575 add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK); 1576 + 1577 + pr_cont("\n"); 1578 + } 1579 + 1580 + 1581 + /* 1582 + * We parse cpu parameters early because fpu__init_system() is executed 1583 + * before parse_early_param(). 1584 + */ 1585 + static void __init cpu_parse_early_param(void) 1586 + { 1587 + char arg[128]; 1588 + int arglen; 1589 + 1590 + #ifdef CONFIG_X86_32 1591 + if (cmdline_find_option_bool(boot_command_line, "no387")) 1592 + #ifdef CONFIG_MATH_EMULATION 1593 + setup_clear_cpu_cap(X86_FEATURE_FPU); 1594 + #else 1595 + pr_err("Option 'no387' required CONFIG_MATH_EMULATION enabled.\n"); 1596 + #endif 1597 + 1598 + if (cmdline_find_option_bool(boot_command_line, "nofxsr")) 1599 + setup_clear_cpu_cap(X86_FEATURE_FXSR); 1600 + #endif 1601 + 1602 + if (cmdline_find_option_bool(boot_command_line, "noxsave")) 1603 + setup_clear_cpu_cap(X86_FEATURE_XSAVE); 1604 + 1605 + if (cmdline_find_option_bool(boot_command_line, "noxsaveopt")) 1606 + setup_clear_cpu_cap(X86_FEATURE_XSAVEOPT); 1607 + 1608 + if (cmdline_find_option_bool(boot_command_line, "noxsaves")) 1609 + setup_clear_cpu_cap(X86_FEATURE_XSAVES); 1610 + 1611 + if (cmdline_find_option_bool(boot_command_line, "nousershstk")) 1612 + setup_clear_cpu_cap(X86_FEATURE_USER_SHSTK); 1613 + 1614 + /* Minimize the gap between FRED is available and available but disabled. */ 1615 + arglen = cmdline_find_option(boot_command_line, "fred", arg, sizeof(arg)); 1616 + if (arglen != 2 || strncmp(arg, "on", 2)) 1617 + setup_clear_cpu_cap(X86_FEATURE_FRED); 1618 + 1619 + arglen = cmdline_find_option(boot_command_line, "clearcpuid", arg, sizeof(arg)); 1620 + if (arglen <= 0) 1621 + return; 1622 + parse_clearcpuid(arg); 1539 1623 } 1540 1624 1541 1625 /*