[PATCH -next v20 20/26] riscv: Add prctl controls for userspace vector management
Andy Chiu
andy.chiu at sifive.com
Sun May 21 21:12:47 PDT 2023
On Sun, May 21, 2023 at 9:51 AM kernel test robot <lkp at intel.com> wrote:
>
> Hi Andy,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on next-20230518]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Andy-Chiu/riscv-Rename-__switch_to_aux-fpu/20230519-005938
> base: next-20230518
> patch link: https://lore.kernel.org/r/20230518161949.11203-21-andy.chiu%40sifive.com
> patch subject: [PATCH -next v20 20/26] riscv: Add prctl controls for userspace vector management
> config: arm-sp7021_defconfig
> compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project b0fb98227c90adf2536c9ad644a74d5e92961111)
> reproduce (this is a W=1 build):
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # install arm cross compiling tool for clang build
> # apt-get install binutils-arm-linux-gnueabi
> # https://github.com/intel-lab-lkp/linux/commit/eef6095228f3323db8f2bddd5bde768976888558
> git remote add linux-review https://github.com/intel-lab-lkp/linux
> git fetch --no-tags linux-review Andy-Chiu/riscv-Rename-__switch_to_aux-fpu/20230519-005938
> git checkout eef6095228f3323db8f2bddd5bde768976888558
> # save the config file
> mkdir build_dir && cp config build_dir/.config
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm olddefconfig
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash
>
> If you fix the issue, kindly add following tag where applicable
> | Reported-by: kernel test robot <lkp at intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202305210917.aS7cWlKv-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
> >> kernel/sys.c:2718:11: error: call to undeclared function 'RISCV_V_SET_CONTROL'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
> error = RISCV_V_SET_CONTROL(arg2);
> ^
> >> kernel/sys.c:2721:11: error: call to undeclared function 'RISCV_V_GET_CONTROL'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
> error = RISCV_V_GET_CONTROL();
> ^
> 2 errors generated.
>
>
> vim +/RISCV_V_SET_CONTROL +2718 kernel/sys.c
>
> 2407
> 2408 SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
> 2409 unsigned long, arg4, unsigned long, arg5)
> 2410 {
> 2411 struct task_struct *me = current;
> 2412 unsigned char comm[sizeof(me->comm)];
> 2413 long error;
> 2414
> 2415 error = security_task_prctl(option, arg2, arg3, arg4, arg5);
> 2416 if (error != -ENOSYS)
> 2417 return error;
> 2418
> 2419 error = 0;
> 2420 switch (option) {
> 2421 case PR_SET_PDEATHSIG:
> 2422 if (!valid_signal(arg2)) {
> 2423 error = -EINVAL;
> 2424 break;
> 2425 }
> 2426 me->pdeath_signal = arg2;
> 2427 break;
> 2428 case PR_GET_PDEATHSIG:
> 2429 error = put_user(me->pdeath_signal, (int __user *)arg2);
> 2430 break;
> 2431 case PR_GET_DUMPABLE:
> 2432 error = get_dumpable(me->mm);
> 2433 break;
> 2434 case PR_SET_DUMPABLE:
> 2435 if (arg2 != SUID_DUMP_DISABLE && arg2 != SUID_DUMP_USER) {
> 2436 error = -EINVAL;
> 2437 break;
> 2438 }
> 2439 set_dumpable(me->mm, arg2);
> 2440 break;
> 2441
> 2442 case PR_SET_UNALIGN:
> 2443 error = SET_UNALIGN_CTL(me, arg2);
> 2444 break;
> 2445 case PR_GET_UNALIGN:
> 2446 error = GET_UNALIGN_CTL(me, arg2);
> 2447 break;
> 2448 case PR_SET_FPEMU:
> 2449 error = SET_FPEMU_CTL(me, arg2);
> 2450 break;
> 2451 case PR_GET_FPEMU:
> 2452 error = GET_FPEMU_CTL(me, arg2);
> 2453 break;
> 2454 case PR_SET_FPEXC:
> 2455 error = SET_FPEXC_CTL(me, arg2);
> 2456 break;
> 2457 case PR_GET_FPEXC:
> 2458 error = GET_FPEXC_CTL(me, arg2);
> 2459 break;
> 2460 case PR_GET_TIMING:
> 2461 error = PR_TIMING_STATISTICAL;
> 2462 break;
> 2463 case PR_SET_TIMING:
> 2464 if (arg2 != PR_TIMING_STATISTICAL)
> 2465 error = -EINVAL;
> 2466 break;
> 2467 case PR_SET_NAME:
> 2468 comm[sizeof(me->comm) - 1] = 0;
> 2469 if (strncpy_from_user(comm, (char __user *)arg2,
> 2470 sizeof(me->comm) - 1) < 0)
> 2471 return -EFAULT;
> 2472 set_task_comm(me, comm);
> 2473 proc_comm_connector(me);
> 2474 break;
> 2475 case PR_GET_NAME:
> 2476 get_task_comm(comm, me);
> 2477 if (copy_to_user((char __user *)arg2, comm, sizeof(comm)))
> 2478 return -EFAULT;
> 2479 break;
> 2480 case PR_GET_ENDIAN:
> 2481 error = GET_ENDIAN(me, arg2);
> 2482 break;
> 2483 case PR_SET_ENDIAN:
> 2484 error = SET_ENDIAN(me, arg2);
> 2485 break;
> 2486 case PR_GET_SECCOMP:
> 2487 error = prctl_get_seccomp();
> 2488 break;
> 2489 case PR_SET_SECCOMP:
> 2490 error = prctl_set_seccomp(arg2, (char __user *)arg3);
> 2491 break;
> 2492 case PR_GET_TSC:
> 2493 error = GET_TSC_CTL(arg2);
> 2494 break;
> 2495 case PR_SET_TSC:
> 2496 error = SET_TSC_CTL(arg2);
> 2497 break;
> 2498 case PR_TASK_PERF_EVENTS_DISABLE:
> 2499 error = perf_event_task_disable();
> 2500 break;
> 2501 case PR_TASK_PERF_EVENTS_ENABLE:
> 2502 error = perf_event_task_enable();
> 2503 break;
> 2504 case PR_GET_TIMERSLACK:
> 2505 if (current->timer_slack_ns > ULONG_MAX)
> 2506 error = ULONG_MAX;
> 2507 else
> 2508 error = current->timer_slack_ns;
> 2509 break;
> 2510 case PR_SET_TIMERSLACK:
> 2511 if (arg2 <= 0)
> 2512 current->timer_slack_ns =
> 2513 current->default_timer_slack_ns;
> 2514 else
> 2515 current->timer_slack_ns = arg2;
> 2516 break;
> 2517 case PR_MCE_KILL:
> 2518 if (arg4 | arg5)
> 2519 return -EINVAL;
> 2520 switch (arg2) {
> 2521 case PR_MCE_KILL_CLEAR:
> 2522 if (arg3 != 0)
> 2523 return -EINVAL;
> 2524 current->flags &= ~PF_MCE_PROCESS;
> 2525 break;
> 2526 case PR_MCE_KILL_SET:
> 2527 current->flags |= PF_MCE_PROCESS;
> 2528 if (arg3 == PR_MCE_KILL_EARLY)
> 2529 current->flags |= PF_MCE_EARLY;
> 2530 else if (arg3 == PR_MCE_KILL_LATE)
> 2531 current->flags &= ~PF_MCE_EARLY;
> 2532 else if (arg3 == PR_MCE_KILL_DEFAULT)
> 2533 current->flags &=
> 2534 ~(PF_MCE_EARLY|PF_MCE_PROCESS);
> 2535 else
> 2536 return -EINVAL;
> 2537 break;
> 2538 case PR_GET_AUXV:
> 2539 if (arg4 || arg5)
> 2540 return -EINVAL;
> 2541 error = prctl_get_auxv((void __user *)arg2, arg3);
> 2542 break;
> 2543 default:
> 2544 return -EINVAL;
> 2545 }
> 2546 break;
> 2547 case PR_MCE_KILL_GET:
> 2548 if (arg2 | arg3 | arg4 | arg5)
> 2549 return -EINVAL;
> 2550 if (current->flags & PF_MCE_PROCESS)
> 2551 error = (current->flags & PF_MCE_EARLY) ?
> 2552 PR_MCE_KILL_EARLY : PR_MCE_KILL_LATE;
> 2553 else
> 2554 error = PR_MCE_KILL_DEFAULT;
> 2555 break;
> 2556 case PR_SET_MM:
> 2557 error = prctl_set_mm(arg2, arg3, arg4, arg5);
> 2558 break;
> 2559 case PR_GET_TID_ADDRESS:
> 2560 error = prctl_get_tid_address(me, (int __user * __user *)arg2);
> 2561 break;
> 2562 case PR_SET_CHILD_SUBREAPER:
> 2563 me->signal->is_child_subreaper = !!arg2;
> 2564 if (!arg2)
> 2565 break;
> 2566
> 2567 walk_process_tree(me, propagate_has_child_subreaper, NULL);
> 2568 break;
> 2569 case PR_GET_CHILD_SUBREAPER:
> 2570 error = put_user(me->signal->is_child_subreaper,
> 2571 (int __user *)arg2);
> 2572 break;
> 2573 case PR_SET_NO_NEW_PRIVS:
> 2574 if (arg2 != 1 || arg3 || arg4 || arg5)
> 2575 return -EINVAL;
> 2576
> 2577 task_set_no_new_privs(current);
> 2578 break;
> 2579 case PR_GET_NO_NEW_PRIVS:
> 2580 if (arg2 || arg3 || arg4 || arg5)
> 2581 return -EINVAL;
> 2582 return task_no_new_privs(current) ? 1 : 0;
> 2583 case PR_GET_THP_DISABLE:
> 2584 if (arg2 || arg3 || arg4 || arg5)
> 2585 return -EINVAL;
> 2586 error = !!test_bit(MMF_DISABLE_THP, &me->mm->flags);
> 2587 break;
> 2588 case PR_SET_THP_DISABLE:
> 2589 if (arg3 || arg4 || arg5)
> 2590 return -EINVAL;
> 2591 if (mmap_write_lock_killable(me->mm))
> 2592 return -EINTR;
> 2593 if (arg2)
> 2594 set_bit(MMF_DISABLE_THP, &me->mm->flags);
> 2595 else
> 2596 clear_bit(MMF_DISABLE_THP, &me->mm->flags);
> 2597 mmap_write_unlock(me->mm);
> 2598 break;
> 2599 case PR_MPX_ENABLE_MANAGEMENT:
> 2600 case PR_MPX_DISABLE_MANAGEMENT:
> 2601 /* No longer implemented: */
> 2602 return -EINVAL;
> 2603 case PR_SET_FP_MODE:
> 2604 error = SET_FP_MODE(me, arg2);
> 2605 break;
> 2606 case PR_GET_FP_MODE:
> 2607 error = GET_FP_MODE(me);
> 2608 break;
> 2609 case PR_SVE_SET_VL:
> 2610 error = SVE_SET_VL(arg2);
> 2611 break;
> 2612 case PR_SVE_GET_VL:
> 2613 error = SVE_GET_VL();
> 2614 break;
> 2615 case PR_SME_SET_VL:
> 2616 error = SME_SET_VL(arg2);
> 2617 break;
> 2618 case PR_SME_GET_VL:
> 2619 error = SME_GET_VL();
> 2620 break;
> 2621 case PR_GET_SPECULATION_CTRL:
> 2622 if (arg3 || arg4 || arg5)
> 2623 return -EINVAL;
> 2624 error = arch_prctl_spec_ctrl_get(me, arg2);
> 2625 break;
> 2626 case PR_SET_SPECULATION_CTRL:
> 2627 if (arg4 || arg5)
> 2628 return -EINVAL;
> 2629 error = arch_prctl_spec_ctrl_set(me, arg2, arg3);
> 2630 break;
> 2631 case PR_PAC_RESET_KEYS:
> 2632 if (arg3 || arg4 || arg5)
> 2633 return -EINVAL;
> 2634 error = PAC_RESET_KEYS(me, arg2);
> 2635 break;
> 2636 case PR_PAC_SET_ENABLED_KEYS:
> 2637 if (arg4 || arg5)
> 2638 return -EINVAL;
> 2639 error = PAC_SET_ENABLED_KEYS(me, arg2, arg3);
> 2640 break;
> 2641 case PR_PAC_GET_ENABLED_KEYS:
> 2642 if (arg2 || arg3 || arg4 || arg5)
> 2643 return -EINVAL;
> 2644 error = PAC_GET_ENABLED_KEYS(me);
> 2645 break;
> 2646 case PR_SET_TAGGED_ADDR_CTRL:
> 2647 if (arg3 || arg4 || arg5)
> 2648 return -EINVAL;
> 2649 error = SET_TAGGED_ADDR_CTRL(arg2);
> 2650 break;
> 2651 case PR_GET_TAGGED_ADDR_CTRL:
> 2652 if (arg2 || arg3 || arg4 || arg5)
> 2653 return -EINVAL;
> 2654 error = GET_TAGGED_ADDR_CTRL();
> 2655 break;
> 2656 case PR_SET_IO_FLUSHER:
> 2657 if (!capable(CAP_SYS_RESOURCE))
> 2658 return -EPERM;
> 2659
> 2660 if (arg3 || arg4 || arg5)
> 2661 return -EINVAL;
> 2662
> 2663 if (arg2 == 1)
> 2664 current->flags |= PR_IO_FLUSHER;
> 2665 else if (!arg2)
> 2666 current->flags &= ~PR_IO_FLUSHER;
> 2667 else
> 2668 return -EINVAL;
> 2669 break;
> 2670 case PR_GET_IO_FLUSHER:
> 2671 if (!capable(CAP_SYS_RESOURCE))
> 2672 return -EPERM;
> 2673
> 2674 if (arg2 || arg3 || arg4 || arg5)
> 2675 return -EINVAL;
> 2676
> 2677 error = (current->flags & PR_IO_FLUSHER) == PR_IO_FLUSHER;
> 2678 break;
> 2679 case PR_SET_SYSCALL_USER_DISPATCH:
> 2680 error = set_syscall_user_dispatch(arg2, arg3, arg4,
> 2681 (char __user *) arg5);
> 2682 break;
> 2683 #ifdef CONFIG_SCHED_CORE
> 2684 case PR_SCHED_CORE:
> 2685 error = sched_core_share_pid(arg2, arg3, arg4, arg5);
> 2686 break;
> 2687 #endif
> 2688 case PR_SET_MDWE:
> 2689 error = prctl_set_mdwe(arg2, arg3, arg4, arg5);
> 2690 break;
> 2691 case PR_GET_MDWE:
> 2692 error = prctl_get_mdwe(arg2, arg3, arg4, arg5);
> 2693 break;
> 2694 case PR_SET_VMA:
> 2695 error = prctl_set_vma(arg2, arg3, arg4, arg5);
> 2696 break;
> 2697 #ifdef CONFIG_KSM
> 2698 case PR_SET_MEMORY_MERGE:
> 2699 if (arg3 || arg4 || arg5)
> 2700 return -EINVAL;
> 2701 if (mmap_write_lock_killable(me->mm))
> 2702 return -EINTR;
> 2703
> 2704 if (arg2)
> 2705 error = ksm_enable_merge_any(me->mm);
> 2706 else
> 2707 error = ksm_disable_merge_any(me->mm);
> 2708 mmap_write_unlock(me->mm);
> 2709 break;
> 2710 case PR_GET_MEMORY_MERGE:
> 2711 if (arg2 || arg3 || arg4 || arg5)
> 2712 return -EINVAL;
> 2713
> 2714 error = !!test_bit(MMF_VM_MERGE_ANY, &me->mm->flags);
> 2715 break;
> 2716 #endif
> 2717 case PR_RISCV_V_SET_CONTROL:
> > 2718 error = RISCV_V_SET_CONTROL(arg2);
> 2719 break;
> 2720 case PR_RISCV_V_GET_CONTROL:
> > 2721 error = RISCV_V_GET_CONTROL();
> 2722 break;
> 2723 default:
> 2724 error = -EINVAL;
> 2725 break;
> 2726 }
> 2727 return error;
> 2728 }
> 2729
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
This is the case that Björn mentioned in v19[1] but I was too careless
to address it fully. I am going to repsin v21 and solve it (including
the else-clause in processor.h).
[1]: https://lore.kernel.org/all/87ttwdhljn.fsf@all.your.base.are.belong.to.us/
Thanks,
Andy
More information about the linux-riscv
mailing list