From root@mulet.e.kth.se  Wed Jan  6 21:21:58 1999
Received: from mulet.e.kth.se (mulet.e.kth.se [130.237.43.20])
          by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id VAA05267
          for <FreeBSD-gnats-submit@freebsd.org>; Wed, 6 Jan 1999 21:21:57 -0800 (PST)
          (envelope-from root@mulet.e.kth.se)
Received: (from root@localhost)
	by mulet.e.kth.se (8.9.1/8.9.1) id FAA03912;
	Thu, 7 Jan 1999 05:21:22 GMT
	(envelope-from root)
Message-Id: <199901070521.FAA03912@mulet.e.kth.se>
Date: Thu, 7 Jan 1999 05:21:22 GMT
From: assar@sics.se
To: FreeBSD-gnats-submit@freebsd.org
Cc: assar@sics.se
Subject: implement support for adding syscalls in KLD modules
X-Send-Pr-Version: 3.2

>Number:         9359
>Category:       kern
>Synopsis:       implement support for adding syscalls in KLD modules
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jan  6 21:30:01 PST 1999
>Closed-Date:    Sat Jan 9 08:55:50 PST 1999
>Last-Modified:  Sat Jan  9 08:56:11 PST 1999
>Originator:     Assar Westerlund
>Release:        FreeBSD 3.0-CURRENT i386
>Organization:
none
>Environment:

>Description:

KLD modules support loading of filesystems and devices but not of
system calls.  Having this is quite practical.  Otherwise a KLD module
does have to include the code itself for patch the sysent-table (the
code in syscall_register).  Having that code once makes it more
transparent as well.

>How-To-Repeat:

>Fix:
	
I added the macros to sysent.h because it seemed to appropriate place.
I didn't find any appropriate place for the functions so I created a
new file kern_syscalls.c, but they could of course be placed somewhere
else.

--- sys/sysent.h	1999/01/03 05:23:22	1.1
+++ sys/sysent.h	1999/01/03 07:11:50
@@ -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_ */
--- conf/files	1999/01/03 06:00:36	1.1
+++ conf/files	1999/01/03 06:01:21
@@ -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 02:05:28 1999
+++ kern/kern_syscalls.c	Sun Jan  3 06:59:07 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;
+}
>Release-Note:
>Audit-Trail:

From: Doug Rabson <dfr@nlsystems.com>
To: assar@sics.se
Cc: FreeBSD-gnats-submit@freebsd.org
Subject: Re: kern/9359: implement support for adding syscalls in KLD
 modules
Date: Thu, 7 Jan 1999 14:17:13 +0000 (GMT)

 This looks good on first reading.  Could you update the syscall kld
 example in share/examples/kld to use your new mechanism.
 
 --
 Doug Rabson				Mail:  dfr@nlsystems.com
 Nonlinear Systems Ltd.			Phone: +44 181 442 9037
 
 

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;
 +}

From: Doug Rabson <dfr@nlsystems.com>
To: Assar Westerlund <assar@sics.se>
Cc: FreeBSD-gnats-submit@freebsd.org
Subject: Re: kern/9359: implement support for adding syscalls in KLD 
 modules
