xref: /openbsd-src/sys/kern/kern_xxx.c (revision d13be5d47e4149db2549a9828e244d59dbc43f15)
1 /*	$OpenBSD: kern_xxx.c,v 1.21 2011/07/11 15:40:47 guenther Exp $	*/
2 /*	$NetBSD: kern_xxx.c,v 1.32 1996/04/22 01:38:41 christos Exp $	*/
3 
4 /*
5  * Copyright (c) 1982, 1986, 1989, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  *	@(#)kern_xxx.c	8.2 (Berkeley) 11/14/93
33  */
34 
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/kernel.h>
38 #include <sys/proc.h>
39 #include <sys/reboot.h>
40 #include <uvm/uvm_extern.h>
41 #include <sys/sysctl.h>
42 #include <sys/mount.h>
43 #include <sys/syscallargs.h>
44 
45 #include <net/if.h>
46 
47 /* ARGSUSED */
48 int
49 sys_reboot(struct proc *p, void *v, register_t *retval)
50 {
51 	struct sys_reboot_args /* {
52 		syscallarg(int) opt;
53 	} */ *uap = v;
54 #ifdef MULTIPROCESSOR
55 	CPU_INFO_ITERATOR cii;
56 	struct cpu_info *ci;
57 #endif
58 	int error;
59 
60 	if ((error = suser(p, 0)) != 0)
61 		return (error);
62 
63 #ifdef MULTIPROCESSOR
64 	/*
65 	 * Make sure this thread only runs on the primary cpu.
66 	 */
67 	CPU_INFO_FOREACH(cii, ci) {
68 		if (CPU_IS_PRIMARY(ci)) {
69 			sched_peg_curproc(ci);
70 			break;
71 		}
72 	}
73 
74 	sched_stop_secondary_cpus();
75 #endif
76 
77 	boot(SCARG(uap, opt));
78 
79 	atomic_clearbits_int(&p->p_flag, P_CPUPEG);	/* XXX */
80 
81 	return (0);
82 }
83 
84 #if !defined(NO_PROPOLICE)
85 void __stack_smash_handler(char [], int __attribute__((unused)));
86 
87 void
88 __stack_smash_handler(char func[], int damaged)
89 {
90 	panic("smashed stack in %s", func);
91 }
92 #endif
93 
94 #ifdef SYSCALL_DEBUG
95 #define	SCDEBUG_CALLS		0x0001	/* show calls */
96 #define	SCDEBUG_RETURNS		0x0002	/* show returns */
97 #define	SCDEBUG_ALL		0x0004	/* even syscalls that are implemented */
98 #define	SCDEBUG_SHOWARGS	0x0008	/* show arguments to calls */
99 
100 int	scdebug = SCDEBUG_CALLS|SCDEBUG_RETURNS|SCDEBUG_SHOWARGS;
101 
102 void
103 scdebug_call(struct proc *p, register_t code, register_t args[])
104 {
105 	struct sysent *sy;
106 	struct emul *em;
107 	int i;
108 
109 	if (!(scdebug & SCDEBUG_CALLS))
110 		return;
111 
112 	em = p->p_emul;
113 	sy = &em->e_sysent[code];
114 	if (!(scdebug & SCDEBUG_ALL || code < 0 || code >= em->e_nsysent ||
115 	     sy->sy_call == sys_nosys))
116 		return;
117 
118 	printf("proc %d (%s): %s num ", p->p_pid, p->p_comm, em->e_name);
119 	if (code < 0 || code >= em->e_nsysent)
120 		printf("OUT OF RANGE (%d)", code);
121 	else {
122 		printf("%d call: %s", code, em->e_syscallnames[code]);
123 		if (scdebug & SCDEBUG_SHOWARGS) {
124 			printf("(");
125 			for (i = 0; i < sy->sy_argsize / sizeof(register_t);
126 			    i++)
127 				printf("%s0x%lx", i == 0 ? "" : ", ",
128 				    (long)args[i]);
129 			printf(")");
130 		}
131 	}
132 	printf("\n");
133 }
134 
135 void
136 scdebug_ret(struct proc *p, register_t code, int error, register_t retval[])
137 {
138 	struct sysent *sy;
139 	struct emul *em;
140 
141 	if (!(scdebug & SCDEBUG_RETURNS))
142 		return;
143 
144 	em = p->p_emul;
145 	sy = &em->e_sysent[code];
146 	if (!(scdebug & SCDEBUG_ALL || code < 0 || code >= em->e_nsysent ||
147 	    sy->sy_call == sys_nosys))
148 		return;
149 
150 	printf("proc %d (%s): %s num ", p->p_pid, p->p_comm, em->e_name);
151 	if (code < 0 || code >= em->e_nsysent)
152 		printf("OUT OF RANGE (%d)", code);
153 	else
154 		printf("%d ret: err = %d, rv = 0x%lx,0x%lx", code,
155 		    error, (long)retval[0], (long)retval[1]);
156 	printf("\n");
157 }
158 #endif /* SYSCALL_DEBUG */
159