ia32_ioctl.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:7k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * IA32 Architecture-specific ioctl shim code
  3.  *
  4.  * Copyright (C) 2000 VA Linux Co
  5.  * Copyright (C) 2000 Don Dugger <n0ano@valinux.com>
  6.  * Copyright (C) 2001 Hewlett-Packard Co
  7.  * David Mosberger-Tang <davidm@hpl.hp.com>
  8.  */
  9. #include <linux/types.h>
  10. #include <linux/dirent.h>
  11. #include <linux/msdos_fs.h>
  12. #include <linux/mtio.h>
  13. #include <linux/ncp_fs.h>
  14. #include <linux/capi.h>
  15. #include <linux/videodev.h>
  16. #include <linux/synclink.h>
  17. #include <linux/atmdev.h>
  18. #include <linux/atm_eni.h>
  19. #include <linux/atm_nicstar.h>
  20. #include <linux/atm_zatm.h>
  21. #include <linux/atm_idt77105.h>
  22. #include <linux/ppp_defs.h>
  23. #include <linux/if_ppp.h>
  24. #include <linux/ixjuser.h>
  25. #include <linux/i2o-dev.h>
  26. #include <asm/ia32.h>
  27. #include <../drivers/char/drm/drm.h>
  28. #define IOCTL_NR(a) ((a) & ~(_IOC_SIZEMASK << _IOC_SIZESHIFT))
  29. #define DO_IOCTL(fd, cmd, arg) ({
  30. int _ret;
  31. mm_segment_t _old_fs = get_fs();
  32. set_fs(KERNEL_DS);
  33. _ret = sys_ioctl(fd, cmd, (unsigned long)arg);
  34. set_fs(_old_fs);
  35. _ret;
  36. })
  37. #define P(i) ((void *)(unsigned long)(i))
  38. asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
  39. static long
  40. put_dirent32 (struct dirent *d, struct linux32_dirent *d32)
  41. {
  42. size_t namelen = strlen(d->d_name);
  43. return (put_user(d->d_ino, &d32->d_ino)
  44. || put_user(d->d_off, &d32->d_off)
  45. || put_user(d->d_reclen, &d32->d_reclen)
  46. || copy_to_user(d32->d_name, d->d_name, namelen + 1));
  47. }
  48. asmlinkage long
  49. sys32_ioctl (unsigned int fd, unsigned int cmd, unsigned int arg)
  50. {
  51. long ret;
  52. switch (IOCTL_NR(cmd)) {
  53.       case IOCTL_NR(VFAT_IOCTL_READDIR_SHORT):
  54.       case IOCTL_NR(VFAT_IOCTL_READDIR_BOTH): {
  55.       struct linux32_dirent *d32 = P(arg);
  56.       struct dirent d[2];
  57.       ret = DO_IOCTL(fd, _IOR('r', _IOC_NR(cmd),
  58.       struct dirent [2]),
  59.      (unsigned long) d);
  60.       if (ret < 0)
  61.   return ret;
  62.       if (put_dirent32(d, d32) || put_dirent32(d + 1, d32 + 1))
  63.   return -EFAULT;
  64.       return ret;
  65.       }
  66.       case IOCTL_NR(DRM_IOCTL_VERSION):
  67.       {
  68.       drm_version_t ver;
  69.       struct {
  70.       int version_major;
  71.       int version_minor;
  72.       int version_patchlevel;
  73.       unsigned int name_len;
  74.       unsigned int name; /* pointer */
  75.       unsigned int date_len;
  76.       unsigned int date; /* pointer */
  77.       unsigned int desc_len;
  78.       unsigned int desc; /* pointer */
  79.       } ver32;
  80.       if (copy_from_user(&ver32, P(arg), sizeof(ver32)))
  81.       return -EFAULT;
  82.       ver.name_len = ver32.name_len;
  83.       ver.name = P(ver32.name);
  84.       ver.date_len = ver32.date_len;
  85.       ver.date = P(ver32.date);
  86.       ver.desc_len = ver32.desc_len;
  87.       ver.desc = P(ver32.desc);
  88.       ret = DO_IOCTL(fd, DRM_IOCTL_VERSION, &ver);
  89.       if (ret >= 0) {
  90.       ver32.version_major = ver.version_major;
  91.       ver32.version_minor = ver.version_minor;
  92.       ver32.version_patchlevel = ver.version_patchlevel;
  93.       ver32.name_len = ver.name_len;
  94.       ver32.date_len = ver.date_len;
  95.       ver32.desc_len = ver.desc_len;
  96.       if (copy_to_user(P(arg), &ver32, sizeof(ver32)))
  97.       return -EFAULT;
  98.       }
  99.       return ret;
  100.       }
  101.       case IOCTL_NR(DRM_IOCTL_GET_UNIQUE):
  102.       {
  103.       drm_unique_t un;
  104.       struct {
  105.       unsigned int unique_len;
  106.       unsigned int unique;
  107.       } un32;
  108.       if (copy_from_user(&un32, P(arg), sizeof(un32)))
  109.       return -EFAULT;
  110.       un.unique_len = un32.unique_len;
  111.       un.unique = P(un32.unique);
  112.       ret = DO_IOCTL(fd, DRM_IOCTL_GET_UNIQUE, &un);
  113.       if (ret >= 0) {
  114.       un32.unique_len = un.unique_len;
  115.       if (copy_to_user(P(arg), &un32, sizeof(un32)))
  116.       return -EFAULT;
  117.       }
  118.       return ret;
  119.       }
  120.       case IOCTL_NR(DRM_IOCTL_SET_UNIQUE):
  121.       case IOCTL_NR(DRM_IOCTL_ADD_MAP):
  122.       case IOCTL_NR(DRM_IOCTL_ADD_BUFS):
  123.       case IOCTL_NR(DRM_IOCTL_MARK_BUFS):
  124.       case IOCTL_NR(DRM_IOCTL_INFO_BUFS):
  125.       case IOCTL_NR(DRM_IOCTL_MAP_BUFS):
  126.       case IOCTL_NR(DRM_IOCTL_FREE_BUFS):
  127.       case IOCTL_NR(DRM_IOCTL_ADD_CTX):
  128.       case IOCTL_NR(DRM_IOCTL_RM_CTX):
  129.       case IOCTL_NR(DRM_IOCTL_MOD_CTX):
  130.       case IOCTL_NR(DRM_IOCTL_GET_CTX):
  131.       case IOCTL_NR(DRM_IOCTL_SWITCH_CTX):
  132.       case IOCTL_NR(DRM_IOCTL_NEW_CTX):
  133.       case IOCTL_NR(DRM_IOCTL_RES_CTX):
  134.       case IOCTL_NR(DRM_IOCTL_AGP_ACQUIRE):
  135.       case IOCTL_NR(DRM_IOCTL_AGP_RELEASE):
  136.       case IOCTL_NR(DRM_IOCTL_AGP_ENABLE):
  137.       case IOCTL_NR(DRM_IOCTL_AGP_INFO):
  138.       case IOCTL_NR(DRM_IOCTL_AGP_ALLOC):
  139.       case IOCTL_NR(DRM_IOCTL_AGP_FREE):
  140.       case IOCTL_NR(DRM_IOCTL_AGP_BIND):
  141.       case IOCTL_NR(DRM_IOCTL_AGP_UNBIND):
  142. /* Mga specific ioctls */
  143.       case IOCTL_NR(DRM_IOCTL_MGA_INIT):
  144. /* I810 specific ioctls */
  145.       case IOCTL_NR(DRM_IOCTL_I810_GETBUF):
  146.       case IOCTL_NR(DRM_IOCTL_I810_COPY):
  147.       case IOCTL_NR(MTIOCGET):
  148.       case IOCTL_NR(MTIOCPOS):
  149.       case IOCTL_NR(MTIOCGETCONFIG):
  150.       case IOCTL_NR(MTIOCSETCONFIG):
  151.       case IOCTL_NR(PPPIOCSCOMPRESS):
  152.       case IOCTL_NR(PPPIOCGIDLE):
  153.       case IOCTL_NR(NCP_IOC_GET_FS_INFO_V2):
  154.       case IOCTL_NR(NCP_IOC_GETOBJECTNAME):
  155.       case IOCTL_NR(NCP_IOC_SETOBJECTNAME):
  156.       case IOCTL_NR(NCP_IOC_GETPRIVATEDATA):
  157.       case IOCTL_NR(NCP_IOC_SETPRIVATEDATA):
  158.       case IOCTL_NR(NCP_IOC_GETMOUNTUID2):
  159.       case IOCTL_NR(CAPI_MANUFACTURER_CMD):
  160.       case IOCTL_NR(VIDIOCGTUNER):
  161.       case IOCTL_NR(VIDIOCSTUNER):
  162.       case IOCTL_NR(VIDIOCGWIN):
  163.       case IOCTL_NR(VIDIOCSWIN):
  164.       case IOCTL_NR(VIDIOCGFBUF):
  165.       case IOCTL_NR(VIDIOCSFBUF):
  166.       case IOCTL_NR(MGSL_IOCSPARAMS):
  167.       case IOCTL_NR(MGSL_IOCGPARAMS):
  168.       case IOCTL_NR(ATM_GETNAMES):
  169.       case IOCTL_NR(ATM_GETLINKRATE):
  170.       case IOCTL_NR(ATM_GETTYPE):
  171.       case IOCTL_NR(ATM_GETESI):
  172.       case IOCTL_NR(ATM_GETADDR):
  173.       case IOCTL_NR(ATM_RSTADDR):
  174.       case IOCTL_NR(ATM_ADDADDR):
  175.       case IOCTL_NR(ATM_DELADDR):
  176.       case IOCTL_NR(ATM_GETCIRANGE):
  177.       case IOCTL_NR(ATM_SETCIRANGE):
  178.       case IOCTL_NR(ATM_SETESI):
  179.       case IOCTL_NR(ATM_SETESIF):
  180.       case IOCTL_NR(ATM_GETSTAT):
  181.       case IOCTL_NR(ATM_GETSTATZ):
  182.       case IOCTL_NR(ATM_GETLOOP):
  183.       case IOCTL_NR(ATM_SETLOOP):
  184.       case IOCTL_NR(ATM_QUERYLOOP):
  185.       case IOCTL_NR(ENI_SETMULT):
  186.       case IOCTL_NR(NS_GETPSTAT):
  187. /* case IOCTL_NR(NS_SETBUFLEV): This is a duplicate case with ZATM_GETPOOLZ */
  188.       case IOCTL_NR(ZATM_GETPOOLZ):
  189.       case IOCTL_NR(ZATM_GETPOOL):
  190.       case IOCTL_NR(ZATM_SETPOOL):
  191.       case IOCTL_NR(ZATM_GETTHIST):
  192.       case IOCTL_NR(IDT77105_GETSTAT):
  193.       case IOCTL_NR(IDT77105_GETSTATZ):
  194.       case IOCTL_NR(IXJCTL_TONE_CADENCE):
  195.       case IOCTL_NR(IXJCTL_FRAMES_READ):
  196.       case IOCTL_NR(IXJCTL_FRAMES_WRITTEN):
  197.       case IOCTL_NR(IXJCTL_READ_WAIT):
  198.       case IOCTL_NR(IXJCTL_WRITE_WAIT):
  199.       case IOCTL_NR(IXJCTL_DRYBUFFER_READ):
  200.       case IOCTL_NR(I2OHRTGET):
  201.       case IOCTL_NR(I2OLCTGET):
  202.       case IOCTL_NR(I2OPARMSET):
  203.       case IOCTL_NR(I2OPARMGET):
  204.       case IOCTL_NR(I2OSWDL):
  205.       case IOCTL_NR(I2OSWUL):
  206.       case IOCTL_NR(I2OSWDEL):
  207.       case IOCTL_NR(I2OHTML):
  208. break;
  209.       default:
  210. return sys_ioctl(fd, cmd, (unsigned long)arg);
  211. }
  212. printk("%x:unimplemented IA32 ioctl system calln", cmd);
  213. return -EINVAL;
  214. }