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 2008 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T     */
  28 /*        All Rights Reserved   */
  29 
  30 #ifndef _SYS_PRIOCNTL_H
  31 #define _SYS_PRIOCNTL_H
  32 
  33 #pragma ident   "%Z%%M% %I%     %E% SMI"        /* from SVR4 1.6 */
  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 #ifdef __STDC__
  45 extern long     priocntl(idtype_t, id_t, int, ...);
  46 extern long     priocntlset(procset_t *, int, ...);
  47 #else
  48 extern long     priocntl(), priocntlset();
  49 #endif  /* __STDC__ */
  50 
  51 /*
  52  * The following are the possible values of the command
  53  * argument for the priocntl system call.
  54  */
  55 
  56 #define PC_GETCID       0       /* Get class ID */
  57 #define PC_GETCLINFO    1       /* Get info about a configured class */
  58 #define PC_SETPARMS     2       /* Set scheduling parameters */
  59 #define PC_GETPARMS     3       /* Get scheduling parameters */
  60 #define PC_ADMIN        4       /* Scheduler administration (used by */
  61                                 /* dispadmin(1M), not for general use) */
  62 #define PC_GETPRIRANGE  5       /* Get priority range for a class */
  63                                 /* posix.4 scheduling, not for general use */
  64 #define PC_DONICE       6       /* Set or get nice value */
  65 #define PC_SETXPARMS    7       /* Set extended scheduling parameters */
  66 #define PC_GETXPARMS    8       /* Get extended scheduling parameters */
  67 #define PC_SETDFLCL     9       /* Set default class, not for general use */
  68 #define PC_GETDFLCL     10      /* Get default class, not for general use */
  69 #define PC_DOPRIO       11      /* Set or get priority, not for general use */
  70 
  71 #define PC_CLNULL       -1
  72 
  73 #define PC_CLNMSZ       16
  74 #define PC_CLINFOSZ     (32 / sizeof (int))
  75 #define PC_CLPARMSZ     (32 / sizeof (int))
  76 
  77 #define PC_GETNICE      0
  78 #define PC_SETNICE      1
  79 
  80 #define PC_GETPRIO      0
  81 #define PC_SETPRIO      1
  82 
  83 typedef struct pcinfo {
  84         id_t    pc_cid;                 /* class id */
  85         char    pc_clname[PC_CLNMSZ];   /* class name */
  86         int     pc_clinfo[PC_CLINFOSZ]; /* class information */
  87 } pcinfo_t;
  88 
  89 typedef struct pcparms {
  90         id_t    pc_cid;                     /* process class */
  91         int     pc_clparms[PC_CLPARMSZ];    /* class specific parameters */
  92 } pcparms_t;
  93 
  94 typedef struct pcnice {
  95         int     pc_val;                 /* nice value */
  96         int     pc_op;                  /* type of operation, set or get */
  97 } pcnice_t;
  98 
  99 typedef struct pcprio {
 100         int     pc_op;                  /* type of operation, set or get */
 101         id_t    pc_cid;                 /* class id */
 102         int     pc_val;                 /* priority value */
 103 } pcprio_t;
 104 
 105 /*
 106  * The following is used by the priocntl(2) varargs interface (command
 107  * codes: PC_SETXPARMS and PC_GETXPARMS).
 108  */
 109 
 110 #define PC_VAPARMCNT    8       /* maximal number of (key, value) pairs */
 111 #define PC_KY_NULL      0       /* terminates the (key, value) pair chain */
 112 #define PC_KY_CLNAME    1       /* get the class name of a process or LWP. */
 113 
 114 typedef struct pc_vaparm {
 115         int             pc_key;         /* describing key */
 116         u_longlong_t    pc_parm;        /* associated parameter */
 117 } pc_vaparm_t;
 118 
 119 typedef struct pc_vaparms {
 120         uint_t          pc_vaparmscnt;          /* # of (key, value) pairs */
 121         pc_vaparm_t     pc_parms[PC_VAPARMCNT]; /* parameter buffer */
 122 } pc_vaparms_t;
 123 
 124 #if defined(_SYSCALL32) && \
 125         _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
 126 
 127 /*
 128  * These structures are needed by the 64-bit kernel on certain architectures
 129  * to translate pc_vaparms_t/pc_vaparm_t data structures from 32-bit userland.
 130  */
 131 #pragma pack(4)
 132 
 133 typedef struct {
 134         int32_t         pc_key;         /* describing key */
 135         uint64_t        pc_parm;        /* associated parameter */
 136 } pc_vaparm32_t;
 137 
 138 #pragma pack()
 139 
 140 typedef struct {
 141         uint32_t        pc_vaparmscnt;          /* # of (key, value) pairs */
 142         pc_vaparm32_t   pc_parms[PC_VAPARMCNT]; /* parameter buffer */
 143 } pc_vaparms32_t;
 144 
 145 #endif  /* _SYSCALL32 && ... */
 146 
 147 /*
 148  * The following is used by libc for posix.4
 149  * scheduler interfaces and is not for general use.
 150  */
 151 
 152 typedef struct pcpri {
 153         id_t    pc_cid;                 /* process class */
 154         pri_t   pc_clpmax;              /* class priority max */
 155         pri_t   pc_clpmin;              /* class priority min */
 156 } pcpri_t;
 157 
 158 /*
 159  * The following is used by the dispadmin(1M) command for
 160  * scheduler administration and is not for general use.
 161  */
 162 
 163 #ifdef _SYSCALL32
 164 /* Data structure for ILP32 clients */
 165 typedef struct pcadmin32 {
 166         id32_t          pc_cid;
 167         caddr32_t       pc_cladmin;
 168 } pcadmin32_t;
 169 #endif  /* _SYSCALL32 */
 170 
 171 typedef struct pcadmin {
 172         id_t    pc_cid;
 173         caddr_t pc_cladmin;
 174 } pcadmin_t;
 175 
 176 #ifdef  __cplusplus
 177 }
 178 #endif
 179 
 180 #endif  /* _SYS_PRIOCNTL_H */