1183218Skaiw/*- 2183218Skaiw * Copyright (c) 2005 Paul Saab 3183218Skaiw * All rights reserved. 4183218Skaiw * 5183218Skaiw * Redistribution and use in source and binary forms, with or without 6183218Skaiw * modification, are permitted provided that the following conditions 7183218Skaiw * are met: 8183218Skaiw * 1. Redistributions of source code must retain the above copyright 9183218Skaiw * notice, this list of conditions and the following disclaimer. 10183218Skaiw * 2. Redistributions in binary form must reproduce the above copyright 11183218Skaiw * notice, this list of conditions and the following disclaimer in the 12183218Skaiw * documentation and/or other materials provided with the distribution. 13183218Skaiw * 14183218Skaiw * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15183218Skaiw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16183218Skaiw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17183218Skaiw * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18183218Skaiw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19183218Skaiw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20183218Skaiw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21183218Skaiw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22183218Skaiw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23183218Skaiw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24183218Skaiw * SUCH DAMAGE. 25183218Skaiw * 26183218Skaiw */ 27183218Skaiw 28183218Skaiw#include <sys/cdefs.h> 29183218Skaiw__FBSDID("$FreeBSD: releng/10.2/sys/dev/amr/amr_linux.c 280258 2015-03-19 13:37:36Z rwatson $"); 30183218Skaiw 31183218Skaiw#include <sys/param.h> 32183218Skaiw#include <sys/systm.h> 33183218Skaiw#include <sys/capsicum.h> 34183218Skaiw#include <sys/conf.h> 35183218Skaiw#include <sys/kernel.h> 36183218Skaiw#include <sys/module.h> 37183218Skaiw#include <sys/file.h> 38183218Skaiw#include <sys/proc.h> 39183218Skaiw 40183218Skaiw#if defined(__amd64__) /* Assume amd64 wants 32 bit Linux */ 41183218Skaiw#include <machine/../linux32/linux.h> 42183218Skaiw#include <machine/../linux32/linux32_proto.h> 43183218Skaiw#else 44183218Skaiw#include <machine/../linux/linux.h> 45183218Skaiw#include <machine/../linux/linux_proto.h> 46183218Skaiw#endif 47183218Skaiw#include <compat/linux/linux_ioctl.h> 48183218Skaiw 49183218Skaiw/* There are multiple ioctl number ranges that need to be handled */ 50183218Skaiw#define AMR_LINUX_IOCTL_MIN 0x6d00 51183218Skaiw#define AMR_LINUX_IOCTL_MAX 0x6d01 52183218Skaiw 53183218Skaiwstatic linux_ioctl_function_t amr_linux_ioctl; 54183218Skaiwstatic struct linux_ioctl_handler amr_linux_handler = {amr_linux_ioctl, 55183218Skaiw AMR_LINUX_IOCTL_MIN, 56183218Skaiw AMR_LINUX_IOCTL_MAX}; 57183218Skaiw 58183218SkaiwSYSINIT (amr_register, SI_SUB_KLD, SI_ORDER_MIDDLE, 59183218Skaiw linux_ioctl_register_handler, &amr_linux_handler); 60183218SkaiwSYSUNINIT(amr_unregister, SI_SUB_KLD, SI_ORDER_MIDDLE, 61183218Skaiw linux_ioctl_unregister_handler, &amr_linux_handler); 62183218Skaiw 63183218Skaiwstatic int 64183218Skaiwamr_linux_modevent(module_t mod, int cmd, void *data) 65183218Skaiw{ 66183218Skaiw return (0); 67183218Skaiw} 68183218Skaiw 69183218SkaiwDEV_MODULE(amr_linux, amr_linux_modevent, NULL); 70183218SkaiwMODULE_DEPEND(amr, linux, 1, 1, 1); 71183218Skaiw 72183218Skaiwstatic int 73183218Skaiwamr_linux_ioctl(struct thread *p, struct linux_ioctl_args *args) 74183218Skaiw{ 75183218Skaiw cap_rights_t rights; 76183218Skaiw struct file *fp; 77183218Skaiw int error; 78183218Skaiw 79183218Skaiw error = fget(p, args->fd, cap_rights_init(&rights, CAP_IOCTL), &fp); 80183218Skaiw if (error != 0) 81183218Skaiw return (error); 82183218Skaiw error = fo_ioctl(fp, args->cmd, (caddr_t)args->arg, p->td_ucred, p); 83183218Skaiw fdrop(fp, p); 84183218Skaiw return (error); 85183218Skaiw} 86183218Skaiw