1.\" $NetBSD: ctxsw.9,v 1.2 1996/12/02 00:11:31 tls Exp $ 2.\" 3.\" Copyright (c) 1996 The NetBSD Foundation, Inc. 4.\" All rights reserved. 5.\" 6.\" This code is derived from software contributed to The NetBSD Foundation 7.\" by Paul Kranenburg. 8.\" 9.\" Redistribution and use in source and binary forms, with or without 10.\" modification, are permitted provided that the following conditions 11.\" are met: 12.\" 1. Redistributions of source code must retain the above copyright 13.\" notice, this list of conditions and the following disclaimer. 14.\" 2. Redistributions in binary form must reproduce the above copyright 15.\" notice, this list of conditions and the following disclaimer in the 16.\" documentation and/or other materials provided with the distribution. 17.\" 3. All advertising materials mentioning features or use of this software 18.\" must display the following acknowledgement: 19.\" This product includes software developed by the NetBSD 20.\" Foundation, Inc. and its contributors. 21.\" 4. Neither the name of The NetBSD Foundation nor the names of its 22.\" contributors may be used to endorse or promote products derived 23.\" from this software without specific prior written permission. 24.\" 25.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 26.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE 29.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35.\" POSSIBILITY OF SUCH DAMAGE. 36.\" 37.\" $FreeBSD$ 38.\" 39.Dd November 24, 1996 40.Dt MI_SWITCH 9 41.Os FreeBSD 42.Sh NAME 43.Nm mi_switch , 44.Nm cpu_switch , 45.Nm cpu_throw 46.Nd switch to another process context 47.Sh SYNOPSIS 48.Fd #include <sys/param.h> 49.Fd #include <sys/proc.h> 50.Ft void 51.Fn mi_switch "void" 52.Ft void 53.Fn cpu_switch "void" 54.Ft void 55.Fn cpu_throw "void" 56.Sh DESCRIPTION 57The 58.Fn mi_switch 59function implements the machine independent prelude to a process context 60switch. 61It is called from only a few distinguished places in the kernel 62code as a result of the principle of non-preemtable kernel mode execution. 63The three major uses of 64.Nm 65can be enumerated as follows: 66.Bl -enum -offset indent 67.It 68from within 69.Xr sleep 9 70and 71.Xr tsleep 9 72when the current process 73voluntarily relinquishes the CPU to wait for some resource to become 74available. 75.It 76after handling a trap 77.Pq e.g. a system call, device interrupt 78when the kernel prepares a return to user-mode execution. 79This case is 80typically handled by machine dependent trap-handling code after detection 81of a change in the signal disposition of the current process, or when a 82higher priority process might be available to run. 83The latter event is 84communicated by the machine independent scheduling routines by calling 85the machine defined 86.Fn need_resched . 87.It 88in the signal handling code 89.Pq see Xr issignal 9 90if a signal is delivered that causes a process to stop. 91.El 92.Pp 93.Fn mi_switch 94records the amount of time the current process has been running in the 95process structure and checks this value against the CPU time limits 96allocated to the process 97.Pq see Xr getrlimit 2 . 98Exceeding the soft limit results in a 99.Dv SIGXCPU 100signal to be posted to the process, while exceeding the hard limit will 101cause a 102.Dv SIGKILL . 103After these administrative tasks are done, 104.Fn mi_switch 105hands over control to the machine dependent routine 106.Fn cpu_switch , 107which will perform the actual process context switch. 108.Pp 109.Fn cpu_switch 110first saves the context of the current process. 111Next, it calls 112.Fn chooseproc 113to determine which process to run next. 114Finally, it reads in the saved context of the new process and starts to 115execute the new process. 116.Pp 117.Fn cpu_throw 118is similar to 119.Fn cpu_switch 120except that it does not save the context of the old process. 121This function is useful when the kernel does not have an old process 122context to save, such as when CPUs other than the boot CPU perform their 123first task switch, or when the kernel does not care about the state of the 124old process, such as in 125.Fn cpu_exit 126when the kernel terminates the current process and switches into a new 127process. 128.Pp 129To protect the 130.Xr runqueue 9 , 131all of these functions must be called with the 132.Va sched_lock 133mutex held. 134.Sh SEE ALSO 135.Xr issignal 9 , 136.Xr mutex 9 , 137.Xr runqueue 9 , 138.Xr tsleep 9 , 139.Xr wakeup 9 140