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#pragma ident	"%Z%%M%	%I%	%E% SMI"	/* from SVr4.0 1.12 */
31
32#include <sys/types.h>
33#include <sys/param.h>
34#include <sys/sysmacros.h>
35#include <sys/signal.h>
36#include <sys/pcb.h>
37#include <sys/user.h>
38#include <sys/systm.h>
39#include <sys/sysinfo.h>
40#include <sys/var.h>
41#include <sys/errno.h>
42#include <sys/cmn_err.h>
43#include <sys/proc.h>
44#include <sys/debug.h>
45#include <sys/inline.h>
46#include <sys/disp.h>
47#include <sys/class.h>
48#include <sys/kmem.h>
49#include <sys/cpuvar.h>
50#include <sys/priocntl.h>
51
52/*
53 * Class specific code for the sys class. There are no
54 * class specific data structures associated with
55 * the sys class and the scheduling policy is trivially
56 * simple. There is no time slicing.
57 */
58
59pri_t		sys_init(id_t, int, classfuncs_t **);
60static int	sys_getclpri(pcpri_t *);
61static int	sys_fork(kthread_t *, kthread_t *, void *);
62static int	sys_enterclass(kthread_t *, id_t, void *, cred_t *, void *);
63static int	sys_canexit(kthread_t *, cred_t *);
64static int	sys_nosys();
65static int	sys_donice(kthread_t *, cred_t *, int, int *);
66static int	sys_doprio(kthread_t *, cred_t *, int, int *);
67static void	sys_forkret(kthread_t *, kthread_t *);
68static void	sys_nullsys();
69static pri_t	sys_swappri(kthread_t *, int);
70static int	sys_alloc(void **, int);
71
72struct classfuncs sys_classfuncs = {
73	/* messages to class manager */
74	{
75		sys_nosys,	/* admin */
76		sys_nosys,	/* getclinfo */
77		sys_nosys,	/* parmsin */
78		sys_nosys,	/* parmsout */
79		sys_nosys,	/* vaparmsin */
80		sys_nosys,	/* vaparmsout */
81		sys_getclpri,	/* getclpri */
82		sys_alloc,
83		sys_nullsys,	/* free */
84	},
85	/* operations on threads */
86	{
87		sys_enterclass,	/* enterclass */
88		sys_nullsys,	/* exitclass */
89		sys_canexit,
90		sys_fork,
91		sys_forkret,	/* forkret */
92		sys_nullsys,	/* parmsget */
93		sys_nosys,	/* parmsset */
94		sys_nullsys,	/* stop */
95		sys_nullsys,	/* exit */
96		sys_nullsys,	/* active */
97		sys_nullsys,	/* inactive */
98		sys_swappri,	/* swapin */
99		sys_swappri,	/* swapout */
100		sys_nullsys,	/* trapret */
101		setfrontdq,	/* preempt */
102		setbackdq,	/* setrun */
103		sys_nullsys,	/* sleep */
104		sys_nullsys,	/* tick */
105		setbackdq,	/* wakeup */
106		sys_donice,
107		(pri_t (*)())sys_nosys,	/* globpri */
108		sys_nullsys,	/* set_process_group */
109		sys_nullsys,	/* yield */
110		sys_doprio,
111	}
112
113};
114
115
116/* ARGSUSED */
117pri_t
118sys_init(cid, clparmsz, clfuncspp)
119	id_t		cid;
120	int		clparmsz;
121	classfuncs_t	**clfuncspp;
122{
123	*clfuncspp = &sys_classfuncs;
124	return ((pri_t)v.v_maxsyspri);
125}
126
127/*
128 * Get maximum and minimum priorities enjoyed by sysclass threads
129 */
130static int
131sys_getclpri(pcpri_t *pcprip)
132{
133	pcprip->pc_clpmax = maxclsyspri;
134	pcprip->pc_clpmin = minclsyspri;
135	return (0);
136}
137
138/* ARGSUSED */
139static int
140sys_enterclass(t, cid, parmsp, reqpcredp, bufp)
141	kthread_t	*t;
142	id_t		cid;
143	void		*parmsp;
144	cred_t		*reqpcredp;
145	void		*bufp;
146{
147	return (0);
148}
149
150/* ARGSUSED */
151static int
152sys_canexit(kthread_t *t, cred_t *reqpcredp)
153{
154	return (0);
155}
156
157/* ARGSUSED */
158static int
159sys_fork(t, ct, bufp)
160	kthread_t *t;
161	kthread_t *ct;
162	void	*bufp;
163{
164	/*
165	 * No class specific data structure
166	 */
167	return (0);
168}
169
170
171/* ARGSUSED */
172static void
173sys_forkret(t, ct)
174	kthread_t *t;
175	kthread_t *ct;
176{
177	register proc_t *pp = ttoproc(t);
178	register proc_t *cp = ttoproc(ct);
179
180	ASSERT(t == curthread);
181	ASSERT(MUTEX_HELD(&pidlock));
182
183	/*
184	 * Grab the child's p_lock before dropping pidlock to ensure
185	 * the process does not disappear before we set it running.
186	 */
187	mutex_enter(&cp->p_lock);
188	mutex_exit(&pidlock);
189	continuelwps(cp);
190	mutex_exit(&cp->p_lock);
191
192	mutex_enter(&pp->p_lock);
193	continuelwps(pp);
194	mutex_exit(&pp->p_lock);
195}
196
197/* ARGSUSED */
198static pri_t
199sys_swappri(t, flags)
200	kthread_t	*t;
201	int		flags;
202{
203	return (-1);
204}
205
206static int
207sys_nosys()
208{
209	return (ENOSYS);
210}
211
212
213static void
214sys_nullsys()
215{
216}
217
218/* ARGSUSED */
219static int
220sys_donice(kthread_t *t, cred_t *cr, int incr, int *retvalp)
221{
222	return (EINVAL);
223}
224
225/* ARGSUSED */
226static int
227sys_doprio(kthread_t *t, cred_t *cr, int incr, int *retvalp)
228{
229	return (EINVAL);
230}
231
232/* ARGSUSED */
233static int
234sys_alloc(void **p, int flag)
235{
236	*p = NULL;
237	return (0);
238}
239