xref: /freebsd-src/share/man/man9/cpu_machdep.9 (revision 9c87cbbcaaedbc4e07d5c9d0248bf76f72531f57)
1*9c87cbbcSJohn Baldwin.\"-
2*9c87cbbcSJohn Baldwin.\" SPDX-License-Identifier: BSD-2-Clause
3*9c87cbbcSJohn Baldwin.\"
4*9c87cbbcSJohn Baldwin.\" Copyright (c) 2024 (holder)
5*9c87cbbcSJohn Baldwin.\"
6*9c87cbbcSJohn Baldwin.\" This software was developed by SRI International, the University of
7*9c87cbbcSJohn Baldwin.\" Cambridge Computer Laboratory (Department of Computer Science and
8*9c87cbbcSJohn Baldwin.\" Technology), and Capabilities Limited under Defense Advanced Research
9*9c87cbbcSJohn Baldwin.\" Projects Agency (DARPA) Contract No. FA8750-24-C-B047 ("DEC").
10*9c87cbbcSJohn Baldwin.\"
11*9c87cbbcSJohn Baldwin.Dd January 3, 2025
12*9c87cbbcSJohn Baldwin.Dt cpu_machdep 9
13*9c87cbbcSJohn Baldwin.Os
14*9c87cbbcSJohn Baldwin.Sh NAME
15*9c87cbbcSJohn Baldwin.Nm cpu_machdep ,
16*9c87cbbcSJohn Baldwin.Nm cpu_copy_thread ,
17*9c87cbbcSJohn Baldwin.Nm cpu_exec_vmspace_reuse ,
18*9c87cbbcSJohn Baldwin.Nm cpu_exit ,
19*9c87cbbcSJohn Baldwin.Nm cpu_fetch_syscall_args ,
20*9c87cbbcSJohn Baldwin.Nm cpu_fork ,
21*9c87cbbcSJohn Baldwin.Nm cpu_fork_kthread_handler ,
22*9c87cbbcSJohn Baldwin.Nm cpu_idle ,
23*9c87cbbcSJohn Baldwin.Nm cpu_idle_wakeup ,
24*9c87cbbcSJohn Baldwin.Nm cpu_procctl ,
25*9c87cbbcSJohn Baldwin.Nm cpu_set_syscall_retval ,
26*9c87cbbcSJohn Baldwin.Nm cpu_set_upcall ,
27*9c87cbbcSJohn Baldwin.Nm cpu_set_user_tls ,
28*9c87cbbcSJohn Baldwin.Nm cpu_switch ,
29*9c87cbbcSJohn Baldwin.Nm cpu_sync_core ,
30*9c87cbbcSJohn Baldwin.Nm cpu_thread_alloc ,
31*9c87cbbcSJohn Baldwin.Nm cpu_thread_clean ,
32*9c87cbbcSJohn Baldwin.Nm cpu_thread_exit ,
33*9c87cbbcSJohn Baldwin.Nm cpu_thread_free ,
34*9c87cbbcSJohn Baldwin.Nm cpu_throw
35*9c87cbbcSJohn Baldwin.Nd machine-dependent interfaces to handle CPU and thread state
36*9c87cbbcSJohn Baldwin.Sh SYNOPSIS
37*9c87cbbcSJohn Baldwin.In sys/proc.h
38*9c87cbbcSJohn Baldwin.In sys/ptrace.h
39*9c87cbbcSJohn Baldwin.Ft void
40*9c87cbbcSJohn Baldwin.Fn cpu_copy_thread "struct thread *td" "struct thread *td0"
41*9c87cbbcSJohn Baldwin.Ft bool
42*9c87cbbcSJohn Baldwin.Fn cpu_exec_vmspace_reuse "struct proc *p" "struct vm_map *map"
43*9c87cbbcSJohn Baldwin.Ft void
44*9c87cbbcSJohn Baldwin.Fn cpu_exit "struct thread *td"
45*9c87cbbcSJohn Baldwin.Ft int
46*9c87cbbcSJohn Baldwin.Fn cpu_fetch_syscall_args "struct thread *td"
47*9c87cbbcSJohn Baldwin.Ft void
48*9c87cbbcSJohn Baldwin.Fo cpu_fork
49*9c87cbbcSJohn Baldwin.Fa "struct thread *td1" "struct proc *p2" "struct thread *td2" "int flags"
50*9c87cbbcSJohn Baldwin.Fc
51*9c87cbbcSJohn Baldwin.Ft void
52*9c87cbbcSJohn Baldwin.Fo cpu_fork_kthread_handler
53*9c87cbbcSJohn Baldwin.Fa "struct thread *td" "void (*func)(void *)" "void *arg"
54*9c87cbbcSJohn Baldwin.Fc
55*9c87cbbcSJohn Baldwin.Ft void
56*9c87cbbcSJohn Baldwin.Fn cpu_idle "int busy"
57*9c87cbbcSJohn Baldwin.Ft int
58*9c87cbbcSJohn Baldwin.Fn cpu_idle_wakeup "int cpu"
59*9c87cbbcSJohn Baldwin.Ft int
60*9c87cbbcSJohn Baldwin.Fo cpu_procctl
61*9c87cbbcSJohn Baldwin.Fa "struct thread *td" "int idtype" "id_t id" "int com" "void *data"
62*9c87cbbcSJohn Baldwin.Fc
63*9c87cbbcSJohn Baldwin.Ft int
64*9c87cbbcSJohn Baldwin.Fn cpu_ptrace "struct thread *_td" "int req" "void *addr" "int data"
65*9c87cbbcSJohn Baldwin.Ft void
66*9c87cbbcSJohn Baldwin.Fn cpu_set_syscall_retval "struct thread *td" "int error"
67*9c87cbbcSJohn Baldwin.Ft int
68*9c87cbbcSJohn Baldwin.Fo cpu_set_upcall
69*9c87cbbcSJohn Baldwin.Fa "struct thread *td" "void (*entry)(void *)" "void *arg" "stack_t *stack"
70*9c87cbbcSJohn Baldwin.Fc
71*9c87cbbcSJohn Baldwin.Ft int
72*9c87cbbcSJohn Baldwin.Fn cpu_set_user_tls "struct thread *td" "void *tls_base"
73*9c87cbbcSJohn Baldwin.Ft void
74*9c87cbbcSJohn Baldwin.Fn cpu_switch "struct thread *old" "struct thread *new" "struct mtx *mtx"
75*9c87cbbcSJohn Baldwin.Ft void
76*9c87cbbcSJohn Baldwin.Fn cpu_sync_core "void"
77*9c87cbbcSJohn Baldwin.Ft void
78*9c87cbbcSJohn Baldwin.Fn cpu_thread_alloc "struct thread *td"
79*9c87cbbcSJohn Baldwin.Ft void
80*9c87cbbcSJohn Baldwin.Fn cpu_thread_clean "struct thread *td"
81*9c87cbbcSJohn Baldwin.Ft void
82*9c87cbbcSJohn Baldwin.Fn cpu_thread_exit "struct thread *td"
83*9c87cbbcSJohn Baldwin.Ft void
84*9c87cbbcSJohn Baldwin.Fn cpu_thread_free "struct thread *td"
85*9c87cbbcSJohn Baldwin.Ft void
86*9c87cbbcSJohn Baldwin.Fn cpu_throw "struct thread *old" "struct thread *new"
87*9c87cbbcSJohn Baldwin.Sh DESCRIPTION
88*9c87cbbcSJohn BaldwinThese functions provide architecture-specific implementations of
89*9c87cbbcSJohn Baldwinmachine-independent abstractions.
90*9c87cbbcSJohn Baldwin.Pp
91*9c87cbbcSJohn Baldwin.Fn cpu_exec_vmspace_reuse
92*9c87cbbcSJohn Baldwinreturns true if
93*9c87cbbcSJohn Baldwin.Fn exec_new_vmspace
94*9c87cbbcSJohn Baldwincan reuse an existing
95*9c87cbbcSJohn Baldwin.Vt struct vmspace
96*9c87cbbcSJohn Baldwin.Pq Fa map
97*9c87cbbcSJohn Baldwinfor the process
98*9c87cbbcSJohn Baldwin.Fa p
99*9c87cbbcSJohn Baldwinduring
100*9c87cbbcSJohn Baldwin.Xr execve 2 .
101*9c87cbbcSJohn BaldwinThis is only invoked if
102*9c87cbbcSJohn Baldwin.Fa map
103*9c87cbbcSJohn Baldwinis not shared with any other consumers.
104*9c87cbbcSJohn BaldwinIf this returns false,
105*9c87cbbcSJohn Baldwin.Fn exec_new_vmspace
106*9c87cbbcSJohn Baldwinwill create a new
107*9c87cbbcSJohn Baldwin.Vt struct vmspace .
108*9c87cbbcSJohn Baldwin.Pp
109*9c87cbbcSJohn Baldwin.Fn cpu_exit
110*9c87cbbcSJohn Baldwinreleases machine-dependent resources other than the address space for the
111*9c87cbbcSJohn Baldwinprocess containing
112*9c87cbbcSJohn Baldwin.Fa td
113*9c87cbbcSJohn Baldwinduring process exit.
114*9c87cbbcSJohn Baldwin.Pp
115*9c87cbbcSJohn Baldwin.Fn cpu_fork
116*9c87cbbcSJohn Baldwincopies and updates machine-dependent state
117*9c87cbbcSJohn Baldwin(for example, the pcb and user registers) from the forking thread
118*9c87cbbcSJohn Baldwin.Fa td1
119*9c87cbbcSJohn Baldwinin an existing process to the new thread
120*9c87cbbcSJohn Baldwin.Fa td2
121*9c87cbbcSJohn Baldwinin the new process
122*9c87cbbcSJohn Baldwin.Fa p2 .
123*9c87cbbcSJohn BaldwinThis function must set up the new thread's kernel stack and pcb so that
124*9c87cbbcSJohn Baldwin.Fa td2
125*9c87cbbcSJohn Baldwincalls
126*9c87cbbcSJohn Baldwin.Fn fork_exit
127*9c87cbbcSJohn Baldwinwhen it begins execution passing a pointer to
128*9c87cbbcSJohn Baldwin.Fn fork_return
129*9c87cbbcSJohn Baldwinas the
130*9c87cbbcSJohn Baldwin.Fa callout
131*9c87cbbcSJohn Baldwinargument and
132*9c87cbbcSJohn Baldwin.Fa td2
133*9c87cbbcSJohn Baldwinas the
134*9c87cbbcSJohn Baldwin.Fa arg
135*9c87cbbcSJohn Baldwinargument.
136*9c87cbbcSJohn Baldwin.Pp
137*9c87cbbcSJohn Baldwin.Fn cpu_fork_kthread_handler
138*9c87cbbcSJohn Baldwinadjusts a new thread's initial pcb and/or kernel stack to pass
139*9c87cbbcSJohn Baldwin.Fa func
140*9c87cbbcSJohn Baldwinand
141*9c87cbbcSJohn Baldwin.Fa arg
142*9c87cbbcSJohn Baldwinas the
143*9c87cbbcSJohn Baldwin.Fa callout
144*9c87cbbcSJohn Baldwinand
145*9c87cbbcSJohn Baldwin.Fa arg
146*9c87cbbcSJohn Baldwinarguments to
147*9c87cbbcSJohn Baldwin.Fn fork_exit .
148*9c87cbbcSJohn BaldwinThis must be called before a new thread is scheduled to run and is
149*9c87cbbcSJohn Baldwinused to set the
150*9c87cbbcSJohn Baldwin.Dq main
151*9c87cbbcSJohn Baldwinfunction for kernel threads.
152*9c87cbbcSJohn Baldwin.Pp
153*9c87cbbcSJohn Baldwin.Fn cpu_copy_thread
154*9c87cbbcSJohn Baldwincopies machine-dependent state (for example, the pcb and user registers) from
155*9c87cbbcSJohn Baldwin.Fa td
156*9c87cbbcSJohn Baldwinto
157*9c87cbbcSJohn Baldwin.Fa td0
158*9c87cbbcSJohn Baldwinwhen creating a new thread in the same process.
159*9c87cbbcSJohn BaldwinThis function must set up the new thread's kernel stack and pcb so that
160*9c87cbbcSJohn Baldwin.Fa td0
161*9c87cbbcSJohn Baldwincalls
162*9c87cbbcSJohn Baldwin.Fn fork_exit
163*9c87cbbcSJohn Baldwinwhen it begins execution passing a pointer to
164*9c87cbbcSJohn Baldwin.Fn fork_return
165*9c87cbbcSJohn Baldwinas the
166*9c87cbbcSJohn Baldwin.Fa callout
167*9c87cbbcSJohn Baldwinargument and
168*9c87cbbcSJohn Baldwin.Fa td0
169*9c87cbbcSJohn Baldwinas the
170*9c87cbbcSJohn Baldwin.Fa arg
171*9c87cbbcSJohn Baldwinargument.
172*9c87cbbcSJohn Baldwin.Pp
173*9c87cbbcSJohn Baldwin.Fn cpu_set_upcall
174*9c87cbbcSJohn Baldwinupdates a new thread's initial user register state to call
175*9c87cbbcSJohn Baldwin.Fa entry
176*9c87cbbcSJohn Baldwinwith
177*9c87cbbcSJohn Baldwin.Fa arg
178*9c87cbbcSJohn Baldwinas the sole argument using the user stack described in
179*9c87cbbcSJohn Baldwin.Fa stack .
180*9c87cbbcSJohn Baldwin.Pp
181*9c87cbbcSJohn Baldwin.Fn cpu_set_user_tls
182*9c87cbbcSJohn Baldwinsets a new thread's initial user thread pointer register to
183*9c87cbbcSJohn Baldwinreference the user TLS base pointer
184*9c87cbbcSJohn Baldwin.Fa tls_base .
185*9c87cbbcSJohn Baldwin.Pp
186*9c87cbbcSJohn Baldwin.Fn cpu_fetch_syscall_args
187*9c87cbbcSJohn Baldwinfetches the current system call arguments for the native FreeBSD ABI from the
188*9c87cbbcSJohn Baldwincurrent thread's user register state and/or user stack.
189*9c87cbbcSJohn BaldwinThe arguments are saved in the
190*9c87cbbcSJohn Baldwin.Fa td_sa
191*9c87cbbcSJohn Baldwinmember of
192*9c87cbbcSJohn Baldwin.Fa td .
193*9c87cbbcSJohn Baldwin.Pp
194*9c87cbbcSJohn Baldwin.Fn cpu_set_syscall_retval
195*9c87cbbcSJohn Baldwinupdates the user register state for
196*9c87cbbcSJohn Baldwin.Fa td
197*9c87cbbcSJohn Baldwinto store system call error and return values.
198*9c87cbbcSJohn BaldwinIf
199*9c87cbbcSJohn Baldwin.Fa error
200*9c87cbbcSJohn Baldwinis 0,
201*9c87cbbcSJohn Baldwinindicate success and return the two values in
202*9c87cbbcSJohn Baldwin.Fa td_retval .
203*9c87cbbcSJohn BaldwinIf
204*9c87cbbcSJohn Baldwin.Fa error
205*9c87cbbcSJohn Baldwinis
206*9c87cbbcSJohn Baldwin.Dv ERESTART,
207*9c87cbbcSJohn Baldwinadjust the user PC to re-invoke the current system call after returning
208*9c87cbbcSJohn Baldwinto user mode.
209*9c87cbbcSJohn BaldwinIf
210*9c87cbbcSJohn Baldwin.Fa error
211*9c87cbbcSJohn Baldwinis
212*9c87cbbcSJohn Baldwin.Dv EJUSTRETURN ,
213*9c87cbbcSJohn Baldwinleave the current user register state unchanged.
214*9c87cbbcSJohn BaldwinFor any other value of
215*9c87cbbcSJohn Baldwin.Fa error ,
216*9c87cbbcSJohn Baldwinindicate error and return
217*9c87cbbcSJohn Baldwin.Fa error
218*9c87cbbcSJohn Baldwinas the error code.
219*9c87cbbcSJohn Baldwin.Pp
220*9c87cbbcSJohn Baldwin.Fn cpu_idle
221*9c87cbbcSJohn Baldwinwaits for the next interrupt to occur on the current CPU.
222*9c87cbbcSJohn BaldwinIf an architecture supports low power idling,
223*9c87cbbcSJohn Baldwinthis function should place the CPU into a low power state while waiting.
224*9c87cbbcSJohn Baldwin.Fa busy
225*9c87cbbcSJohn Baldwinis a hint from the scheduler.
226*9c87cbbcSJohn BaldwinIf
227*9c87cbbcSJohn Baldwin.Fa busy
228*9c87cbbcSJohn Baldwinis non-zero,
229*9c87cbbcSJohn Baldwinthe scheduler expects a short sleep,
230*9c87cbbcSJohn Baldwinso the CPU should prefer low-latency over maximum power savings.
231*9c87cbbcSJohn BaldwinIf
232*9c87cbbcSJohn Baldwin.Fa busy
233*9c87cbbcSJohn Baldwinis zero,
234*9c87cbbcSJohn Baldwinthe CPU should maximumize power savings including deferring unnecessary
235*9c87cbbcSJohn Baldwinclock interrupts via
236*9c87cbbcSJohn Baldwin.Fn cpu_idleclock .
237*9c87cbbcSJohn Baldwin.Pp
238*9c87cbbcSJohn Baldwin.Fn cpu_idle_wakeup
239*9c87cbbcSJohn Baldwinawakens the idle CPU with the ID
240*9c87cbbcSJohn Baldwin.Fa cpu
241*9c87cbbcSJohn Baldwinfrom a low-power state.
242*9c87cbbcSJohn Baldwin.Pp
243*9c87cbbcSJohn Baldwin.Fn cpu_procctl
244*9c87cbbcSJohn Baldwinhandles any machine-dependent
245*9c87cbbcSJohn Baldwin.Xr procctl 2
246*9c87cbbcSJohn Baldwinrequests.
247*9c87cbbcSJohn Baldwin.Pp
248*9c87cbbcSJohn Baldwin.Fn cpu_ptrace
249*9c87cbbcSJohn Baldwinhandles any machine-dependent
250*9c87cbbcSJohn Baldwin.Xr ptrace 2
251*9c87cbbcSJohn Baldwinrequests.
252*9c87cbbcSJohn Baldwin.Pp
253*9c87cbbcSJohn Baldwin.Fn cpu_switch
254*9c87cbbcSJohn Baldwinswitches the current CPU between threads by swapping register state.
255*9c87cbbcSJohn BaldwinThis function saves the current CPU register state in the pcb of
256*9c87cbbcSJohn Baldwin.Fa old
257*9c87cbbcSJohn Baldwinand loads register values from the pcb of
258*9c87cbbcSJohn Baldwin.Fa new
259*9c87cbbcSJohn Baldwinbefore returning.
260*9c87cbbcSJohn BaldwinWhile the pcb generally contains caller-save kernel register state,
261*9c87cbbcSJohn Baldwinit can also contain user registers that are not saved in the trapframe.
262*9c87cbbcSJohn Baldwin.Pp
263*9c87cbbcSJohn BaldwinAfter saving the current CPU register state of
264*9c87cbbcSJohn Baldwin.Fa old ,
265*9c87cbbcSJohn Baldwin.Fn cpu_switch
266*9c87cbbcSJohn Baldwinstores
267*9c87cbbcSJohn Baldwin.Fa mtx
268*9c87cbbcSJohn Baldwinin the
269*9c87cbbcSJohn Baldwin.Fa td_lock
270*9c87cbbcSJohn Baldwinmember of
271*9c87cbbcSJohn Baldwin.Fa old
272*9c87cbbcSJohn Baldwintransferring ownership of the old thread.
273*9c87cbbcSJohn BaldwinNo data belonging to
274*9c87cbbcSJohn Baldwin.Fa old
275*9c87cbbcSJohn Baldwincan be accessed after that store.
276*9c87cbbcSJohn BaldwinSpecifically, the old thread's kernel stack must not be accessed after
277*9c87cbbcSJohn Baldwinthis point.
278*9c87cbbcSJohn Baldwin.Pp
279*9c87cbbcSJohn BaldwinWhen
280*9c87cbbcSJohn Baldwin.Dv SCHED_ULE
281*9c87cbbcSJohn Baldwinis being used,
282*9c87cbbcSJohn Baldwinthis function must wait (via spinning) for the
283*9c87cbbcSJohn Baldwin.Fa td_lock
284*9c87cbbcSJohn Baldwinmember of
285*9c87cbbcSJohn Baldwin.Fa new
286*9c87cbbcSJohn Baldwinto change to a value not equal to
287*9c87cbbcSJohn Baldwin.Va &blocked_lock
288*9c87cbbcSJohn Baldwinbefore loading register values from
289*9c87cbbcSJohn Baldwin.Fa new
290*9c87cbbcSJohn Baldwinor accessing its kernel stack.
291*9c87cbbcSJohn Baldwin.Pp
292*9c87cbbcSJohn BaldwinFrom the caller's perspective,
293*9c87cbbcSJohn Baldwin.Fn cpu_switch
294*9c87cbbcSJohn Baldwinreturns when
295*9c87cbbcSJohn Baldwin.Fa old
296*9c87cbbcSJohn Baldwinis rescheduled in the future,
297*9c87cbbcSJohn Baldwinpossibly on a different CPU.
298*9c87cbbcSJohn BaldwinHowever, the implementation of
299*9c87cbbcSJohn Baldwin.Fn cpu_switch
300*9c87cbbcSJohn Baldwinreturns immediately on the same CPU into the previously-saved context of
301*9c87cbbcSJohn Baldwin.Fa new .
302*9c87cbbcSJohn Baldwin.Pp
303*9c87cbbcSJohn Baldwin.Fn cpu_throw
304*9c87cbbcSJohn Baldwinis similar to
305*9c87cbbcSJohn Baldwin.Fn cpu_switch
306*9c87cbbcSJohn Baldwinbut does not save any state for
307*9c87cbbcSJohn Baldwin.Fa old
308*9c87cbbcSJohn Baldwinor write to the old thread's
309*9c87cbbcSJohn Baldwin.Fa td_lock
310*9c87cbbcSJohn Baldwinmember.
311*9c87cbbcSJohn Baldwin.Pp
312*9c87cbbcSJohn Baldwin.Fn cpu_sync_core
313*9c87cbbcSJohn Baldwinensures that all possible speculation and out-of-order execution is
314*9c87cbbcSJohn Baldwinserialized on the current CPU.
315*9c87cbbcSJohn BaldwinNote that this is called from an IPI handler so only has to handle
316*9c87cbbcSJohn Baldwinadditional serialization beyond that provided by handling an IPI.
317*9c87cbbcSJohn Baldwin.Ss Thread Object Lifecycle
318*9c87cbbcSJohn BaldwinThese functions support the management of machine-dependent thread
319*9c87cbbcSJohn Baldwinstate in conjunction with a thread object's lifecycle.
320*9c87cbbcSJohn Baldwin.Pp
321*9c87cbbcSJohn BaldwinThe general model is that a thread object is allocated each time a
322*9c87cbbcSJohn Baldwinnew kernel thread is created either by system calls like
323*9c87cbbcSJohn Baldwin.Xr fork 2
324*9c87cbbcSJohn Baldwinor
325*9c87cbbcSJohn Baldwin.Xr thr_new 2
326*9c87cbbcSJohn Baldwinor when kernel-only threads are created via
327*9c87cbbcSJohn Baldwin.Xr kproc_create 9 ,
328*9c87cbbcSJohn Baldwin.Xr kproc_kthread_add 9 ,
329*9c87cbbcSJohn Baldwinor
330*9c87cbbcSJohn Baldwin.Xr kthread_add 9 .
331*9c87cbbcSJohn BaldwinWhen a kernel thread exits,
332*9c87cbbcSJohn Baldwinthe thread object is freed.
333*9c87cbbcSJohn BaldwinHowever, there is one special case to support an optimization where each
334*9c87cbbcSJohn Baldwinfree process object caches a thread object.
335*9c87cbbcSJohn BaldwinWhen a process exits, the last thread object is not freed but remains
336*9c87cbbcSJohn Baldwinattached to the process.
337*9c87cbbcSJohn BaldwinWhen the process object is later reused for a new process in
338*9c87cbbcSJohn Baldwin.Xr fork 2 ,
339*9c87cbbcSJohn Baldwinthe kernel recycles that last thread object and uses it as the initial
340*9c87cbbcSJohn Baldwinthread in the new process.
341*9c87cbbcSJohn BaldwinWhen a thread is recycled, some of the steps in the thread allocation
342*9c87cbbcSJohn Baldwinand free cycle are skipped as an optimization.
343*9c87cbbcSJohn Baldwin.Pp
344*9c87cbbcSJohn Baldwin.Fn cpu_thread_alloc
345*9c87cbbcSJohn Baldwininitializes machine-dependent fields in
346*9c87cbbcSJohn Baldwin.Fa td
347*9c87cbbcSJohn Baldwinafter allocating a new kernel stack.
348*9c87cbbcSJohn BaldwinThis function typically sets the
349*9c87cbbcSJohn Baldwin.Fa td_pcb
350*9c87cbbcSJohn Baldwinand initial
351*9c87cbbcSJohn Baldwin.Fa td_frame
352*9c87cbbcSJohn Baldwinpointers.
353*9c87cbbcSJohn Baldwin.Fn cpu_thread_alloc
354*9c87cbbcSJohn Baldwinis called both when allocating a new thread object and
355*9c87cbbcSJohn Baldwinwhen a recycled thread allocates a new kernel stack.
356*9c87cbbcSJohn BaldwinNote that this function is
357*9c87cbbcSJohn Baldwin.Em not
358*9c87cbbcSJohn Baldwincalled if a recycled thread reuses its existing kernel stack.
359*9c87cbbcSJohn Baldwin.Pp
360*9c87cbbcSJohn Baldwin.Fn cpu_thread_clean
361*9c87cbbcSJohn Baldwinreleases any machine-dependent resources for the last thread in a
362*9c87cbbcSJohn Baldwinprocess during
363*9c87cbbcSJohn Baldwin.Xr wait 2 .
364*9c87cbbcSJohn BaldwinThe thread is a candidate for recycling so should be reset to run as a
365*9c87cbbcSJohn Baldwinnew thread in case it is recycled by a future
366*9c87cbbcSJohn Baldwin.Xr fork 2 .
367*9c87cbbcSJohn Baldwin.Pp
368*9c87cbbcSJohn Baldwin.Fn cpu_thread_exit
369*9c87cbbcSJohn Baldwincleans any machine-dependent state in
370*9c87cbbcSJohn Baldwin.Fa td
371*9c87cbbcSJohn Baldwinwhile it is exiting.
372*9c87cbbcSJohn BaldwinThis is called by the exiting thread so cannot free state needed during
373*9c87cbbcSJohn Baldwinin-kernel execution.
374*9c87cbbcSJohn Baldwin.Pp
375*9c87cbbcSJohn Baldwin.Fn cpu_thread_free
376*9c87cbbcSJohn Baldwinreleases any machine-dependent state in
377*9c87cbbcSJohn Baldwin.Fa td
378*9c87cbbcSJohn Baldwinwhen it is being freed.
379*9c87cbbcSJohn BaldwinThis is called for any thread that was not the last thread in a process
380*9c87cbbcSJohn Baldwinonce it has finished execution.
381*9c87cbbcSJohn Baldwin.Sh SEE ALSO
382*9c87cbbcSJohn Baldwin.Xr fork 2 ,
383*9c87cbbcSJohn Baldwin.Xr procctl 2 ,
384*9c87cbbcSJohn Baldwin.Xr ptrace 2 ,
385*9c87cbbcSJohn Baldwin.Xr thr_new 2 ,
386*9c87cbbcSJohn Baldwin.Xr wait 2 ,
387*9c87cbbcSJohn Baldwin.Xr kproc_create 9 ,
388*9c87cbbcSJohn Baldwin.Xr kproc_kthread_add 9 ,
389*9c87cbbcSJohn Baldwin.Xr kthread_add 9 ,
390*9c87cbbcSJohn Baldwin.Xr mi_switch 9
391*9c87cbbcSJohn Baldwin.Sh AUTHORS
392*9c87cbbcSJohn BaldwinThis manual page was
393*9c87cbbcSJohn Baldwindeveloped by SRI International, the University of Cambridge Computer
394*9c87cbbcSJohn BaldwinLaboratory (Department of Computer Science and Technology), and
395*9c87cbbcSJohn BaldwinCapabilities Limited under contract
396*9c87cbbcSJohn Baldwin.Pq FA8750-24-C-B047
397*9c87cbbcSJohn Baldwin.Pq Do DEC Dc .
398