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