Home | History | Annotate | Line # | Download | only in panic
panic.c revision 1.1.78.1
      1  1.1.78.1   thorpej /* $NetBSD: panic.c,v 1.1.78.1 2021/08/01 22:42:40 thorpej Exp $ */
      2       1.1  jmcneill 
      3       1.1  jmcneill /*
      4       1.1  jmcneill  * Copyright (c) 2011 Jared D. McNeill <jmcneill (at) invisible.ca>
      5       1.1  jmcneill  * All rights reserved.
      6       1.1  jmcneill  *
      7       1.1  jmcneill  * Redistribution and use in source and binary forms, with or without
      8       1.1  jmcneill  * modification, are permitted provided that the following conditions
      9       1.1  jmcneill  * are met:
     10       1.1  jmcneill  * 1. Redistributions of source code must retain the above copyright
     11       1.1  jmcneill  *    notice, this list of conditions and the following disclaimer.
     12       1.1  jmcneill  * 2. The name of the author may not be used to endorse or promote products
     13       1.1  jmcneill  *    derived from this software without specific prior written permission.
     14       1.1  jmcneill  *
     15       1.1  jmcneill  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16       1.1  jmcneill  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     17       1.1  jmcneill  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     18       1.1  jmcneill  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     19       1.1  jmcneill  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     20       1.1  jmcneill  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     21       1.1  jmcneill  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     22       1.1  jmcneill  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     23       1.1  jmcneill  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     24       1.1  jmcneill  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     25       1.1  jmcneill  * SUCH DAMAGE.
     26       1.1  jmcneill  */
     27       1.1  jmcneill 
     28       1.1  jmcneill #include <sys/cdefs.h>
     29  1.1.78.1   thorpej __KERNEL_RCSID(0, "$NetBSD: panic.c,v 1.1.78.1 2021/08/01 22:42:40 thorpej Exp $");
     30       1.1  jmcneill 
     31       1.1  jmcneill #include <sys/module.h>
     32       1.1  jmcneill 
     33       1.1  jmcneill MODULE(MODULE_CLASS_MISC, panic, NULL);
     34       1.1  jmcneill 
     35       1.1  jmcneill static void
     36       1.1  jmcneill panic_dopanic(void)
     37       1.1  jmcneill {
     38       1.1  jmcneill 	/* just call panic */
     39       1.1  jmcneill 	panic("oops");
     40       1.1  jmcneill }
     41       1.1  jmcneill 
     42       1.1  jmcneill static void
     43       1.1  jmcneill panic_donullptr(void)
     44       1.1  jmcneill {
     45       1.1  jmcneill 	/* null ptr dereference */
     46       1.1  jmcneill 	*(int *)NULL = 1;
     47       1.1  jmcneill }
     48       1.1  jmcneill 
     49       1.1  jmcneill static const struct {
     50       1.1  jmcneill 	const char *name;
     51       1.1  jmcneill 	void (*func)(void);
     52       1.1  jmcneill } panic_howto[] = {
     53       1.1  jmcneill 	{ "panic",	panic_dopanic },
     54       1.1  jmcneill 	{ "nullptr",	panic_donullptr },
     55       1.1  jmcneill };
     56       1.1  jmcneill 
     57       1.1  jmcneill static int
     58       1.1  jmcneill panic_modcmd(modcmd_t cmd, void *opaque)
     59       1.1  jmcneill {
     60       1.1  jmcneill 	if (cmd == MODULE_CMD_INIT) {
     61       1.1  jmcneill 		prop_dictionary_t props = opaque;
     62       1.1  jmcneill 		const char *how = NULL;
     63       1.1  jmcneill 		unsigned int i;
     64       1.1  jmcneill 
     65       1.1  jmcneill 		if (props)
     66  1.1.78.1   thorpej 			prop_dictionary_get_string(props, "how", &how);
     67       1.1  jmcneill 		if (how == NULL)
     68       1.1  jmcneill 			how = "panic";
     69       1.1  jmcneill 
     70       1.1  jmcneill 		for (i = 0; i < __arraycount(panic_howto); i++) {
     71       1.1  jmcneill 			if (strcmp(how, panic_howto[i].name) == 0) {
     72       1.1  jmcneill 				panic_howto[i].func();
     73       1.1  jmcneill 				break;
     74       1.1  jmcneill 			}
     75       1.1  jmcneill 		}
     76       1.1  jmcneill 		if (i == __arraycount(panic_howto))
     77       1.1  jmcneill 			printf("%s: no how '%s'\n", __func__, how);
     78       1.1  jmcneill 		else
     79       1.1  jmcneill 			printf("%s: how '%s' didn't panic?\n", __func__, how);
     80       1.1  jmcneill 
     81       1.1  jmcneill 		return EINVAL;
     82       1.1  jmcneill 	}
     83       1.1  jmcneill 
     84       1.1  jmcneill 	return ENOTTY;
     85       1.1  jmcneill }
     86