浏览代码

Kernel: Use Userspace<T> in sched_setparam syscall

Note: I switched from copying the single element out of the sched_param
struct, to copy struct it self as it is identical in functionality.
This way the types match up nicer with the Userpace<T> api's and it
conforms to the conventions used in other syscalls.
Brian Gianforcaro 5 年之前
父节点
当前提交
10e912d68c
共有 2 个文件被更改,包括 8 次插入7 次删除
  1. 1 1
      Kernel/Process.h
  2. 7 6
      Kernel/Syscalls/sched.cpp

+ 1 - 1
Kernel/Process.h

@@ -291,7 +291,7 @@ public:
     int sys$setsockopt(const Syscall::SC_setsockopt_params*);
     int sys$getsockname(const Syscall::SC_getsockname_params*);
     int sys$getpeername(const Syscall::SC_getpeername_params*);
-    int sys$sched_setparam(pid_t pid, const struct sched_param* param);
+    int sys$sched_setparam(pid_t pid, Userspace<const struct sched_param*>);
     int sys$sched_getparam(pid_t pid, struct sched_param* param);
     int sys$create_thread(void* (*)(void*), const Syscall::SC_create_thread_params*);
     void sys$exit_thread(void*);

+ 7 - 6
Kernel/Syscalls/sched.cpp

@@ -48,14 +48,14 @@ int Process::sys$donate(int tid)
     return 0;
 }
 
-int Process::sys$sched_setparam(int tid, const struct sched_param* param)
+int Process::sys$sched_setparam(int tid, Userspace<const struct sched_param*> user_param)
 {
     REQUIRE_PROMISE(proc);
-    if (!validate_read_typed(param))
+    if (!validate_read_typed(user_param))
         return -EFAULT;
 
-    int desired_priority;
-    copy_from_user(&desired_priority, &param->sched_priority);
+    struct sched_param desired_param;
+    copy_from_user(&desired_param, user_param);
 
     InterruptDisabler disabler;
     auto* peer = Thread::current();
@@ -68,10 +68,11 @@ int Process::sys$sched_setparam(int tid, const struct sched_param* param)
     if (!is_superuser() && m_euid != peer->process().m_uid && m_uid != peer->process().m_uid)
         return -EPERM;
 
-    if (desired_priority < THREAD_PRIORITY_MIN || desired_priority > THREAD_PRIORITY_MAX)
+    if (desired_param.sched_priority < THREAD_PRIORITY_MIN ||
+        desired_param.sched_priority > THREAD_PRIORITY_MAX)
         return -EINVAL;
 
-    peer->set_priority((u32)desired_priority);
+    peer->set_priority((u32)desired_param.sched_priority);
     return 0;
 }