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