1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
  24  *
  25  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  26  * Use is subject to license terms.
  27  */
  28 
  29 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T     */
  30 /*        All Rights Reserved   */
  31 
  32 #ifndef _SYS_PRIOCNTL_H
  33 #define _SYS_PRIOCNTL_H
  34 
  35 #include <sys/types.h>
  36 #include <sys/procset.h>
  37 
  38 #ifdef  __cplusplus
  39 extern "C" {
  40 #endif
  41 
  42 #define PC_VERSION      1       /* First version of priocntl */
  43 
  44 extern long     priocntl(idtype_t, id_t, int, ...);
  45 extern long     priocntlset(procset_t *, int, ...);
  46 
  47 /*
  48  * The following are the possible values of the command
  49  * argument for the priocntl system call.
  50  */
  51 
  52 #define PC_GETCID       0       /* Get class ID */
  53 #define PC_GETCLINFO    1       /* Get info about a configured class */
  54 #define PC_SETPARMS     2       /* Set scheduling parameters */
  55 #define PC_GETPARMS     3       /* Get scheduling parameters */
  56 #define PC_ADMIN        4       /* Scheduler administration (used by */
  57                                 /* dispadmin(1M), not for general use) */
  58 #define PC_GETPRIRANGE  5       /* Get priority range for a class */
  59                                 /* posix.4 scheduling, not for general use */
  60 #define PC_DONICE       6       /* Set or get nice value */
  61 #define PC_SETXPARMS    7       /* Set extended scheduling parameters */
  62 #define PC_GETXPARMS    8       /* Get extended scheduling parameters */
  63 #define PC_SETDFLCL     9       /* Set default class, not for general use */
  64 #define PC_GETDFLCL     10      /* Get default class, not for general use */
  65 #define PC_DOPRIO       11      /* Set or get priority, not for general use */
  66 
  67 #define PC_CLNULL       -1
  68 
  69 #define PC_CLNMSZ       16
  70 #define PC_CLINFOSZ     (32 / sizeof (int))
  71 #define PC_CLPARMSZ     (32 / sizeof (int))
  72 
  73 #define PC_GETNICE      0
  74 #define PC_SETNICE      1
  75 
  76 #define PC_GETPRIO      0
  77 #define PC_SETPRIO      1
  78 
  79 typedef struct pcinfo {
  80         id_t    pc_cid;                 /* class id */
  81         char    pc_clname[PC_CLNMSZ];   /* class name */
  82         int     pc_clinfo[PC_CLINFOSZ]; /* class information */
  83 } pcinfo_t;
  84 
  85 typedef struct pcparms {
  86         id_t    pc_cid;                     /* process class */
  87         int     pc_clparms[PC_CLPARMSZ];    /* class specific parameters */
  88 } pcparms_t;
  89 
  90 typedef struct pcnice {
  91         int     pc_val;                 /* nice value */
  92         int     pc_op;                  /* type of operation, set or get */
  93 } pcnice_t;
  94 
  95 typedef struct pcprio {
  96         int     pc_op;                  /* type of operation, set or get */
  97         id_t    pc_cid;                 /* class id */
  98         int     pc_val;                 /* priority value */
  99 } pcprio_t;
 100 
 101 /*
 102  * The following is used by the priocntl(2) varargs interface (command
 103  * codes: PC_SETXPARMS and PC_GETXPARMS).
 104  */
 105 
 106 #define PC_VAPARMCNT    8       /* maximal number of (key, value) pairs */
 107 #define PC_KY_NULL      0       /* terminates the (key, value) pair chain */
 108 #define PC_KY_CLNAME    1       /* get the class name of a process or LWP. */
 109 
 110 typedef struct pc_vaparm {
 111         int             pc_key;         /* describing key */
 112         u_longlong_t    pc_parm;        /* associated parameter */
 113 } pc_vaparm_t;
 114 
 115 typedef struct pc_vaparms {
 116         uint_t          pc_vaparmscnt;          /* # of (key, value) pairs */
 117         pc_vaparm_t     pc_parms[PC_VAPARMCNT]; /* parameter buffer */
 118 } pc_vaparms_t;
 119 
 120 #if defined(_SYSCALL32) && \
 121         _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
 122 
 123 /*
 124  * These structures are needed by the 64-bit kernel on certain architectures
 125  * to translate pc_vaparms_t/pc_vaparm_t data structures from 32-bit userland.
 126  */
 127 #pragma pack(4)
 128 
 129 typedef struct {
 130         int32_t         pc_key;         /* describing key */
 131         uint64_t        pc_parm;        /* associated parameter */
 132 } pc_vaparm32_t;
 133 
 134 #pragma pack()
 135 
 136 typedef struct {
 137         uint32_t        pc_vaparmscnt;          /* # of (key, value) pairs */
 138         pc_vaparm32_t   pc_parms[PC_VAPARMCNT]; /* parameter buffer */
 139 } pc_vaparms32_t;
 140 
 141 #endif  /* _SYSCALL32 && ... */
 142 
 143 /*
 144  * The following is used by libc for posix.4
 145  * scheduler interfaces and is not for general use.
 146  */
 147 
 148 typedef struct pcpri {
 149         id_t    pc_cid;                 /* process class */
 150         pri_t   pc_clpmax;              /* class priority max */
 151         pri_t   pc_clpmin;              /* class priority min */
 152 } pcpri_t;
 153 
 154 /*
 155  * The following is used by the dispadmin(1M) command for
 156  * scheduler administration and is not for general use.
 157  */
 158 
 159 #ifdef _SYSCALL32
 160 /* Data structure for ILP32 clients */
 161 typedef struct pcadmin32 {
 162         id32_t          pc_cid;
 163         caddr32_t       pc_cladmin;
 164 } pcadmin32_t;
 165 #endif  /* _SYSCALL32 */
 166 
 167 typedef struct pcadmin {
 168         id_t    pc_cid;
 169         caddr_t pc_cladmin;
 170 } pcadmin_t;
 171 
 172 #ifdef  __cplusplus
 173 }
 174 #endif
 175 
 176 #endif  /* _SYS_PRIOCNTL_H */