Date: Fri, 8 Jan 1999 10:43:21 +0000 (GMT)

 On 7 Jan 1999, Assar Westerlund wrote:
 
 > 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.
 
 Thanks for this - I'll try and get it committed in the next day or two.  I
 thought about the syscall number problem too and my best idea was to
 extend the struct module_stat with a type specific field which the syscall
 module handler could use to report the syscall index.  I've written myself
 a note to work on this (it shouldn't be hard).
 
 --
 Doug Rabson				Mail:  dfr@nlsystems.com
 Nonlinear Systems Ltd.			Phone: +44 181 442 9037
 
 

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: 08 Jan 1999 12:02:16 +0100

 Doug Rabson <dfr@nlsystems.com> writes:
 > Thanks for this - I'll try and get it committed in the next day or two.
 
 Great.
 
 > I thought about the syscall number problem too and my best idea was
 > to extend the struct module_stat with a type specific field which
 > the syscall module handler could use to report the syscall index.
 > I've written myself a note to work on this (it shouldn't be hard).
 
 This would actually make even more sense for device drivers.
 
 As to system calls, what would you think about adding the name to
 `struct sysent' and then export some interface (sysctl?) for mapping
 between names and numbers to userland?  (This is not totally unrelated
 to what Solaris does with /etc/name_to_sysnum.)
 
 /assar

From: Doug Rabson <dfr@nlsystems.com>
To: Assar Westerlund <assar@sics.se>
Cc: FreeBSD-gnats-submit@freebsd.org
Subject: Re: kern/9359: implement support for adding syscalls in KLD  
 modules
Date: Fri, 8 Jan 1999 15:35:43 +0000 (GMT)

 On 8 Jan 1999, Assar Westerlund wrote:
 
 > Doug Rabson <dfr@nlsystems.com> writes:
 > > Thanks for this - I'll try and get it committed in the next day or two.
 > 
 > Great.
 > 
 > > I thought about the syscall number problem too and my best idea was
 > > to extend the struct module_stat with a type specific field which
 > > the syscall module handler could use to report the syscall index.
 > > I've written myself a note to work on this (it shouldn't be hard).
 > 
 > This would actually make even more sense for device drivers.
 > 
 > As to system calls, what would you think about adding the name to
 > `struct sysent' and then export some interface (sysctl?) for mapping
 > between names and numbers to userland?  (This is not totally unrelated
 > to what Solaris does with /etc/name_to_sysnum.)
 
 I'm not sure about that - the extra text in the kernel address space would
 be pretty expensive for little return.  I was thinking of a mechanism that
 a program could use like this:
 
 
 	struct module_stat ms;
 	ms.version = sizeof(ms);
 	modstat(modfind("mysyscall"), &ms);
 	syscall(ms.u.intval, ...);
 
 --
 Doug Rabson				Mail:  dfr@nlsystems.com
 Nonlinear Systems Ltd.			Phone: +44 181 442 9037
 
 

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: 08 Jan 1999 17:00:07 +0100

 Doug Rabson <dfr@nlsystems.com> writes:
 > > > I thought about the syscall number problem too and my best idea was
 > > > to extend the struct module_stat with a type specific field which
 > > > the syscall module handler could use to report the syscall index.
 > > > I've written myself a note to work on this (it shouldn't be hard).
 
 --- snip ---
 
 > 	struct module_stat ms;
 > 	ms.version = sizeof(ms);
 > 	modstat(modfind("mysyscall"), &ms);
 > 	syscall(ms.u.intval, ...);
 
 ok.
 
 Add adding support for `-p' in kldload with something that walkes the
 list for the newly added kld_file_stat with `kldfirstmod' and
 `modfnext' and calls a script with a list of the indexes and calling
 the script with these?
 
 /assar

From: Doug Rabson <dfr@nlsystems.com>
To: Assar Westerlund <assar@sics.se>
Cc: FreeBSD-gnats-submit@freebsd.org
Subject: Re: kern/9359: implement support for adding syscalls in KLD   
 modules
Date: Fri, 8 Jan 1999 22:55:47 +0000 (GMT)

 On 8 Jan 1999, Assar Westerlund wrote:
 
 > Doug Rabson <dfr@nlsystems.com> writes:
 > > > > I thought about the syscall number problem too and my best idea was
 > > > > to extend the struct module_stat with a type specific field which
 > > > > the syscall module handler could use to report the syscall index.
 > > > > I've written myself a note to work on this (it shouldn't be hard).
 > 
 > --- snip ---
 > 
 > > 	struct module_stat ms;
 > > 	ms.version = sizeof(ms);
 > > 	modstat(modfind("mysyscall"), &ms);
 > > 	syscall(ms.u.intval, ...);
 > 
 > ok.
 > 
 > Add adding support for `-p' in kldload with something that walkes the
 > list for the newly added kld_file_stat with `kldfirstmod' and
 > `modfnext' and calls a script with a list of the indexes and calling
 > the script with these?
 
 Sounds good - I'll tackle that at the same time.
 
 --
 Doug Rabson				Mail:  dfr@nlsystems.com
 Nonlinear Systems Ltd.			Phone: +44 181 442 9037
 
 

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: 09 Jan 1999 00:11:10 +0100

 Doug Rabson <dfr@nlsystems.com> writes:
 > > Add adding support for `-p' in kldload with something that walkes the
 > > list for the newly added kld_file_stat with `kldfirstmod' and
 > > `modfnext' and calls a script with a list of the indexes and calling
 > > the script with these?
 > 
 > Sounds good - I'll tackle that at the same time.
 
 You mean I should wait instead of implementing it myself? :-)
 
 /assar

From: Doug Rabson <dfr@nlsystems.com>
To: Assar Westerlund <assar@sics.se>
Cc: FreeBSD-gnats-submit@freebsd.org
Subject: Re: kern/9359: implement support for adding syscalls in KLD    
 modules
Date: Sat, 9 Jan 1999 15:21:33 +0000 (GMT)

 On 9 Jan 1999, Assar Westerlund wrote:
 
 > Doug Rabson <dfr@nlsystems.com> writes:
 > > > Add adding support for `-p' in kldload with something that walkes the
 > > > list for the newly added kld_file_stat with `kldfirstmod' and
 > > > `modfnext' and calls a script with a list of the indexes and calling
 > > > the script with these?
 > > 
 > > Sounds good - I'll tackle that at the same time.
 > 
 > You mean I should wait instead of implementing it myself? :-)
 
 I started to write this and then couldn't really think of a use for it.
 The main one would be to make device nodes I guess but devfs is a far
 better solution IMHO.  I'm going to close the PR now since the syscall
 stuff is in.
 
 --
 Doug Rabson				Mail:  dfr@nlsystems.com
 Nonlinear Systems Ltd.			Phone: +44 181 442 9037
 
 
State-Changed-From-To: open->closed 
State-Changed-By: dfr 
State-Changed-When: Sat Jan 9 08:55:50 PST 1999 
State-Changed-Why:  
Suggested fix applied. 
>Unformatted:
