xref: /freebsd/sys/compat/linux/linux_common.c (revision 3460fab5fced39c7ea597cc7de0ebc3e4c88989a)
167d39748SDmitry Chagin /*-
267d39748SDmitry Chagin  * Copyright (c) 2014 Vassilis Laganakos
367d39748SDmitry Chagin  * All rights reserved.
467d39748SDmitry Chagin  *
567d39748SDmitry Chagin  * Redistribution and use in source and binary forms, with or without
667d39748SDmitry Chagin  * modification, are permitted provided that the following conditions
767d39748SDmitry Chagin  * are met:
867d39748SDmitry Chagin  * 1. Redistributions of source code must retain the above copyright
967d39748SDmitry Chagin  *    notice, this list of conditions and the following disclaimer.
1067d39748SDmitry Chagin  * 2. Redistributions in binary form must reproduce the above copyright
1167d39748SDmitry Chagin  *    notice, this list of conditions and the following disclaimer in the
1267d39748SDmitry Chagin  *    documentation and/or other materials provided with the distribution.
1367d39748SDmitry Chagin  *
1467d39748SDmitry Chagin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1567d39748SDmitry Chagin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1667d39748SDmitry Chagin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1767d39748SDmitry Chagin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1867d39748SDmitry Chagin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1967d39748SDmitry Chagin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2067d39748SDmitry Chagin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2167d39748SDmitry Chagin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2267d39748SDmitry Chagin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2367d39748SDmitry Chagin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2467d39748SDmitry Chagin  * SUCH DAMAGE.
2567d39748SDmitry Chagin  */
2667d39748SDmitry Chagin 
2767d39748SDmitry Chagin #include <sys/param.h>
28bc273677SDmitry Chagin #include <sys/exec.h>
29bc273677SDmitry Chagin #include <sys/imgact.h>
3067d39748SDmitry Chagin #include <sys/kernel.h>
31bc273677SDmitry Chagin #include <sys/malloc.h>
328fc08087STijl Coosemans #include <sys/sx.h>
3367d39748SDmitry Chagin 
34a161fba9SYuri Pankov #include <compat/linux/linux.h>
3567d39748SDmitry Chagin #include <compat/linux/linux_mib.h>
3667d39748SDmitry Chagin #include <compat/linux/linux_util.h>
3767d39748SDmitry Chagin 
3867d39748SDmitry Chagin SET_DECLARE(linux_device_handler_set, struct linux_device_handler);
3967d39748SDmitry Chagin 
408fc08087STijl Coosemans TAILQ_HEAD(, linux_ioctl_handler_element) linux_ioctl_handlers =
418fc08087STijl Coosemans     TAILQ_HEAD_INITIALIZER(linux_ioctl_handlers);
428fc08087STijl Coosemans struct sx linux_ioctl_sx;
438fc08087STijl Coosemans SX_SYSINIT(linux_ioctl, &linux_ioctl_sx, "Linux ioctl handlers");
448fc08087STijl Coosemans 
4567d39748SDmitry Chagin static int
linux_common_modevent(module_t mod,int type,void * data)4667d39748SDmitry Chagin linux_common_modevent(module_t mod, int type, void *data)
4767d39748SDmitry Chagin {
4867d39748SDmitry Chagin 	struct linux_device_handler **ldhp;
4967d39748SDmitry Chagin 
5067d39748SDmitry Chagin 	switch(type) {
5167d39748SDmitry Chagin 	case MOD_LOAD:
521a8577faSEdward Tomasz Napierala #ifdef INVARIANTS
531a8577faSEdward Tomasz Napierala 		linux_check_errtbl();
541a8577faSEdward Tomasz Napierala #endif
55044ab55eSEdward Tomasz Napierala 		linux_dev_shm_create();
5667d39748SDmitry Chagin 		linux_osd_jail_register();
5767d39748SDmitry Chagin 		SET_FOREACH(ldhp, linux_device_handler_set)
5867d39748SDmitry Chagin 			linux_device_register_handler(*ldhp);
59*7c40e2d5SAlexander V. Chernikov 		linux_netlink_register();
6067d39748SDmitry Chagin 		break;
6167d39748SDmitry Chagin 	case MOD_UNLOAD:
62044ab55eSEdward Tomasz Napierala 		linux_dev_shm_destroy();
6367d39748SDmitry Chagin 		linux_osd_jail_deregister();
6467d39748SDmitry Chagin 		SET_FOREACH(ldhp, linux_device_handler_set)
6567d39748SDmitry Chagin 			linux_device_unregister_handler(*ldhp);
66*7c40e2d5SAlexander V. Chernikov 		linux_netlink_deregister();
6767d39748SDmitry Chagin 		break;
6867d39748SDmitry Chagin 	default:
6967d39748SDmitry Chagin 		return (EOPNOTSUPP);
7067d39748SDmitry Chagin 	}
7167d39748SDmitry Chagin 	return (0);
7267d39748SDmitry Chagin }
7367d39748SDmitry Chagin 
7467d39748SDmitry Chagin static moduledata_t linux_common_mod = {
755184e2daSDmitry Chagin 	"linux_common",
7667d39748SDmitry Chagin 	linux_common_modevent,
7767d39748SDmitry Chagin 	0
7867d39748SDmitry Chagin };
7967d39748SDmitry Chagin 
805184e2daSDmitry Chagin DECLARE_MODULE(linux_common, linux_common_mod, SI_SUB_EXEC, SI_ORDER_ANY);
815184e2daSDmitry Chagin MODULE_VERSION(linux_common, 1);
82*7c40e2d5SAlexander V. Chernikov MODULE_DEPEND(linux_common, netlink, 1, 1, 1);
83