The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/posix4/p1003_1b.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 1996, 1997, 1998
    3  *      HD Associates, Inc.  All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  * 3. All advertising materials mentioning features or use of this software
   14  *    must display the following acknowledgement:
   15  *      This product includes software developed by HD Associates, Inc
   16  * 4. Neither the name of the author nor the names of any co-contributors
   17  *    may be used to endorse or promote products derived from this software
   18  *    without specific prior written permission.
   19  *
   20  * THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND
   21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   23  * ARE DISCLAIMED.  IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE
   24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   30  * SUCH DAMAGE.
   31  *
   32  * $FreeBSD$
   33  */
   34 
   35 /* p1003_1b: Real Time common code.
   36  */
   37 
   38 #include <sys/param.h>
   39 #include <sys/systm.h>
   40 #include <sys/kernel.h>
   41 #include <sys/sysent.h>
   42 #include <sys/proc.h>
   43 #include <sys/syslog.h>
   44 #include <sys/module.h>
   45 #include <sys/sysproto.h>
   46 #include <sys/sysctl.h>
   47 
   48 #include <posix4/posix4.h>
   49 
   50 MALLOC_DEFINE(M_P31B, "p1003.1b", "Posix 1003.1B");
   51 
   52 /* p31b_proc: Return a proc struct corresponding to a pid to operate on.
   53  *
   54  * Enforce permission policy.
   55  *
   56  * The policy is the same as for sending signals except there
   57  * is no notion of process groups.
   58  *
   59  * pid == 0 means my process.
   60  *
   61  * This is disabled until I've got a permission gate in again:
   62  * only root can do this.
   63  */
   64 
   65 #if 0
   66 /*
   67  * This is stolen from CANSIGNAL in kern_sig:
   68  *
   69  * Can process p, with pcred pc, do "write flavor" operations to process q?
   70  */
   71 #define CAN_AFFECT(p, pc, q) \
   72         ((pc)->pc_ucred->cr_uid == 0 || \
   73             (pc)->p_ruid == (q)->p_cred->p_ruid || \
   74             (pc)->pc_ucred->cr_uid == (q)->p_cred->p_ruid || \
   75             (pc)->p_ruid == (q)->p_ucred->cr_uid || \
   76             (pc)->pc_ucred->cr_uid == (q)->p_ucred->cr_uid)
   77 #else
   78 #define CAN_AFFECT(p, pc, q) ((pc)->pc_ucred->cr_uid == 0)
   79 #endif
   80 
   81 /*
   82  * p31b_proc: Look up a proc from a PID.  If proc is 0 it is
   83  * my own proc.
   84  */
   85 int p31b_proc(struct proc *p, pid_t pid, struct proc **pp)
   86 {
   87         int ret = 0;
   88         struct proc *other_proc = 0;
   89 
   90         if (pid == 0)
   91                 other_proc = p;
   92         else
   93                 other_proc = pfind(pid);
   94 
   95         if (other_proc)
   96         {
   97                 /* Enforce permission policy.
   98                  */
   99                 if (CAN_AFFECT(p, p->p_cred, other_proc))
  100                         *pp = other_proc;
  101                 else
  102                         ret = EPERM;
  103         }
  104         else
  105                 ret = ESRCH;
  106 
  107         return ret;
  108 }
  109 
  110 /* The system calls return ENOSYS if an entry is called that is
  111  * not run-time supported.  I am also logging since some programs
  112  * start to use this when they shouldn't.  That will be removed if annoying.
  113  */
  114 int
  115 syscall_not_present(struct proc *p, const char *s, struct nosys_args *uap)
  116 {
  117         log(LOG_ERR, "cmd %s pid %d tried to use non-present %s\n",
  118                         p->p_comm, p->p_pid, s);
  119 
  120         /* a " return nosys(p, uap); " here causes a core dump.
  121          */
  122 
  123         return ENOSYS;
  124 }
  125 
  126 #if !defined(_KPOSIX_PRIORITY_SCHEDULING)
  127 
  128 /* Not configured but loadable via a module:
  129  */
  130 
  131 static int sched_attach(void)
  132 {
  133         return 0;
  134 }
  135 
  136 SYSCALL_NOT_PRESENT_GEN(sched_setparam)
  137 SYSCALL_NOT_PRESENT_GEN(sched_getparam)
  138 SYSCALL_NOT_PRESENT_GEN(sched_setscheduler)
  139 SYSCALL_NOT_PRESENT_GEN(sched_getscheduler)
  140 SYSCALL_NOT_PRESENT_GEN(sched_yield)
  141 SYSCALL_NOT_PRESENT_GEN(sched_get_priority_max)
  142 SYSCALL_NOT_PRESENT_GEN(sched_get_priority_min)
  143 SYSCALL_NOT_PRESENT_GEN(sched_rr_get_interval)
  144 
  145 #else
  146 
  147 /* Configured in kernel version:
  148  */
  149 static struct ksched *ksched;
  150 
  151 static int sched_attach(void)
  152 {
  153         int ret = ksched_attach(&ksched);
  154 
  155         if (ret == 0)
  156                 p31b_setcfg(CTL_P1003_1B_PRIORITY_SCHEDULING, 1);
  157 
  158         return ret;
  159 }
  160 
  161 int sched_setparam(struct proc *p,
  162         struct sched_setparam_args *uap)
  163 {
  164         int e;
  165 
  166         struct sched_param sched_param;
  167         copyin(uap->param, &sched_param, sizeof(sched_param));
  168 
  169         (void) (0
  170         || (e = p31b_proc(p, uap->pid, &p))
  171         || (e = ksched_setparam(&p->p_retval[0], ksched, p,
  172                 (const struct sched_param *)&sched_param))
  173         );
  174 
  175         return e;
  176 }
  177 
  178 int sched_getparam(struct proc *p,
  179         struct sched_getparam_args *uap)
  180 {
  181         struct proc *targetp;
  182         struct sched_param sched_param;
  183         int e;
  184  
  185         if (uap->pid != 0 && uap->pid != p->p_pid) {
  186                 e = p31b_proc(p, uap->pid, &targetp);
  187                 if (e)
  188                         return e;
  189         } else
  190                 targetp = p;
  191  
  192         e = ksched_getparam(&p->p_retval[0], ksched, targetp, &sched_param);
  193 
  194         if (!e)
  195                 copyout(&sched_param, uap->param, sizeof(sched_param));
  196 
  197         return e;
  198 }
  199 int sched_setscheduler(struct proc *p,
  200         struct sched_setscheduler_args *uap)
  201 {
  202         int e;
  203 
  204         struct sched_param sched_param;
  205         copyin(uap->param, &sched_param, sizeof(sched_param));
  206 
  207         (void) (0
  208         || (e = p31b_proc(p, uap->pid, &p))
  209         || (e = ksched_setscheduler(&p->p_retval[0],
  210         ksched, p, uap->policy,
  211                 (const struct sched_param *)&sched_param))
  212         );
  213 
  214         return e;
  215 }
  216 int sched_getscheduler(struct proc *p,
  217         struct sched_getscheduler_args *uap)
  218 {
  219         struct proc *targetp;
  220         int e;
  221  
  222         if (uap->pid != 0 && uap->pid != p->p_pid) {
  223                 e = p31b_proc(p, uap->pid, &targetp);
  224                 if (e)
  225                         return e;
  226         } else
  227                 targetp = p;
  228  
  229         e = ksched_getscheduler(&p->p_retval[0], ksched, targetp);
  230 
  231         return e;
  232 }
  233 int sched_yield(struct proc *p,
  234         struct sched_yield_args *uap)
  235 {
  236         return ksched_yield(&p->p_retval[0], ksched);
  237 }
  238 int sched_get_priority_max(struct proc *p,
  239         struct sched_get_priority_max_args *uap)
  240 {
  241         return ksched_get_priority_max(&p->p_retval[0],
  242         ksched, uap->policy);
  243 }
  244 int sched_get_priority_min(struct proc *p,
  245         struct sched_get_priority_min_args *uap)
  246 {
  247         return ksched_get_priority_min(&p->p_retval[0],
  248         ksched, uap->policy);
  249 }
  250 int sched_rr_get_interval(struct proc *p,
  251         struct sched_rr_get_interval_args *uap)
  252 {
  253         int e;
  254 
  255         (void) (0
  256         || (e = p31b_proc(p, uap->pid, &p))
  257         || (e = ksched_rr_get_interval(&p->p_retval[0], ksched,
  258         p, uap->interval))
  259         );
  260 
  261         return e;
  262 }
  263 
  264 #endif
  265 
  266 static void p31binit(void *notused)
  267 {
  268         (void) sched_attach();
  269         p31b_setcfg(CTL_P1003_1B_PAGESIZE, PAGE_SIZE);
  270 }
  271 
  272 SYSINIT(p31b, SI_SUB_P1003_1B, SI_ORDER_FIRST, p31binit, NULL);

Cache object: e4ad20b2368b7fe7052f8f13d691c6c5


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.