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 --- |