ioctl: uiomove, copyin, copyout
Kristis Makris
kristis.makris at asu.edu
Tue Sep 5 23:44:55 UTC 2006
Hello,
I'm trying to port a driver from Linux 2.2-2.6 to FreeBSD. I have two
problems:
1) Finding the equivalent of the Linux copy_to_user and copy_from_user
routines. Are those copyin, and copyout ?
2) Getting the ioctl operation to work. When issuing an ioctl from
userspace I get:
# dynamos_control -o 9
ioctl error for command 9: Inappropriate ioctl for device
errno is 25
it's an ENOTTY
... while in the driver I have:
static d_read_t dynreplace_file_operations_read;
static d_ioctl_t dynreplace_file_operations_ioctl;
static struct cdevsw dynreplace_cdevsw = {
.d_version = D_VERSION,
.d_open = dynreplace_file_operations_open,
.d_close = dynreplace_file_operations_release,
.d_read = dynreplace_file_operations_read,
.d_ioctl = dynreplace_file_operations_ioctl,
.d_name = MODULE_NAME_STR,
};
int dynreplace_file_operations_ioctl(struct cdev *dev, u_long cmd,
caddr_t data, int flags, struct thread *td)
{
print( "ioctl - MAIN\n");
return 0;
}
... the _read operation works as expected, but I don't even see the
print statement from _ioctl.
The ioctl(2) manpage reads:
[ENOTTY] The d argument is not associated with a
character special device.
This can't be true since the read operation works, and:
# ls -lrta /dev/dynamos
crwx------ 1 root wheel 0, 95 Sep 2 16:31 /dev/dynamos
and...
[ENOTTY] The specified request does not apply to the kind
of object that the descriptor d references.
Is this last part somehow enforced by the kernel ?
I know I have an uncommon build process, since the driver is built for
multiple OSs, but if I can get the read operation to work why would
ioctl be so difficult ?
Am I missing something ?
More information about the freebsd-drivers
mailing list