Date: Mon, 25 Jul 2005 16:58:55 +0200 From: "Norbert Koch" <NKoch@demig.de> To: "Giorgos Keramidas" <keramida@freebsd.org>, "Felix-KM" <Felix-KM@yandex.ru> Cc: freebsd-hackers@freebsd.org Subject: RE: how to use the function copyout() Message-ID: <000001c59129$6099b560$4801a8c0@ws-ew-3.W2KDEMIG> In-Reply-To: <20050725142745.GA26647@beatrix.daedalusnetworks.priv>
next in thread | previous in thread | raw e-mail | index | archive | help
> > > So if I get it right, it's impossible in FreeBSD to gain access to > > 64KB of user's program memory with ioctl? > > > > My situation is this - I have a device driver for Linux. My task is > > port it as it is (1:1) into FreeBSD. > > > > In the Linux driver Ioctl is realized with the macroses _put_user > > _get_user all over it. As I understand in FreeBSD their analogues are > > functions described in store(9), copy(9) and fetch(9). > > > > So the problem is that in my user program an array short unsigned int > > Data[32768] is defined. I need to gain access to the array(to each > > element of it) from device driver with Ioctl handler. > > > > Is it possible to do? If yes, then how it can be done? > > A better alternative that doesn't involve copying huge amounts of data > from userlevel to kernel space and vice versa is probably to pass just > the address of the area with an ioctl() and then map the appropriate > pages from the address space of the user process to an area where the > kernel can access the data directly? I think that could work (only an idea, not tested): struct Region { void * p; size_t s; }; #define IOBIG _IOWR ('b', 123, struct Region) userland: char data[1000]; struct Region r; r.p = data; r.s = sizeof data; int error = ioctl (fd, IOBIG, &r); kernel: int my_ioctl(..., caddr_t data, ...) { ... char data[1000]; ... return copyout(data, ((struct Region *) data)->p, ((struct Region *) data)->s); } Have a try and tell us if it works. Norbert
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?000001c59129$6099b560$4801a8c0>