Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Aug 2005 21:50:02 +0400
From:      Sergey Uvarov <uvarovsl@mail.pnpi.spb.ru>
To:        John Baldwin <jhb@freebsd.org>
Cc:        freebsd-hackers@freebsd.org, Dirk GOUDERS <gouders@et.bocholt.fh-ge.de>
Subject:   Re: preferable way to control kernel module
Message-ID:  <42FB8FCA.2050803@mail.pnpi.spb.ru>
In-Reply-To: <200508111329.42154.jhb@FreeBSD.org>
References:  <200508111616.j7BGGZWG055221@sora.hank.home> <200508111329.42154.jhb@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
John Baldwin wrote:
> On Thursday 11 August 2005 12:16 pm, Dirk GOUDERS wrote:
> 
>> > > Thank you for advise. But I wonder: what is wrong with syscall
>> > > approach (via SYSCALL_MODULE macro)?
>> >
>> > I just haven't done one personally.  I think there's also a lot more
>> > potenti al
>> > for collisions when trying to pick a syscall number versus picking a
>> > string name for a sysctl or /dev entry.
>>
>>Shouldn't that be no problem if he sets the offset parameter to
>>SYSCALL_MODULE to NO_SYSCALL (get the next free offset)?
> 
> 
> But then you have to communicate the syscall number out to your userland 
> applications somehow, and the applications have to know how to invoke a 
> syscall by hand (perhaps they could use the syscall() function, but still).
> 
It is not a big problem. Look at the following piece of code:


/* Kernel module portion of code. */
static int my_syscall = NO_SYSCALL;
static struct sysent my_sysent = {
	2,				/* sy_arg */
	(sy_call_t *)&my_func		/* sy_call */
};
SYSCALL_MODULE(my_syscall_name, &my_syscall, &my_sysent,
	       NULL, NULL);


/* User-land portion of code. */
int get_syscall(const char *syscall_name)
{
	struct module_stat	stat;
	int			mod_id;
	int			syscall_num;

	if ((mod_id = modfind(syscall_name)) < 0)
		return (-1);

	stat.version = sizeof(stat);
	if (modstat(mod_id, &stat) < 0)
		return (-1);

	return (stat.data.intval);
}

...

syscall_num = get_syscall("my_syscall_name");

/* Issue a syscall with necessary parameters. */
syscall(syscall_num, ...);




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