[Nelug] ioctl() problem

peter.holmes at fopet-esl.com peter.holmes at fopet-esl.com
Sat Feb 22 15:30:02 UTC 2003


Something for the weekend, sir?
If you know kernel hacking well you'll see my mistake.
I obviously don't know it well.

An acknowledgement here to Chris Burton who started me down the right path..
It's been a painful, if profitable(?), experience.

I've written and tested a LKM which accesses the parallel port.
I know the code works by looking at KERN_INFO messages in
/var/log/syslog. i.e. received characters are printed there.
Problem is that I can't see this information in User space.

Sample code:

Note: my_ioctl() aleady loaded and visible in /dev/

main() {
  int fd, data, retval;
  ulong ularg;
  fd = open( "foo", O_RDWR);
  if( fd < 0)  .. error handling.
  retval = ioctl( fd, FOO_IO, ularg);
  printf("Data %d %lx\n", retval, ularg);
 ...... etc..
}

What I see on the terminal screen is:

Data 0 804977c 
-OR-
Data 0 bffff928

The first is when 'ularg' is allocated before "int fd, data, retval;"
and the second when it's allocated afterwards.
To me this looks very like a pointer being written into 'ularg'.

The '0' (zero) after "Data" indicates that the call has succeeded.

Part of foo_ioctl() code:

int foo_ioctl( struct inode *inode,  
               struct file *filep, 
               unsigned int cmd, 
               unsigned long arg)
{
   int dat, rval;
  <... test here for correct command 'cmd' ...>
 spin_lock( &foo_lock);
 switch (cmd)
    {
  case: FOO_IO:
     dat = _foo_pull( );
   spin_unlock( &foo_lock);
      rval = put_user( dat, (unsigned long *) arg);
#ifdef DEBUG
  printk( KERN_INFO "foo: read %d %x", rval, dat);
#endif
      return rval;
      break;
      .............  other case(s)
}
OK. The 'return()' isn't tidy but for debugging....
The printk() does what I expect and shows me correct data and zero return 
value,
i.e. the _foo_pull() works OK and put_user() doesn't find an error in my 
passed 'ulong'.

So where is it going wrong??

Linux 2.4.18, gcc 3, MDK8.2

If anyone can see my mistake I'd be SEVERELY obliged.
Call me 'stupid' if it's obvious, Peter otherwise.




More information about the Nelug mailing list