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