bugs.c (f9544b2b076ca90d887c5ae5d74fab4c21bb7c13) bugs.c (356e4bfff2c5489e016fdb925adbf12a1e3950ee)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 1994 Linus Torvalds
4 *
5 * Cyrix stuff, June 1998 by:
6 * - Rafael R. Reilova (moved everything from head.S),
7 * <rreilova@ececs.uc.edu>
8 * - Channing Corn (tests & fixes),

--- 519 unchanged lines hidden (view full) ---

528 if (boot_cpu_has_bug(X86_BUG_SPEC_STORE_BYPASS))
529 pr_info("%s\n", ssb_strings[ssb_mode]);
530}
531
532#undef pr_fmt
533
534static int ssb_prctl_set(struct task_struct *task, unsigned long ctrl)
535{
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 1994 Linus Torvalds
4 *
5 * Cyrix stuff, June 1998 by:
6 * - Rafael R. Reilova (moved everything from head.S),
7 * <rreilova@ececs.uc.edu>
8 * - Channing Corn (tests & fixes),

--- 519 unchanged lines hidden (view full) ---

528 if (boot_cpu_has_bug(X86_BUG_SPEC_STORE_BYPASS))
529 pr_info("%s\n", ssb_strings[ssb_mode]);
530}
531
532#undef pr_fmt
533
534static int ssb_prctl_set(struct task_struct *task, unsigned long ctrl)
535{
536 bool rds = !!test_tsk_thread_flag(task, TIF_RDS);
536 bool update;
537
538 if (ssb_mode != SPEC_STORE_BYPASS_PRCTL)
539 return -ENXIO;
540
537
538 if (ssb_mode != SPEC_STORE_BYPASS_PRCTL)
539 return -ENXIO;
540
541 if (ctrl == PR_SPEC_ENABLE)
542 clear_tsk_thread_flag(task, TIF_RDS);
543 else
544 set_tsk_thread_flag(task, TIF_RDS);
541 switch (ctrl) {
542 case PR_SPEC_ENABLE:
543 /* If speculation is force disabled, enable is not allowed */
544 if (task_spec_ssb_force_disable(task))
545 return -EPERM;
546 task_clear_spec_ssb_disable(task);
547 update = test_and_clear_tsk_thread_flag(task, TIF_RDS);
548 break;
549 case PR_SPEC_DISABLE:
550 task_set_spec_ssb_disable(task);
551 update = !test_and_set_tsk_thread_flag(task, TIF_RDS);
552 break;
553 case PR_SPEC_FORCE_DISABLE:
554 task_set_spec_ssb_disable(task);
555 task_set_spec_ssb_force_disable(task);
556 update = !test_and_set_tsk_thread_flag(task, TIF_RDS);
557 break;
558 default:
559 return -ERANGE;
560 }
545
546 /*
547 * If being set on non-current task, delay setting the CPU
548 * mitigation until it is next scheduled.
549 */
561
562 /*
563 * If being set on non-current task, delay setting the CPU
564 * mitigation until it is next scheduled.
565 */
550 if (task == current && rds != !!test_tsk_thread_flag(task, TIF_RDS))
566 if (task == current && update)
551 speculative_store_bypass_update();
552
553 return 0;
554}
555
556static int ssb_prctl_get(struct task_struct *task)
557{
558 switch (ssb_mode) {
559 case SPEC_STORE_BYPASS_DISABLE:
560 return PR_SPEC_DISABLE;
561 case SPEC_STORE_BYPASS_PRCTL:
567 speculative_store_bypass_update();
568
569 return 0;
570}
571
572static int ssb_prctl_get(struct task_struct *task)
573{
574 switch (ssb_mode) {
575 case SPEC_STORE_BYPASS_DISABLE:
576 return PR_SPEC_DISABLE;
577 case SPEC_STORE_BYPASS_PRCTL:
562 if (test_tsk_thread_flag(task, TIF_RDS))
578 if (task_spec_ssb_force_disable(task))
579 return PR_SPEC_PRCTL | PR_SPEC_FORCE_DISABLE;
580 if (task_spec_ssb_disable(task))
563 return PR_SPEC_PRCTL | PR_SPEC_DISABLE;
564 return PR_SPEC_PRCTL | PR_SPEC_ENABLE;
565 default:
566 if (boot_cpu_has_bug(X86_BUG_SPEC_STORE_BYPASS))
567 return PR_SPEC_ENABLE;
568 return PR_SPEC_NOT_AFFECTED;
569 }
570}
571
572int arch_prctl_spec_ctrl_set(struct task_struct *task, unsigned long which,
573 unsigned long ctrl)
574{
581 return PR_SPEC_PRCTL | PR_SPEC_DISABLE;
582 return PR_SPEC_PRCTL | PR_SPEC_ENABLE;
583 default:
584 if (boot_cpu_has_bug(X86_BUG_SPEC_STORE_BYPASS))
585 return PR_SPEC_ENABLE;
586 return PR_SPEC_NOT_AFFECTED;
587 }
588}
589
590int arch_prctl_spec_ctrl_set(struct task_struct *task, unsigned long which,
591 unsigned long ctrl)
592{
575 if (ctrl != PR_SPEC_ENABLE && ctrl != PR_SPEC_DISABLE)
576 return -ERANGE;
577
578 switch (which) {
579 case PR_SPEC_STORE_BYPASS:
580 return ssb_prctl_set(task, ctrl);
581 default:
582 return -ENODEV;
583 }
584}
585

--- 73 unchanged lines hidden ---
593 switch (which) {
594 case PR_SPEC_STORE_BYPASS:
595 return ssb_prctl_set(task, ctrl);
596 default:
597 return -ENODEV;
598 }
599}
600

--- 73 unchanged lines hidden ---