sched.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Process.h>
  7. namespace Kernel {
  8. KResultOr<FlatPtr> Process::sys$yield()
  9. {
  10. VERIFY_NO_PROCESS_BIG_LOCK(this);
  11. REQUIRE_PROMISE(stdio);
  12. Thread::current()->yield_assuming_not_holding_big_lock();
  13. return 0;
  14. }
  15. KResultOr<FlatPtr> Process::sys$sched_setparam(int pid, Userspace<const struct sched_param*> user_param)
  16. {
  17. VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
  18. REQUIRE_PROMISE(proc);
  19. struct sched_param desired_param;
  20. if (!copy_from_user(&desired_param, user_param))
  21. return EFAULT;
  22. if (desired_param.sched_priority < THREAD_PRIORITY_MIN || desired_param.sched_priority > THREAD_PRIORITY_MAX)
  23. return EINVAL;
  24. auto* peer = Thread::current();
  25. ScopedSpinLock lock(g_scheduler_lock);
  26. if (pid != 0)
  27. peer = Thread::from_tid(pid);
  28. if (!peer)
  29. return ESRCH;
  30. if (!is_superuser() && euid() != peer->process().uid() && uid() != peer->process().uid())
  31. return EPERM;
  32. peer->set_priority((u32)desired_param.sched_priority);
  33. return 0;
  34. }
  35. KResultOr<FlatPtr> Process::sys$sched_getparam(pid_t pid, Userspace<struct sched_param*> user_param)
  36. {
  37. VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
  38. REQUIRE_PROMISE(proc);
  39. int priority;
  40. {
  41. auto* peer = Thread::current();
  42. ScopedSpinLock lock(g_scheduler_lock);
  43. if (pid != 0) {
  44. // FIXME: PID/TID BUG
  45. // The entire process is supposed to be affected.
  46. peer = Thread::from_tid(pid);
  47. }
  48. if (!peer)
  49. return ESRCH;
  50. if (!is_superuser() && euid() != peer->process().uid() && uid() != peer->process().uid())
  51. return EPERM;
  52. priority = (int)peer->priority();
  53. }
  54. struct sched_param param {
  55. priority
  56. };
  57. if (!copy_to_user(user_param, &param))
  58. return EFAULT;
  59. return 0;
  60. }
  61. }