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