19c8b8baaSPeter Wemm /* 29c8b8baaSPeter Wemm * Copyright (c) 1999 Peter Wemm <peter@FreeBSD.org> 39c8b8baaSPeter Wemm * All rights reserved. 49c8b8baaSPeter Wemm * 59c8b8baaSPeter Wemm * Redistribution and use in source and binary forms, with or without 69c8b8baaSPeter Wemm * modification, are permitted provided that the following conditions 79c8b8baaSPeter Wemm * are met: 89c8b8baaSPeter Wemm * 1. Redistributions of source code must retain the above copyright 99c8b8baaSPeter Wemm * notice, this list of conditions and the following disclaimer. 109c8b8baaSPeter Wemm * 2. Redistributions in binary form must reproduce the above copyright 119c8b8baaSPeter Wemm * notice, this list of conditions and the following disclaimer in the 129c8b8baaSPeter Wemm * documentation and/or other materials provided with the distribution. 139c8b8baaSPeter Wemm * 149c8b8baaSPeter Wemm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 159c8b8baaSPeter Wemm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 169c8b8baaSPeter Wemm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 179c8b8baaSPeter Wemm * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 189c8b8baaSPeter Wemm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 199c8b8baaSPeter Wemm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 209c8b8baaSPeter Wemm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 219c8b8baaSPeter Wemm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 229c8b8baaSPeter Wemm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 239c8b8baaSPeter Wemm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 249c8b8baaSPeter Wemm * SUCH DAMAGE. 259c8b8baaSPeter Wemm * 269c8b8baaSPeter Wemm * $FreeBSD$ 279c8b8baaSPeter Wemm */ 289c8b8baaSPeter Wemm 299c8b8baaSPeter Wemm #include <sys/param.h> 309c8b8baaSPeter Wemm #include <sys/systm.h> 319c8b8baaSPeter Wemm #include <sys/kernel.h> 329c8b8baaSPeter Wemm #include <sys/proc.h> 339c8b8baaSPeter Wemm #include <sys/kthread.h> 349c8b8baaSPeter Wemm #include <sys/unistd.h> 359c8b8baaSPeter Wemm #include <sys/wait.h> 369c8b8baaSPeter Wemm 379c8b8baaSPeter Wemm #include <machine/cpu.h> 389c8b8baaSPeter Wemm #include <machine/stdarg.h> 399c8b8baaSPeter Wemm 409c8b8baaSPeter Wemm /* 419c8b8baaSPeter Wemm * Start a kernel process. This is called after a fork() call in 429c8b8baaSPeter Wemm * mi_startup() in the file kern/init_main.c. 439c8b8baaSPeter Wemm * 449c8b8baaSPeter Wemm * This function is used to start "internal" daemons and intended 459c8b8baaSPeter Wemm * to be called from SYSINIT(). 469c8b8baaSPeter Wemm */ 479c8b8baaSPeter Wemm void 489c8b8baaSPeter Wemm kproc_start(udata) 499c8b8baaSPeter Wemm const void *udata; 509c8b8baaSPeter Wemm { 519c8b8baaSPeter Wemm const struct kproc_desc *kp = udata; 529c8b8baaSPeter Wemm int error; 539c8b8baaSPeter Wemm 549c8b8baaSPeter Wemm error = kthread_create((void (*)(void *))kp->func, NULL, 559c8b8baaSPeter Wemm kp->global_procpp, kp->arg0); 569c8b8baaSPeter Wemm if (error) 579c8b8baaSPeter Wemm panic("kproc_start: %s: error %d", kp->arg0, error); 589c8b8baaSPeter Wemm } 599c8b8baaSPeter Wemm 609c8b8baaSPeter Wemm /* 619c8b8baaSPeter Wemm * Create a kernel process/thread/whatever. It shares it's address space 629c8b8baaSPeter Wemm * with proc0 - ie: kernel only. 639c8b8baaSPeter Wemm */ 649c8b8baaSPeter Wemm int 659c8b8baaSPeter Wemm kthread_create(void (*func)(void *), void *arg, 669c8b8baaSPeter Wemm struct proc **newpp, const char *fmt, ...) 679c8b8baaSPeter Wemm { 689c8b8baaSPeter Wemm int error; 699c8b8baaSPeter Wemm va_list ap; 709c8b8baaSPeter Wemm struct proc *p2; 719c8b8baaSPeter Wemm 729c8b8baaSPeter Wemm error = fork1(&proc0, RFMEM | RFFDG | RFPROC, &p2); 739c8b8baaSPeter Wemm if (error) 749c8b8baaSPeter Wemm return error; 759c8b8baaSPeter Wemm 769c8b8baaSPeter Wemm /* save a global descriptor, if desired */ 779c8b8baaSPeter Wemm if (newpp != NULL) 789c8b8baaSPeter Wemm *newpp = p2; 799c8b8baaSPeter Wemm 809c8b8baaSPeter Wemm /* this is a non-swapped system process */ 819c8b8baaSPeter Wemm p2->p_flag |= P_INMEM | P_SYSTEM | P_NOCLDWAIT; 829c8b8baaSPeter Wemm PHOLD(p2); 839c8b8baaSPeter Wemm 849c8b8baaSPeter Wemm /* set up arg0 for 'ps', et al */ 859c8b8baaSPeter Wemm va_start(ap, fmt); 869c8b8baaSPeter Wemm vsnprintf(p2->p_comm, sizeof(p2->p_comm), fmt, ap); 879c8b8baaSPeter Wemm va_end(ap); 889c8b8baaSPeter Wemm 899c8b8baaSPeter Wemm /* call the processes' main()... */ 909c8b8baaSPeter Wemm cpu_set_fork_handler(p2, func, arg); 919c8b8baaSPeter Wemm 929c8b8baaSPeter Wemm return 0; 939c8b8baaSPeter Wemm } 949c8b8baaSPeter Wemm 959c8b8baaSPeter Wemm void 969c8b8baaSPeter Wemm kthread_exit(int ecode) 979c8b8baaSPeter Wemm { 989c8b8baaSPeter Wemm exit1(curproc, W_EXITCODE(ecode, 0)); 999c8b8baaSPeter Wemm } 1009c8b8baaSPeter Wemm 101