Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Jan 1999 13:10:01 -0800 (PST)
From:      Assar Westerlund <assar@sics.se>
To:        freebsd-bugs@FreeBSD.ORG
Subject:   Re: kern/9359: implement support for adding syscalls in KLD  modules
Message-ID:  <199901072110.NAA17484@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/9359; it has been noted by GNATS.

From: Assar Westerlund <assar@sics.se>
To: Doug Rabson <dfr@nlsystems.com>
Cc: FreeBSD-gnats-submit@freebsd.org
Subject: Re: kern/9359: implement support for adding syscalls in KLD  modules
Date: 07 Jan 1999 22:08:09 +0100

 Doug Rabson <dfr@nlsystems.com> writes:
 > This looks good on first reading.  Could you update the syscall kld
 > example in share/examples/kld to use your new mechanism.
 
 Sure, or rather, I added a new one in share/examples/kld/syscall and
 removed the misc one.  I also made a little modifications to my
 previous patches to be able to retrieve the allocated syscall number.
 
 I think some more general way of communicating the results of
 dynamically allocating device major numbers and system calls number to
 user-land is needed.  I'm not sure how it should look like, but the
 `-p' option to modload was at least a beginning.
 
 /assar
 
 ----------------------------------------------------------------------
 Index: share/examples/kld/Makefile
 ===================================================================
 RCS file: /src/fbsd-repository/src/share/examples/kld/Makefile,v
 retrieving revision 1.1
 diff -u -w -r1.1 Makefile
 --- Makefile	1998/12/11 10:44:30	1.1
 +++ Makefile	1999/01/07 19:33:33
 @@ -65,6 +65,6 @@
  # SUCH DAMAGE.
  #
  
 -SUBDIR=	cdev misc
 +SUBDIR=	cdev syscall
  
  .include <bsd.subdir.mk>
 --- /dev/null	Thu Jan  7 21:47:47 1999
 +++ share/examples/kld/syscall/Makefile	Thu Jan  7 20:34:25 1999
 @@ -0,0 +1,9 @@
 +# Makefile for sample syscall module
 +
 +SUBDIR=	module test
 +
 +load: _SUBDIRUSE
 +
 +unload: _SUBDIRUSE
 +
 +.include <bsd.subdir.mk>
 --- /dev/null	Thu Jan  7 21:47:47 1999
 +++ share/examples/kld/syscall/module/Makefile	Thu Jan  7 21:49:41 1999
 @@ -0,0 +1,17 @@
 +# Makefile for building the sample syscall module
 +
 +SRCS	= syscall.c
 +KMOD	= syscall
 +KO	= ${KMOD}.ko
 +KLDMOD	= t
 +
 +KLDLOAD		= /sbin/kldload
 +KLDUNLOAD	= /sbin/kldunload
 +
 +load: ${KO}
 +	${KLDLOAD} -v ./${KO}
 +
 +unload: ${KO}
 +	${KLDUNLOAD} -v -n ${KO}
 +
 +.include <bsd.kmod.mk>
 --- /dev/null	Thu Jan  7 21:47:47 1999
 +++ share/examples/kld/syscall/module/syscall.c	Thu Jan  7 21:51:07 1999
 @@ -0,0 +1,86 @@
 +/*-
 + * Copyright (c) 1999 Assar Westerlund
 + * All rights reserved.
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions
 + * are met:
 + * 1. Redistributions of source code must retain the above copyright
 + *    notice, this list of conditions and the following disclaimer.
 + * 2. Redistributions in binary form must reproduce the above copyright
 + *    notice, this list of conditions and the following disclaimer in the
 + *    documentation and/or other materials provided with the distribution.
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 + * SUCH DAMAGE.
 + *
 + *     $Id$
 + */
 +
 +#include <sys/types.h>
 +#include <sys/param.h>
 +#include <sys/proc.h>
 +#include <sys/module.h>
 +#include <sys/sysent.h>
 +#include <sys/kernel.h>
 +#include <sys/systm.h>
 +
 +/*
 + * The function for implementing the syscall.
 + */
 +
 +static int
 +hello (struct proc *p, void *arg)
 +{
 +	printf ("hello kernel\n");
 +	return 0;
 +}
 +
 +/*
 + * The `sysent' for the new syscall
 + */
 +
 +static struct sysent hello_sysent = {
 +	0,			/* sy_narg */
 +	hello			/* sy_call */
 +};
 +
 +/*
 + * The offset in sysent where the syscall is allocated.
 + */
 +
 +static int offset = NO_SYSCALL;
 +
 +/*
 + * The function called at load/unload.
 + */
 +
 +static int
 +load (struct module *module, int cmd, void *arg)
 +{
 +	int error = 0;
 +
 +	switch (cmd) {
 +	case MOD_LOAD :
 +		printf ("syscall loaded at %d\n", offset);
 +		break;
 +	case MOD_UNLOAD :
 +		printf ("syscall unloaded from %d\n", offset);
 +		break;
 +	default :
 +		error = EINVAL;
 +		break;
 +	}
 +	return error;
 +}
 +
 +SYSCALL_MODULE(syscall, &offset, &hello_sysent, load, NULL);
 --- /dev/null	Thu Jan  7 21:47:47 1999
 +++ share/examples/kld/syscall/test/call.c	Thu Jan  7 21:58:01 1999
 @@ -0,0 +1,53 @@
 +/*-
 + * Copyright (c) 1999 Assar Westerlund
 + * All rights reserved.
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions
 + * are met:
 + * 1. Redistributions of source code must retain the above copyright
 + *    notice, this list of conditions and the following disclaimer.
 + * 2. Redistributions in binary form must reproduce the above copyright
 + *    notice, this list of conditions and the following disclaimer in the
 + *    documentation and/or other materials provided with the distribution.
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 + * SUCH DAMAGE.
 + *
 + *     $Id$
 + */
 +
 +#include <stdio.h>
 +#include <sys/syscall.h>
 +
 +static void usage (void);
 +
 +static void
 +usage (void)
 +{
 +	fprintf (stderr, "call syscall-number\n");
 +	exit (1);
 +}
 +
 +int
 +main(int argc, char **argv)
 +{
 +	char *endptr;
 +	int syscall_num;
 +
 +	if (argc != 2)
 +		usage ();
 +	syscall_num = strtol (argv[1], &endptr, 0);
 +	if (syscall_num == 0 && argv[1] == endptr)
 +		errx (1, "Bad number `%s'", argv[1]);
 +	return syscall (syscall_num);
 +}
 --- /dev/null	Thu Jan  7 21:47:47 1999
 +++ share/examples/kld/syscall/test/Makefile	Thu Jan  7 21:57:42 1999
 @@ -0,0 +1,6 @@
 +# Makefile for simple caller of syscall
 +
 +PROG  = call
 +NOMAN = noman
 +
 +.include <bsd.prog.mk>
 Index: sys/sys/sysent.h
 ===================================================================
 RCS file: /src/fbsd-repository/src/sys/sys/sysent.h,v
 retrieving revision 1.19
 diff -u -w -u -w -r1.19 sysent.h
 --- sysent.h	1998/09/14 05:36:51	1.19
 +++ sysent.h	1999/01/07 20:37:28
 @@ -76,6 +76,36 @@
  #ifdef KERNEL
  extern struct sysentvec aout_sysvec;
  extern struct sysent sysent[];
 -#endif
 +
 +#define NO_SYSCALL (-1)
 +
 +struct module;
 +
 +struct syscall_module_data {
 +       int     (*chainevh)(struct module *, int, void *); /* next handler */
 +       void    *chainarg;      /* arg for next event handler */
 +       int     *offset;         /* offset into sysent */
 +       struct  sysent *new_sysent; /* new sysent */
 +       struct  sysent old_sysent; /* old sysent */
 +};
 +
 +#define SYSCALL_MODULE(name, offset, new_sysent, evh, arg)     \
 +static struct syscall_module_data name##_syscall_mod = {       \
 +       evh, arg, offset, new_sysent                            \
 +};                                                             \
 +                                                               \
 +static moduledata_t name##_mod = {                             \
 +       #name,                                                  \
 +       syscall_module_handler,                                 \
 +       &name##_syscall_mod                                     \
 +};                                                             \
 +DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE)
 +
 +int    syscall_register __P((int *offset, struct sysent *new_sysent,
 +                             struct sysent *old_sysent));
 +int    syscall_deregister __P((int *offset, struct sysent *old_sysent));
 +int    syscall_module_handler __P((struct module *mod, int what, void *arg));
 +
 +#endif /* KERNEL */
  
  #endif /* !_SYS_SYSENT_H_ */
 Index: sys/conf/files
 ===================================================================
 RCS file: /src/fbsd-repository/src/sys/conf/files,v
 retrieving revision 1.185
 diff -u -w -u -w -r1.185 files
 --- files	1998/12/28 16:31:26	1.185
 +++ files	1999/01/07 19:39:39
 @@ -289,6 +289,7 @@
  kern/kern_sig.c		standard
  kern/kern_subr.c	standard
  kern/kern_synch.c	standard
 +kern/kern_syscalls.c	standard
  kern/kern_sysctl.c	standard
  kern/kern_time.c	standard
  kern/kern_timeout.c	standard
 --- /dev/null	Thu Jan  7 21:47:47 1999
 +++ sys/kern/kern_syscalls.c	Thu Jan  7 21:37:53 1999
 @@ -0,0 +1,94 @@
 +/*-
 + * Copyright (c) 1999 Assar Westerlund
 + * All rights reserved.
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions
 + * are met:
 + * 1. Redistributions of source code must retain the above copyright
 + *    notice, this list of conditions and the following disclaimer.
 + * 2. Redistributions in binary form must reproduce the above copyright
 + *    notice, this list of conditions and the following disclaimer in the
 + *    documentation and/or other materials provided with the distribution.
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 + * SUCH DAMAGE.
 + *
 + *     $Id: kern_syscalls.c,v 1.1 1999/01/03 06:00:55 root Exp root $
 + */
 +
 +#include <sys/param.h>
 +#include <sys/kernel.h>
 +#include <sys/systm.h>
 +#include <sys/malloc.h>
 +#include <sys/sysproto.h>
 +#include <sys/sysent.h>
 +#include <sys/syscall.h>
 +#include <sys/module.h>
 +#include <sys/linker.h>
 +#include <sys/proc.h>
 +
 +int
 +syscall_register(int *offset, struct sysent *new_sysent,
 +		 struct sysent *old_sysent)
 +{
 +       if (*offset == NO_SYSCALL) {
 +               int i;
 +
 +               for (i = 1; i < SYS_MAXSYSCALL; ++i)
 +                       if (sysent[i].sy_call == (sy_call_t *)lkmnosys)
 +                               break;
 +               if (i == SYS_MAXSYSCALL)
 +                       return ENFILE;
 +               *offset = i;
 +       } else if (*offset < 0 || *offset >= SYS_MAXSYSCALL)
 +               return EINVAL;
 +       else if (sysent[*offset].sy_call != (sy_call_t *)lkmnosys)
 +               return EEXIST;
 +
 +       *old_sysent = sysent[*offset];
 +       sysent[*offset] = *new_sysent;
 +       return 0;
 +}
 +
 +int
 +syscall_deregister(int *offset, struct sysent *old_sysent)
 +{
 +       if (*offset)
 +               sysent[*offset] = *old_sysent;
 +       return 0;
 +}
 +
 +int
 +syscall_module_handler(struct module *mod, int what, void *arg)
 +{
 +       struct syscall_module_data *data = (struct syscall_module_data*)arg;
 +       int error;
 +
 +       switch (what) {
 +       case MOD_LOAD :
 +               error = syscall_register(data->offset, data->new_sysent,
 +                                        &data->old_sysent);
 +               if (error)
 +                       return error;
 +               break;
 +       case MOD_UNLOAD :
 +               error = syscall_deregister(data->offset, &data->old_sysent);
 +               if (error)
 +                       return error;
 +               break;
 +       }
 +       if (data->chainevh)
 +               return data->chainevh(mod, what, data->chainarg);
 +       else
 +               return 0;
 +}

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199901072110.NAA17484>