80 lines
2.1 KiB
C
80 lines
2.1 KiB
C
|
/* $Id: ia32_ioctl.c,v 1.25 2002/10/11 07:17:06 ak Exp $
|
||
|
* ioctl32.c: Conversion between 32bit and 64bit native ioctls.
|
||
|
*
|
||
|
* Copyright (C) 1997-2000 Jakub Jelinek (jakub@redhat.com)
|
||
|
* Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be)
|
||
|
* Copyright (C) 2001,2002 Andi Kleen, SuSE Labs
|
||
|
*
|
||
|
* These routines maintain argument size conversion between 32bit and 64bit
|
||
|
* ioctls.
|
||
|
*/
|
||
|
|
||
|
#define INCLUDES
|
||
|
#include <linux/syscalls.h>
|
||
|
#include "compat_ioctl.c"
|
||
|
#include <asm/ia32.h>
|
||
|
|
||
|
#define CODE
|
||
|
#include "compat_ioctl.c"
|
||
|
|
||
|
#define RTC_IRQP_READ32 _IOR('p', 0x0b, unsigned int) /* Read IRQ rate */
|
||
|
#define RTC_IRQP_SET32 _IOW('p', 0x0c, unsigned int) /* Set IRQ rate */
|
||
|
#define RTC_EPOCH_READ32 _IOR('p', 0x0d, unsigned) /* Read epoch */
|
||
|
#define RTC_EPOCH_SET32 _IOW('p', 0x0e, unsigned) /* Set epoch */
|
||
|
|
||
|
static int rtc32_ioctl(unsigned fd, unsigned cmd, unsigned long arg)
|
||
|
{
|
||
|
unsigned long val;
|
||
|
mm_segment_t oldfs = get_fs();
|
||
|
int ret;
|
||
|
|
||
|
switch (cmd) {
|
||
|
case RTC_IRQP_READ32:
|
||
|
set_fs(KERNEL_DS);
|
||
|
ret = sys_ioctl(fd, RTC_IRQP_READ, (unsigned long)&val);
|
||
|
set_fs(oldfs);
|
||
|
if (!ret)
|
||
|
ret = put_user(val, (unsigned int __user *) arg);
|
||
|
return ret;
|
||
|
|
||
|
case RTC_IRQP_SET32:
|
||
|
cmd = RTC_IRQP_SET;
|
||
|
break;
|
||
|
|
||
|
case RTC_EPOCH_READ32:
|
||
|
set_fs(KERNEL_DS);
|
||
|
ret = sys_ioctl(fd, RTC_EPOCH_READ, (unsigned long) &val);
|
||
|
set_fs(oldfs);
|
||
|
if (!ret)
|
||
|
ret = put_user(val, (unsigned int __user *) arg);
|
||
|
return ret;
|
||
|
|
||
|
case RTC_EPOCH_SET32:
|
||
|
cmd = RTC_EPOCH_SET;
|
||
|
break;
|
||
|
}
|
||
|
return sys_ioctl(fd,cmd,arg);
|
||
|
}
|
||
|
|
||
|
|
||
|
#define HANDLE_IOCTL(cmd,handler) { (cmd), (ioctl_trans_handler_t)(handler) },
|
||
|
#define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd,sys_ioctl)
|
||
|
|
||
|
struct ioctl_trans ioctl_start[] = {
|
||
|
#include <linux/compat_ioctl.h>
|
||
|
#define DECLARES
|
||
|
#include "compat_ioctl.c"
|
||
|
|
||
|
/* And these ioctls need translation */
|
||
|
/* realtime device */
|
||
|
HANDLE_IOCTL(RTC_IRQP_READ, rtc32_ioctl)
|
||
|
HANDLE_IOCTL(RTC_IRQP_READ32,rtc32_ioctl)
|
||
|
HANDLE_IOCTL(RTC_IRQP_SET32, rtc32_ioctl)
|
||
|
HANDLE_IOCTL(RTC_EPOCH_READ32, rtc32_ioctl)
|
||
|
HANDLE_IOCTL(RTC_EPOCH_SET32, rtc32_ioctl)
|
||
|
/* take care of sizeof(sizeof()) breakage */
|
||
|
};
|
||
|
|
||
|
int ioctl_table_size = ARRAY_SIZE(ioctl_start);
|
||
|
|