Annotation of src/sys/kern/init_main.c, Revision 1.151
1.151 ! thorpej 1: /* $NetBSD: init_main.c,v 1.150 1999/05/13 00:59:04 thorpej Exp $ */
1.61 mycroft 2:
3: /*
1.76 cgd 4: * Copyright (c) 1995 Christopher G. Demetriou. All rights reserved.
1.61 mycroft 5: * Copyright (c) 1982, 1986, 1989, 1991, 1992, 1993
6: * The Regents of the University of California. All rights reserved.
7: * (c) UNIX System Laboratories, Inc.
8: * All or some portions of this file are derived from material licensed
9: * to the University of California by American Telephone and Telegraph
10: * Co. or Unix System Laboratories, Inc. and are reproduced herein with
11: * the permission of UNIX System Laboratories, Inc.
12: *
13: * Redistribution and use in source and binary forms, with or without
14: * modification, are permitted provided that the following conditions
15: * are met:
16: * 1. Redistributions of source code must retain the above copyright
17: * notice, this list of conditions and the following disclaimer.
18: * 2. Redistributions in binary form must reproduce the above copyright
19: * notice, this list of conditions and the following disclaimer in the
20: * documentation and/or other materials provided with the distribution.
21: * 3. All advertising materials mentioning features or use of this software
22: * must display the following acknowledgement:
23: * This product includes software developed by the University of
24: * California, Berkeley and its contributors.
25: * 4. Neither the name of the University nor the names of its contributors
26: * may be used to endorse or promote products derived from this software
27: * without specific prior written permission.
28: *
29: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39: * SUCH DAMAGE.
40: *
1.118 fvdl 41: * @(#)init_main.c 8.16 (Berkeley) 5/14/95
1.61 mycroft 42: */
1.115 mrg 43:
1.117 thorpej 44: #include "fs_nfs.h"
1.123 thorpej 45: #include "opt_nfsserver.h"
1.134 tron 46: #include "opt_sysv.h"
1.61 mycroft 47:
1.106 explorer 48: #include "rnd.h"
49:
1.61 mycroft 50: #include <sys/param.h>
51: #include <sys/filedesc.h>
1.131 thorpej 52: #include <sys/file.h>
1.61 mycroft 53: #include <sys/errno.h>
54: #include <sys/exec.h>
55: #include <sys/kernel.h>
56: #include <sys/mount.h>
57: #include <sys/map.h>
58: #include <sys/proc.h>
1.136 thorpej 59: #include <sys/kthread.h>
1.61 mycroft 60: #include <sys/resourcevar.h>
61: #include <sys/signalvar.h>
62: #include <sys/systm.h>
63: #include <sys/vnode.h>
1.87 thorpej 64: #include <sys/tty.h>
1.61 mycroft 65: #include <sys/conf.h>
1.95 thorpej 66: #include <sys/disklabel.h>
1.61 mycroft 67: #include <sys/buf.h>
68: #include <sys/device.h>
1.128 thorpej 69: #include <sys/socketvar.h>
1.61 mycroft 70: #include <sys/protosw.h>
71: #include <sys/reboot.h>
72: #include <sys/user.h>
1.82 christos 73: #ifdef SYSVSHM
74: #include <sys/shm.h>
75: #endif
76: #ifdef SYSVSEM
77: #include <sys/sem.h>
78: #endif
79: #ifdef SYSVMSG
80: #include <sys/msg.h>
81: #endif
82: #include <sys/domain.h>
83: #include <sys/mbuf.h>
1.94 mouse 84: #include <sys/namei.h>
1.106 explorer 85: #if NRND > 0
1.103 explorer 86: #include <sys/rnd.h>
1.106 explorer 87: #endif
1.61 mycroft 88:
1.77 christos 89: #include <sys/syscall.h>
1.68 cgd 90: #include <sys/syscallargs.h>
91:
1.61 mycroft 92: #include <ufs/ufs/quota.h>
93:
94: #include <machine/cpu.h>
95:
96: #include <vm/vm.h>
1.81 christos 97: #include <vm/vm_pageout.h>
98:
1.114 mrg 99: #include <uvm/uvm.h>
100:
1.81 christos 101: #include <net/if.h>
102: #include <net/raw_cb.h>
1.61 mycroft 103:
1.107 thorpej 104: char copyright[] = "\
1.138 lukem 105: Copyright (c) 1996, 1997, 1998, 1999
1.112 thorpej 106: The NetBSD Foundation, Inc. All rights reserved.
1.107 thorpej 107: Copyright (c) 1982, 1986, 1989, 1991, 1993
108: The Regents of the University of California. All rights reserved.
109:
110: ";
1.61 mycroft 111:
112: /* Components of the first process -- never freed. */
113: struct session session0;
114: struct pgrp pgrp0;
115: struct proc proc0;
116: struct pcred cred0;
117: struct filedesc0 filedesc0;
1.148 thorpej 118: struct cwdinfo cwdi0;
1.61 mycroft 119: struct plimit limit0;
120: struct vmspace vmspace0;
1.149 thorpej 121: struct sigacts sigacts0;
1.133 pk 122: #ifndef curproc
1.61 mycroft 123: struct proc *curproc = &proc0;
1.133 pk 124: #endif
1.105 mycroft 125: struct proc *initproc;
1.61 mycroft 126:
127: int cmask = CMASK;
128: extern struct user *proc0paddr;
129:
130: struct vnode *rootvp, *swapdev_vp;
131: int boothowto;
132: struct timeval boottime;
133: struct timeval runtime;
134:
1.96 cgd 135: static void check_console __P((struct proc *p));
1.135 thorpej 136: static void start_init __P((void *));
137: static void start_pagedaemon __P((void *));
138: static void start_reaper __P((void *));
1.122 mycroft 139: void main __P((void));
1.76 cgd 140:
1.77 christos 141: extern char sigcode[], esigcode[];
142: #ifdef SYSCALL_DEBUG
143: extern char *syscallnames[];
144: #endif
145:
146: struct emul emul_netbsd = {
147: "netbsd",
148: NULL,
149: sendsig,
150: SYS_syscall,
151: SYS_MAXSYSCALL,
152: sysent,
153: #ifdef SYSCALL_DEBUG
154: syscallnames,
155: #else
156: NULL,
157: #endif
158: 0,
159: copyargs,
160: setregs,
161: sigcode,
162: esigcode,
163: };
164:
1.61 mycroft 165: /*
166: * System startup; initialize the world, create process 0, mount root
167: * filesystem, and fork to create init and pagedaemon. Most of the
168: * hard work is done in the lower-level initialization routines including
169: * startup(), which does memory initialization and autoconfiguration.
170: */
1.81 christos 171: void
1.121 mycroft 172: main()
1.61 mycroft 173: {
1.144 thorpej 174: struct proc *p;
1.111 thorpej 175: struct pdevinit *pdev;
176: int i, s, error;
1.61 mycroft 177: extern struct pdevinit pdevinit[];
178: extern void roundrobin __P((void *));
179: extern void schedcpu __P((void *));
1.80 thorpej 180: extern void disk_init __P((void));
1.95 thorpej 181: #if defined(NFSSERVER) || defined(NFS)
1.91 thorpej 182: extern void nfs_init __P((void));
183: #endif
1.61 mycroft 184:
185: /*
186: * Initialize the current process pointer (curproc) before
187: * any possible traps/probes to simplify trap processing.
188: */
189: p = &proc0;
190: curproc = p;
191: /*
192: * Attempt to find console and initialize
193: * in case of early panic or other messages.
194: */
195: consinit();
1.141 cjs 196: printf("%s", copyright);
1.61 mycroft 197:
1.114 mrg 198: uvm_init();
1.127 thorpej 199:
1.145 thorpej 200: /* Do machine-dependent initialization. */
201: cpu_startup();
202:
1.127 thorpej 203: /*
204: * Initialize mbuf's. Do this now because we might attempt to
205: * allocate mbufs or mbuf clusters during autoconfiguration.
206: */
207: mbinit();
1.128 thorpej 208:
209: /* Initialize sockets. */
210: soinit();
1.127 thorpej 211:
1.80 thorpej 212: disk_init(); /* must come before autoconfiguration */
1.85 mrg 213: tty_init(); /* initialise tty list */
1.106 explorer 214: #if NRND > 0
1.103 explorer 215: rnd_init();
1.106 explorer 216: #endif
1.83 cgd 217: config_init(); /* init autoconfiguration data structures */
1.145 thorpej 218: configure(); /* ...and configure the hardware */
1.61 mycroft 219:
220: /*
1.63 mycroft 221: * Initialize process and pgrp structures.
222: */
223: procinit();
224:
225: /*
1.61 mycroft 226: * Create process 0 (the swapper).
227: */
1.63 mycroft 228: LIST_INSERT_HEAD(&allproc, p, p_list);
1.61 mycroft 229: p->p_pgrp = &pgrp0;
1.63 mycroft 230: LIST_INSERT_HEAD(PGRPHASH(0), &pgrp0, pg_hash);
231: LIST_INIT(&pgrp0.pg_members);
232: LIST_INSERT_HEAD(&pgrp0.pg_members, p, p_pglist);
233:
1.61 mycroft 234: pgrp0.pg_session = &session0;
235: session0.s_count = 1;
1.116 thorpej 236: session0.s_sid = p->p_pid;
1.61 mycroft 237: session0.s_leader = p;
238:
1.136 thorpej 239: /*
240: * Set P_NOCLDWAIT so that kernel threads are reparented to
241: * init(8) when they exit. init(8) can easily wait them out
242: * for us.
243: */
244: p->p_flag = P_INMEM | P_SYSTEM | P_NOCLDWAIT;
1.61 mycroft 245: p->p_stat = SRUN;
246: p->p_nice = NZERO;
1.77 christos 247: p->p_emul = &emul_netbsd;
1.146 gwr 248: strncpy(p->p_comm, "swapper", MAXCOMLEN);
1.61 mycroft 249:
250: /* Create credentials. */
251: cred0.p_refcnt = 1;
252: p->p_cred = &cred0;
253: p->p_ucred = crget();
254: p->p_ucred->cr_ngroups = 1; /* group 0 */
255:
256: /* Create the file descriptor table. */
1.131 thorpej 257: finit();
1.79 mycroft 258: p->p_fd = &filedesc0.fd_fd;
1.109 thorpej 259: fdinit1(&filedesc0);
1.61 mycroft 260:
1.148 thorpej 261: /* Create the CWD info. */
262: p->p_cwdi = &cwdi0;
263: cwdi0.cwdi_cmask = cmask;
264: cwdi0.cwdi_refcnt = 1;
265:
1.61 mycroft 266: /* Create the limits structures. */
267: p->p_limit = &limit0;
268: for (i = 0; i < sizeof(p->p_rlimit)/sizeof(p->p_rlimit[0]); i++)
269: limit0.pl_rlimit[i].rlim_cur =
270: limit0.pl_rlimit[i].rlim_max = RLIM_INFINITY;
1.140 christos 271:
272: limit0.pl_rlimit[RLIMIT_NOFILE].rlim_max = maxfiles;
273: limit0.pl_rlimit[RLIMIT_NOFILE].rlim_cur =
274: maxfiles < NOFILE ? maxfiles : NOFILE;
275:
276: limit0.pl_rlimit[RLIMIT_NPROC].rlim_max = maxproc;
277: limit0.pl_rlimit[RLIMIT_NPROC].rlim_cur =
278: maxproc < MAXUPRC ? maxproc : MAXUPRC;
279:
1.114 mrg 280: i = ptoa(uvmexp.free);
1.61 mycroft 281: limit0.pl_rlimit[RLIMIT_RSS].rlim_max = i;
282: limit0.pl_rlimit[RLIMIT_MEMLOCK].rlim_max = i;
283: limit0.pl_rlimit[RLIMIT_MEMLOCK].rlim_cur = i / 3;
284: limit0.p_refcnt = 1;
285:
1.120 thorpej 286: /*
287: * Initialize proc0's vmspace, which uses the kernel pmap.
288: * All kernel processes (which never have user space mappings)
289: * share proc0's vmspace, and thus, the kernel pmap.
290: */
291: uvmspace_init(&vmspace0, pmap_kernel(), round_page(VM_MIN_ADDRESS),
292: trunc_page(VM_MAX_ADDRESS), TRUE);
293: p->p_vmspace = &vmspace0;
1.99 gwr 294:
1.61 mycroft 295: p->p_addr = proc0paddr; /* XXX */
296:
297: /*
1.149 thorpej 298: * We continue to place resource usage info in the
299: * user struct so they're pageable.
1.61 mycroft 300: */
301: p->p_stats = &p->p_addr->u_stats;
302:
303: /*
1.63 mycroft 304: * Charge root for one process.
1.61 mycroft 305: */
306: (void)chgproccnt(0, 1);
307:
308: rqinit();
309:
310: /* Configure virtual memory system, set vm rlimits. */
1.114 mrg 311: uvm_init_limits(p);
1.61 mycroft 312:
313: /* Initialize the file systems. */
1.95 thorpej 314: #if defined(NFSSERVER) || defined(NFS)
1.91 thorpej 315: nfs_init(); /* initialize server/shared data */
316: #endif
1.61 mycroft 317: vfsinit();
318:
319: /* Start real time and statistics clocks. */
320: initclocks();
321:
322: #ifdef SYSVSHM
323: /* Initialize System V style shared memory. */
324: shminit();
325: #endif
326:
327: #ifdef SYSVSEM
328: /* Initialize System V style semaphores. */
329: seminit();
330: #endif
331:
332: #ifdef SYSVMSG
333: /* Initialize System V style message queues. */
334: msginit();
335: #endif
336:
337: /* Attach pseudo-devices. */
338: for (pdev = pdevinit; pdev->pdev_attach != NULL; pdev++)
339: (*pdev->pdev_attach)(pdev->pdev_count);
340:
341: /*
342: * Initialize protocols. Block reception of incoming packets
343: * until everything is ready.
344: */
345: s = splimp();
346: ifinit();
347: domaininit();
348: splx(s);
349:
350: #ifdef GPROF
351: /* Initialize kernel profiling. */
352: kmstartup();
353: #endif
354:
355: /* Kick off timeout driven events by calling first time. */
356: roundrobin(NULL);
357: schedcpu(NULL);
1.98 gwr 358:
1.101 thorpej 359: /* Determine the root and dump devices. */
1.98 gwr 360: cpu_rootconf();
1.101 thorpej 361: cpu_dumpconf();
1.61 mycroft 362:
363: /* Mount the root file system. */
1.95 thorpej 364: do {
365: domountroothook();
366: if ((error = vfs_mountroot())) {
1.97 thorpej 367: printf("cannot mount root, error = %d\n", error);
1.95 thorpej 368: boothowto |= RB_ASKNAME;
369: setroot(root_device,
370: (rootdev != NODEV) ? DISKPART(rootdev) : 0, NULL);
371: }
372: } while (error != 0);
373: mountroothook_destroy();
374:
1.74 mycroft 375: mountlist.cqh_first->mnt_flag |= MNT_ROOTFS;
376: mountlist.cqh_first->mnt_op->vfs_refcount++;
1.61 mycroft 377:
1.111 thorpej 378: /*
379: * Get the vnode for '/'. Set filedesc0.fd_fd.fd_cdir to
380: * reference it.
381: */
1.74 mycroft 382: if (VFS_ROOT(mountlist.cqh_first, &rootvnode))
1.61 mycroft 383: panic("cannot find root vnode");
1.148 thorpej 384: cwdi0.cwdi_cdir = rootvnode;
385: VREF(cwdi0.cwdi_cdir);
1.118 fvdl 386: VOP_UNLOCK(rootvnode, 0);
1.148 thorpej 387: cwdi0.cwdi_rdir = NULL;
1.114 mrg 388: uvm_swap_init();
1.61 mycroft 389:
390: /*
391: * Now can look at time, having had a chance to verify the time
392: * from the file system. Reset p->p_rtime as it may have been
393: * munched in mi_switch() after the time got set.
394: */
395: p->p_stats->p_start = runtime = mono_time = boottime = time;
396: p->p_rtime.tv_sec = p->p_rtime.tv_usec = 0;
397:
1.149 thorpej 398: /*
399: * Initialize signal-related data structures, and signal state
400: * for proc0.
401: */
402: signal_init();
403: p->p_sigacts = &sigacts0;
1.61 mycroft 404: siginit(p);
405:
406: /* Create process 1 (init(8)). */
1.151 ! thorpej 407: if (fork1(p, 0, SIGCHLD, NULL, 0, NULL, &initproc))
1.61 mycroft 408: panic("fork init");
1.144 thorpej 409: cpu_set_kpc(initproc, start_init, initproc);
1.61 mycroft 410:
1.135 thorpej 411: /* Create process 2, the pageout daemon kernel thread. */
1.136 thorpej 412: if (kthread_create(start_pagedaemon, NULL, NULL, "pagedaemon"))
1.135 thorpej 413: panic("fork pagedaemon");
1.61 mycroft 414:
1.135 thorpej 415: /* Create process 3, the process reaper kernel thread. */
1.136 thorpej 416: if (kthread_create(start_reaper, NULL, NULL, "reaper"))
1.132 thorpej 417: panic("fork reaper");
1.137 thorpej 418:
419: /* Create any other deferred kernel threads. */
420: kthread_run_deferred_queue();
1.132 thorpej 421:
1.61 mycroft 422: /* The scheduler is an infinite loop. */
1.114 mrg 423: uvm_scheduler();
1.61 mycroft 424: /* NOTREACHED */
425: }
426:
1.93 mouse 427: static void
428: check_console(p)
1.96 cgd 429: struct proc *p;
1.93 mouse 430: {
431: struct nameidata nd;
432: int error;
433:
434: NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, "/dev/console", p);
435: error = namei(&nd);
1.96 cgd 436: if (error == 0)
437: vrele(nd.ni_vp);
438: else if (error == ENOENT)
439: printf("warning: no /dev/console\n");
1.93 mouse 440: else
1.96 cgd 441: printf("warning: lookup /dev/console: error %d\n", error);
1.93 mouse 442: }
443:
1.61 mycroft 444: /*
445: * List of paths to try when searching for "init".
446: */
447: static char *initpaths[] = {
448: "/sbin/init",
449: "/sbin/oinit",
450: "/sbin/init.bak",
451: NULL,
452: };
453:
454: /*
455: * Start the initial user process; try exec'ing each pathname in "initpaths".
456: * The program is invoked with one argument containing the boot flags.
457: */
458: static void
1.135 thorpej 459: start_init(arg)
460: void *arg;
1.61 mycroft 461: {
1.135 thorpej 462: struct proc *p = arg;
1.130 eeh 463: vaddr_t addr;
1.78 mycroft 464: struct sys_execve_args /* {
1.108 mycroft 465: syscallarg(const char *) path;
1.92 cgd 466: syscallarg(char * const *) argp;
467: syscallarg(char * const *) envp;
1.68 cgd 468: } */ args;
469: int options, i, error;
470: register_t retval[2];
1.66 mycroft 471: char flags[4], *flagsp;
1.142 mycroft 472: char **pathp, *path, *slash, *ucp, **uap, *arg0, *arg1 = NULL;
1.61 mycroft 473:
1.76 cgd 474: /*
475: * Now in process 1.
476: */
1.146 gwr 477: strncpy(p->p_comm, "init", MAXCOMLEN);
1.93 mouse 478:
479: /*
480: * This is not the right way to do this. We really should
481: * hand-craft a descriptor onto /dev/console to hand to init,
482: * but that's a _lot_ more work, and the benefit from this easy
483: * hack makes up for the "good is the enemy of the best" effect.
484: */
485: check_console(p);
1.61 mycroft 486:
487: /*
488: * Need just enough stack to hold the faked-up "execve()" arguments.
489: */
490: addr = USRSTACK - PAGE_SIZE;
1.114 mrg 491: if (uvm_map(&p->p_vmspace->vm_map, &addr, PAGE_SIZE,
492: NULL, UVM_UNKNOWN_OFFSET,
493: UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL, UVM_INH_COPY,
494: UVM_ADV_NORMAL,
495: UVM_FLAG_FIXED|UVM_FLAG_OVERLAY|UVM_FLAG_COPYONW))
496: != KERN_SUCCESS)
497: panic("init: couldn't allocate argument space");
1.61 mycroft 498: p->p_vmspace->vm_maxsaddr = (caddr_t)addr;
499:
500: for (pathp = &initpaths[0]; (path = *pathp) != NULL; pathp++) {
1.64 mycroft 501: ucp = (char *)(addr + PAGE_SIZE);
502:
1.61 mycroft 503: /*
1.64 mycroft 504: * Construct the boot flag argument.
1.61 mycroft 505: */
1.66 mycroft 506: flagsp = flags;
507: *flagsp++ = '-';
1.61 mycroft 508: options = 0;
1.66 mycroft 509:
1.61 mycroft 510: if (boothowto & RB_SINGLE) {
1.64 mycroft 511: *flagsp++ = 's';
1.61 mycroft 512: options = 1;
513: }
514: #ifdef notyet
515: if (boothowto & RB_FASTBOOT) {
1.64 mycroft 516: *flagsp++ = 'f';
1.61 mycroft 517: options = 1;
518: }
519: #endif
1.64 mycroft 520:
521: /*
522: * Move out the flags (arg 1), if necessary.
523: */
524: if (options != 0) {
525: *flagsp++ = '\0';
526: i = flagsp - flags;
527: #ifdef DEBUG
1.90 christos 528: printf("init: copying out flags `%s' %d\n", flags, i);
1.64 mycroft 529: #endif
530: (void)copyout((caddr_t)flags, (caddr_t)(ucp -= i), i);
531: arg1 = ucp;
532: }
1.61 mycroft 533:
534: /*
535: * Move out the file name (also arg 0).
536: */
1.64 mycroft 537: i = strlen(path) + 1;
538: #ifdef DEBUG
1.90 christos 539: printf("init: copying out path `%s' %d\n", path, i);
1.64 mycroft 540: #endif
541: (void)copyout((caddr_t)path, (caddr_t)(ucp -= i), i);
1.61 mycroft 542: arg0 = ucp;
543:
544: /*
545: * Move out the arg pointers.
546: */
1.73 cgd 547: uap = (char **)((long)ucp & ~ALIGNBYTES);
1.61 mycroft 548: (void)suword((caddr_t)--uap, 0); /* terminator */
1.64 mycroft 549: if (options != 0)
550: (void)suword((caddr_t)--uap, (long)arg1);
1.142 mycroft 551: slash = strrchr(path, '/');
552: if (slash)
553: (void)suword((caddr_t)--uap,
554: (long)arg0 + (slash + 1 - path));
555: else
556: (void)suword((caddr_t)--uap, (long)arg0);
1.61 mycroft 557:
558: /*
559: * Point at the arguments.
560: */
1.68 cgd 561: SCARG(&args, path) = arg0;
562: SCARG(&args, argp) = uap;
563: SCARG(&args, envp) = NULL;
1.61 mycroft 564:
565: /*
566: * Now try to exec the program. If can't for any reason
567: * other than it doesn't exist, complain.
568: */
1.102 mycroft 569: error = sys_execve(p, &args, retval);
570: if (error == 0 || error == EJUSTRETURN)
1.61 mycroft 571: return;
572: if (error != ENOENT)
1.90 christos 573: printf("exec %s: error %d\n", path, error);
1.61 mycroft 574: }
1.90 christos 575: printf("init: not found\n");
1.61 mycroft 576: panic("no init");
1.76 cgd 577: }
578:
1.135 thorpej 579: /* ARGSUSED */
1.76 cgd 580: static void
1.135 thorpej 581: start_pagedaemon(arg)
582: void *arg;
1.76 cgd 583: {
584:
1.114 mrg 585: uvm_pageout();
1.132 thorpej 586: /* NOTREACHED */
587: }
588:
1.135 thorpej 589: /* ARGSUSED */
1.132 thorpej 590: static void
1.135 thorpej 591: start_reaper(arg)
592: void *arg;
1.132 thorpej 593: {
594:
595: reaper();
1.76 cgd 596: /* NOTREACHED */
1.61 mycroft 597: }
CVSweb <webmaster@jp.NetBSD.org>