Update to mapped_ioctl and linux emulation
Brock Johnson
wildefire at isentry.homelinux.org
Thu Feb 24 08:52:13 PST 2005
Hi all,
I've been working with Simon Schubert on updating mapped_ioctl to handle
some special cases under the linux emulator (drm and oss sound
emulation), the attached patch fixes/adds support for mapping entire
ioctl ranges to other ranges. I've been running with this for a couple
days now and it's been fine here but we'd like to get more testing in.
Assuming no objections or bugs show up, Simon has said he'll commit this
on Monday evening.
Thanks,
Brock
Index: conf/options
===================================================================
RCS file: /home/dcvs/src/sys/conf/options,v
retrieving revision 1.30
diff -u -r1.30 options
--- conf/options 11 Feb 2005 22:25:56 -0000 1.30
+++ conf/options 24 Feb 2005 15:54:08 -0000
@@ -1,5 +1,5 @@
# $FreeBSD: src/sys/conf/options,v 1.191.2.53 2003/06/04 17:56:58 sam Exp $
-# $DragonFly: src/sys/conf/options,v 1.30 2005/02/11 22:25:56 joerg Exp $
+# $DragonFly$
#
# On the handling of kernel options
#
@@ -354,6 +354,7 @@
# DRM options
DRM_DEBUG opt_drm.h
+DRM_LINUX opt_drm.h
# ATM (HARP version)
ATM_CORE opt_atm.h
Index: dev/drm/drm_drv.h
===================================================================
RCS file: /home/dcvs/src/sys/dev/drm/drm_drv.h,v
retrieving revision 1.10
diff -u -r1.10 drm_drv.h
--- dev/drm/drm_drv.h 18 Sep 2004 16:25:54 -0000 1.10
+++ dev/drm/drm_drv.h 24 Feb 2005 15:53:12 -0000
@@ -29,7 +29,7 @@
* Gareth Hughes <gareth at xxxxxxxxxxx>
*
* $FreeBSD: src/sys/dev/drm/drm_drv.h,v 1.13.2.1 2003/04/26 07:05:28 anholt Exp $
- * $DragonFly: src/sys/dev/drm/drm_drv.h,v 1.10 2004/09/18 16:25:54 joerg Exp $
+ * $DragonFly$
*/
/*
@@ -1144,10 +1144,9 @@
#define LINUX_IOCTL_DRM_MIN 0x6400
#define LINUX_IOCTL_DRM_MAX 0x64ff
-static ioctl_map_func DRM(ioctl_dirmap);
static struct ioctl_map_range DRM(ioctl_cmds)[] = {
- /* XXX: we should have a BSD #define for the range */
- MAPPED_IOCTL_MAPRANGE(LINUX_IOCTL_DRM_MIN, LINUX_IOCTL_DRM_MAX, LINUX_IOCTL_DRM_MIN, DRM(ioctl_dirmap)),
+ MAPPED_IOCTL_MAPRANGE(LINUX_IOCTL_DRM_MIN, LINUX_IOCTL_DRM_MAX, LINUX_IOCTL_DRM_MIN,
+ LINUX_IOCTL_DRM_MAX, NULL, linux_gen_dirmap),
MAPPED_IOCTL_MAPF(0, 0, NULL)
};
@@ -1162,11 +1161,4 @@
SYSUNINIT(DRM(unregister), SI_SUB_KLD, SI_ORDER_MIDDLE,
mapped_ioctl_unregister_handler, &DRM(ioctl_handler));
-static int
-DRM(ioctl_dirmap)(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, struct thread *td)
-{
- return(linux_ioctl_dirmap(fp, cmd + (ocmd - LINUX_IOCTL_DRM_MIN),
- ocmd, data, td));
-}
-
#endif /* DRM_LINUX */
Index: emulation/linux/linux_ioctl.c
===================================================================
RCS file: /home/dcvs/src/sys/emulation/linux/linux_ioctl.c,v
retrieving revision 1.16
diff -u -r1.16 linux_ioctl.c
--- emulation/linux/linux_ioctl.c 17 Feb 2005 13:59:36 -0000 1.16
+++ emulation/linux/linux_ioctl.c 24 Feb 2005 15:53:36 -0000
@@ -27,7 +27,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.55.2.11 2003/05/01 20:16:09 anholt Exp $
- * $DragonFly: src/sys/emulation/linux/linux_ioctl.c,v 1.16 2005/02/17 13:59:36 joerg Exp $
+ * $DragonFly$
*/
#include <sys/param.h>
@@ -1190,12 +1190,12 @@
/*
* generic linux -> BSD syscall direction mapper
*/
-int
-linux_ioctl_dirmap(struct file *fp, u_long cmd, u_long ocmd, caddr_t data, struct thread *td)
+u_long
+linux_gen_dirmap(u_long lstart, u_long lend, u_long bstart, u_long bend, u_long cmd, u_long ocmd)
{
static u_int32_t dirbits[4] = { IOC_VOID, IOC_IN, IOC_OUT, IOC_INOUT };
- return (fo_ioctl(fp, (cmd & ~IOC_DIRMASK) | dirbits[ocmd >> 30], data, td));
+ return (((cmd & ~IOC_DIRMASK) | dirbits[ocmd >> 30]));
}
@@ -1247,60 +1247,15 @@
MAPPED_IOCTL_IOWR(LINUX_CDROMSUBCHNL, linux_ioctl_CDROMSUBCHNL, struct linux_cdrom_subchnl),
MAPPED_IOCTL_MAP(LINUX_CDROMRESET, CDIOCRESET),
/* sound ioctl */
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_VOLUME, SOUND_MIXER_WRITE_VOLUME, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_BASS, SOUND_MIXER_WRITE_BASS, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_TREBLE, SOUND_MIXER_WRITE_TREBLE, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_SYNTH, SOUND_MIXER_WRITE_SYNTH, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_PCM, SOUND_MIXER_WRITE_PCM, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_SPEAKER, SOUND_MIXER_WRITE_SPEAKER, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_LINE, SOUND_MIXER_WRITE_LINE, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_MIC, SOUND_MIXER_WRITE_MIC, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_CD, SOUND_MIXER_WRITE_CD, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_IMIX, SOUND_MIXER_WRITE_IMIX, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_ALTPCM, SOUND_MIXER_WRITE_ALTPCM, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_RECLEV, SOUND_MIXER_WRITE_RECLEV, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_IGAIN, SOUND_MIXER_WRITE_IGAIN, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_OGAIN, SOUND_MIXER_WRITE_OGAIN, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_LINE1, SOUND_MIXER_WRITE_LINE1, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_LINE2, SOUND_MIXER_WRITE_LINE2, linux_ioctl_dirmap),
- MAPPED_IOCTL_MAPF(LINUX_SOUND_MIXER_WRITE_LINE3, SOUND_MIXER_WRITE_LINE3, linux_ioctl_dirmap),
+ MAPPED_IOCTL_MAPRANGE(LINUX_SOUND_MIXER_WRITE_MIN, LINUX_SOUND_MIXER_WRITE_MAX,
+ LINUX_SOUND_MIXER_WRITE_MIN, LINUX_SOUND_MIXER_WRITE_MAX,
+ NULL, linux_gen_dirmap),
MAPPED_IOCTL_IOR(LINUX_OSS_GETVERSION, linux_ioctl_OSS_GETVERSION, int),
MAPPED_IOCTL_MAP(LINUX_SOUND_MIXER_READ_DEVMASK, SOUND_MIXER_READ_DEVMASK),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_RESET, SNDCTL_DSP_RESET),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_SYNC, SNDCTL_DSP_SYNC),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_SPEED, SNDCTL_DSP_SPEED),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_STEREO, SNDCTL_DSP_STEREO),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_GETBLKSIZE, SNDCTL_DSP_GETBLKSIZE),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_SETFMT, SNDCTL_DSP_SETFMT),
- MAPPED_IOCTL_MAP(LINUX_SOUND_PCM_WRITE_CHANNELS, SOUND_PCM_WRITE_CHANNELS),
- MAPPED_IOCTL_MAP(LINUX_SOUND_PCM_WRITE_FILTER, SOUND_PCM_WRITE_FILTER),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_POST, SNDCTL_DSP_POST),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_SUBDIVIDE, SNDCTL_DSP_SUBDIVIDE),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_SETFRAGMENT, SNDCTL_DSP_SETFRAGMENT),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_GETFMTS, SNDCTL_DSP_GETFMTS),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_GETOSPACE, SNDCTL_DSP_GETOSPACE),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_GETISPACE, SNDCTL_DSP_GETISPACE),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_NONBLOCK, SNDCTL_DSP_NONBLOCK),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_GETCAPS, SNDCTL_DSP_GETCAPS),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_SETTRIGGER, SNDCTL_DSP_SETTRIGGER),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_GETIPTR, SNDCTL_DSP_GETIPTR),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_GETOPTR, SNDCTL_DSP_GETOPTR),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_DSP_GETODELAY, SNDCTL_DSP_GETODELAY),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SEQ_RESET, SNDCTL_SEQ_RESET),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SEQ_SYNC, SNDCTL_SEQ_SYNC),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SYNTH_INFO, SNDCTL_SYNTH_INFO),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SEQ_CTRLRATE, SNDCTL_SEQ_CTRLRATE),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SEQ_GETOUTCOUNT, SNDCTL_SEQ_GETOUTCOUNT),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SEQ_GETINCOUNT, SNDCTL_SEQ_GETINCOUNT),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SEQ_PERCMODE, SNDCTL_SEQ_PERCMODE),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_FM_LOAD_INSTR, SNDCTL_FM_LOAD_INSTR),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SEQ_TESTMIDI, SNDCTL_SEQ_TESTMIDI),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SEQ_RESETSAMPLES, SNDCTL_SEQ_RESETSAMPLES),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SEQ_NRSYNTHS, SNDCTL_SEQ_NRSYNTHS),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SEQ_NRMIDIS, SNDCTL_SEQ_NRMIDIS),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_MIDI_INFO, SNDCTL_MIDI_INFO),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SEQ_TRESHOLD, SNDCTL_SEQ_TRESHOLD),
- MAPPED_IOCTL_MAP(LINUX_SNDCTL_SYNTH_MEMAVL, SNDCTL_SYNTH_MEMAVL),
+ MAPPED_IOCTL_MAPRANGE(LINUX_SNDCTL_DSP_MIN, LINUX_SNDCTL_DSP_MAX, LINUX_SNDCTL_DSP_MIN,
+ LINUX_SNDCTL_DSP_MAX, NULL, linux_gen_dirmap),
+ MAPPED_IOCTL_MAPRANGE(LINUX_SNDCTL_SEQ_MIN, LINUX_SNDCTL_SEQ_MAX, LINUX_SNDCTL_SEQ_MIN,
+ LINUX_SNDCTL_SEQ_MAX, NULL, linux_gen_dirmap),
/* console ioctl */
MAPPED_IOCTL_MAP(LINUX_KIOCSOUND, KIOCSOUND),
MAPPED_IOCTL_MAP(LINUX_KDMKTONE, KDMKTONE),
Index: emulation/linux/linux_ioctl.h
===================================================================
RCS file: /home/dcvs/src/sys/emulation/linux/linux_ioctl.h,v
retrieving revision 1.4
diff -u -r1.4 linux_ioctl.h
--- emulation/linux/linux_ioctl.h 15 Aug 2004 14:15:00 -0000 1.4
+++ emulation/linux/linux_ioctl.h 24 Feb 2005 15:53:51 -0000
@@ -26,7 +26,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD: src/sys/compat/linux/linux_ioctl.h,v 1.4.2.4 2003/05/01 20:16:09 anholt Exp $
- * $DragonFly: src/sys/emulation/linux/linux_ioctl.h,v 1.4 2004/08/15 14:15:00 joerg Exp $
+ * $DragonFly$
*/
#ifndef _LINUX_IOCTL_H_
@@ -169,65 +169,17 @@
/*
* sound
*/
-#define LINUX_SOUND_MIXER_WRITE_VOLUME 0x4d00
-#define LINUX_SOUND_MIXER_WRITE_BASS 0x4d01
-#define LINUX_SOUND_MIXER_WRITE_TREBLE 0x4d02
-#define LINUX_SOUND_MIXER_WRITE_SYNTH 0x4d03
-#define LINUX_SOUND_MIXER_WRITE_PCM 0x4d04
-#define LINUX_SOUND_MIXER_WRITE_SPEAKER 0x4d05
-#define LINUX_SOUND_MIXER_WRITE_LINE 0x4d06
-#define LINUX_SOUND_MIXER_WRITE_MIC 0x4d07
-#define LINUX_SOUND_MIXER_WRITE_CD 0x4d08
-#define LINUX_SOUND_MIXER_WRITE_IMIX 0x4d09
-#define LINUX_SOUND_MIXER_WRITE_ALTPCM 0x4d0A
-#define LINUX_SOUND_MIXER_WRITE_RECLEV 0x4d0B
-#define LINUX_SOUND_MIXER_WRITE_IGAIN 0x4d0C
-#define LINUX_SOUND_MIXER_WRITE_OGAIN 0x4d0D
-#define LINUX_SOUND_MIXER_WRITE_LINE1 0x4d0E
-#define LINUX_SOUND_MIXER_WRITE_LINE2 0x4d0F
-#define LINUX_SOUND_MIXER_WRITE_LINE3 0x4d10
+#define LINUX_SOUND_MIXER_WRITE_MIN 0x4d00
+#define LINUX_SOUND_MIXER_WRITE_MAX 0x4d18
#define LINUX_OSS_GETVERSION 0x4d76
#define LINUX_SOUND_MIXER_READ_DEVMASK 0x4dfe
-#define LINUX_SNDCTL_DSP_RESET 0x5000
-#define LINUX_SNDCTL_DSP_SYNC 0x5001
-#define LINUX_SNDCTL_DSP_SPEED 0x5002
-#define LINUX_SNDCTL_DSP_STEREO 0x5003
-#define LINUX_SNDCTL_DSP_GETBLKSIZE 0x5004
-#define LINUX_SNDCTL_DSP_SETBLKSIZE LINUX_SNDCTL_DSP_GETBLKSIZE
-#define LINUX_SNDCTL_DSP_SETFMT 0x5005
-#define LINUX_SOUND_PCM_WRITE_CHANNELS 0x5006
-#define LINUX_SOUND_PCM_WRITE_FILTER 0x5007
-#define LINUX_SNDCTL_DSP_POST 0x5008
-#define LINUX_SNDCTL_DSP_SUBDIVIDE 0x5009
-#define LINUX_SNDCTL_DSP_SETFRAGMENT 0x500A
-#define LINUX_SNDCTL_DSP_GETFMTS 0x500B
-#define LINUX_SNDCTL_DSP_GETOSPACE 0x500C
-#define LINUX_SNDCTL_DSP_GETISPACE 0x500D
-#define LINUX_SNDCTL_DSP_NONBLOCK 0x500E
-#define LINUX_SNDCTL_DSP_GETCAPS 0x500F
-#define LINUX_SNDCTL_DSP_GETTRIGGER 0x5010
-#define LINUX_SNDCTL_DSP_SETTRIGGER LINUX_SNDCTL_DSP_GETTRIGGER
-#define LINUX_SNDCTL_DSP_GETIPTR 0x5011
-#define LINUX_SNDCTL_DSP_GETOPTR 0x5012
-#define LINUX_SNDCTL_DSP_GETODELAY 0x5017
-#define LINUX_SNDCTL_SEQ_RESET 0x5100
-#define LINUX_SNDCTL_SEQ_SYNC 0x5101
-#define LINUX_SNDCTL_SYNTH_INFO 0x5102
-#define LINUX_SNDCTL_SEQ_CTRLRATE 0x5103
-#define LINUX_SNDCTL_SEQ_GETOUTCOUNT 0x5104
-#define LINUX_SNDCTL_SEQ_GETINCOUNT 0x5105
-#define LINUX_SNDCTL_SEQ_PERCMODE 0x5106
-#define LINUX_SNDCTL_FM_LOAD_INSTR 0x5107
-#define LINUX_SNDCTL_SEQ_TESTMIDI 0x5108
-#define LINUX_SNDCTL_SEQ_RESETSAMPLES 0x5109
-#define LINUX_SNDCTL_SEQ_NRSYNTHS 0x510A
-#define LINUX_SNDCTL_SEQ_NRMIDIS 0x510B
-#define LINUX_SNDCTL_MIDI_INFO 0x510C
-#define LINUX_SNDCTL_SEQ_TRESHOLD 0x510D
-#define LINUX_SNDCTL_SYNTH_MEMAVL 0x510E
+#define LINUX_SNDCTL_DSP_MIN 0x5000
+#define LINUX_SNDCTL_DSP_MAX 0x5017
+#define LINUX_SNDCTL_SEQ_MIN 0x5100
+#define LINUX_SNDCTL_SEQ_MAX 0x5116
-#define LINUX_IOCTL_SOUND_MIN LINUX_SOUND_MIXER_WRITE_VOLUME
-#define LINUX_IOCTL_SOUND_MAX LINUX_SNDCTL_SYNTH_MEMAVL
+#define LINUX_IOCTL_SOUND_MIN LINUX_SOUND_MIXER_WRITE_MIN
+#define LINUX_IOCTL_SOUND_MAX LINUX_SNDCTL_SEQ_MAX
/*
* termio
@@ -634,15 +586,12 @@
#define LINUX_ASYNC_CALLOUT_NOHUP 0x0400
#define LINUX_ASYNC_FLAGS 0x0FFF
-#define LINUX_IOCTL_DRM_MIN 0x6400
-#define LINUX_IOCTL_DRM_MAX 0x64ff
-
/*
* This doesn't really belong here, but I can't think of a better
* place to put it.
*/
struct ifnet;
int linux_ifname(struct ifnet *, char *, size_t);
-int linux_ioctl_dirmap(struct file *, u_long, u_long, caddr_t, struct thread *);
+u_long linux_gen_dirmap(u_long, u_long, u_long, u_long, u_long, u_long);
#endif /* !_LINUX_IOCTL_H_ */
Index: kern/sys_generic.c
===================================================================
RCS file: /home/dcvs/src/sys/kern/sys_generic.c,v
retrieving revision 1.18
diff -u -r1.18 sys_generic.c
--- kern/sys_generic.c 13 Sep 2004 23:41:18 -0000 1.18
+++ kern/sys_generic.c 24 Feb 2005 16:26:25 -0000
@@ -37,7 +37,7 @@
*
* @(#)sys_generic.c 8.5 (Berkeley) 1/21/94
* $FreeBSD: src/sys/kern/sys_generic.c,v 1.55.2.10 2001/03/17 10:39:32 peter Exp $
- * $DragonFly: src/sys/kern/sys_generic.c,v 1.18 2004/09/13 23:41:18 drhodus Exp $
+ * $DragonFly$
*/
#include "opt_ktrace.h"
@@ -434,7 +434,8 @@
LIST_FOREACH(e, &map->mapping, entries) {
for (iomc = e->cmd_ranges; iomc->start != 0 ||
- iomc->maptocmd != 0 || iomc->func != NULL;
+ iomc->maptocmd != 0 || iomc->wrapfunc != NULL ||
+ iomc->mapfunc != NULL;
iomc++) {
if (maskcmd >= iomc->start &&
maskcmd <= iomc->end)
@@ -443,13 +444,13 @@
/* Did we find a match? */
if (iomc->start != 0 || iomc->maptocmd != 0 ||
- iomc->func != NULL)
+ iomc->wrapfunc != NULL || iomc->mapfunc != NULL)
break;
}
if (iomc == NULL ||
(iomc->start == 0 && iomc->maptocmd == 0
- && iomc->func == NULL)) {
+ && iomc->wrapfunc == NULL && iomc->mapfunc == NULL)) {
printf("%s: 'ioctl' fd=%d, cmd=0x%lx ('%c',%d) not implemented\n",
map->sys, fd, maskcmd,
(int)((maskcmd >> 8) & 0xff),
@@ -457,7 +458,37 @@
return(EINVAL);
}
- com = iomc->maptocmd;
+ /*
+ * If it's a non-range one to one mapping, maptocmd should be
+ * correct. If it's a ranged one to one mapping, we pass the
+ * original value of com, and for a range mapped to a different
+ * range, we need a mapping function to translate the ioctl
+ * to our native ioctl. Ex. 6500-65ff <-> 9500-95ff
+ */
+ if (iomc->start == iomc->end && iomc->maptocmd == iomc->maptoend) {
+ com = iomc->maptocmd;
+ } else if (iomc->start == iomc->maptocmd && iomc->end == iomc->maptoend) {
+ if (iomc->mapfunc != NULL) {
+ com = ocom;
+ com = iomc->mapfunc(iomc->start, iomc->end,
+ iomc->maptocmd, iomc->maptoend,
+ com, ocom);
+ } else {
+ com = ocom;
+ }
+ } else {
+ if (iomc->mapfunc != NULL) {
+ com = iomc->mapfunc(iomc->start, iomc->end,
+ iomc->maptocmd, iomc->maptoend,
+ com, ocom);
+ } else {
+ printf("%s: Invalid mapping for fd=%d, cmd=%#lx ('%c',%d)\n",
+ map->sys, fd, maskcmd,
+ (int)((maskcmd >> 8) & 0xff),
+ (int)(maskcmd & 0xff));
+ return(EINVAL);
+ }
+ }
}
switch (com) {
@@ -531,8 +562,8 @@
* If there is a override function,
* call it instead of directly routing the call
*/
- if (map != NULL && iomc->func != NULL)
- error = iomc->func(fp, com, ocom, data, td);
+ if (map != NULL && iomc->wrapfunc != NULL)
+ error = iomc->wrapfunc(fp, com, ocom, data, td);
else
error = fo_ioctl(fp, com, data, td);
/*
Index: sys/mapped_ioctl.h
===================================================================
RCS file: /home/dcvs/src/sys/sys/mapped_ioctl.h,v
retrieving revision 1.1
diff -u -r1.1 mapped_ioctl.h
--- sys/mapped_ioctl.h 13 Aug 2004 11:59:00 -0000 1.1
+++ sys/mapped_ioctl.h 24 Feb 2005 15:52:50 -0000
@@ -31,7 +31,7 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $DragonFly: src/sys/sys/mapped_ioctl.h,v 1.1 2004/08/13 11:59:00 joerg Exp $
+ * $DragonFly$
*/
#ifndef _SYS_MAPPED_IOCTL_H_
#define _SYS_MAPPED_IOCTL_H_
@@ -42,23 +42,26 @@
struct thread;
struct ioctl_map_entry;
-typedef int (ioctl_map_func)(struct file *, u_long, u_long, caddr_t,
+typedef int (ioctl_wrap_func)(struct file *, u_long, u_long, caddr_t,
struct thread *);
+typedef u_long (ioctl_map_func)(u_long, u_long, u_long, u_long, u_long, u_long);
struct ioctl_map_range {
u_long start;
u_long end;
u_long maptocmd;
- ioctl_map_func *func;
+ u_long maptoend;
+ ioctl_wrap_func *wrapfunc;
+ ioctl_map_func *mapfunc;
};
-#define MAPPED_IOCTL_MAPRANGE(c,e,t,f) { (c), (e), (t), (f) }
-#define MAPPED_IOCTL_MAPF(c,t,f) MAPPED_IOCTL_MAPRANGE((c), (c), (t), (f))
-#define MAPPED_IOCTL_MAP(c,t) MAPPED_IOCTL_MAPF((c), (t), NULL)
-#define MAPPED_IOCTL_IO(c,f) MAPPED_IOCTL_MAPF((c), _IO(0, 0), (f))
-#define MAPPED_IOCTL_IOR(c,f,t) MAPPED_IOCTL_MAPF((c), _IOR(0, 0, t), (f))
-#define MAPPED_IOCTL_IOW(c,f,t) MAPPED_IOCTL_MAPF((c), _IOW(0, 0, t), (f))
-#define MAPPED_IOCTL_IOWR(c,f,t) MAPPED_IOCTL_MAPF((c), _IOWR(0, 0, t), (f))
+#define MAPPED_IOCTL_MAPRANGE(c,e,t,r,f,m) { (c), (e), (t), (r), (f), (m) }
+#define MAPPED_IOCTL_MAPF(c,t,f) MAPPED_IOCTL_MAPRANGE((c), (c), (t), (t), (f), NULL)
+#define MAPPED_IOCTL_MAP(c,t) MAPPED_IOCTL_MAPF((c), (t), NULL)
+#define MAPPED_IOCTL_IO(c,f) MAPPED_IOCTL_MAPF((c), _IO(0, 0), (f))
+#define MAPPED_IOCTL_IOR(c,f,t) MAPPED_IOCTL_MAPF((c), _IOR(0, 0, t), (f))
+#define MAPPED_IOCTL_IOW(c,f,t) MAPPED_IOCTL_MAPF((c), _IOW(0, 0, t), (f))
+#define MAPPED_IOCTL_IOWR(c,f,t) MAPPED_IOCTL_MAPF((c), _IOWR(0, 0, t), (f))
struct ioctl_map {
u_long mask;
More information about the Submit
mailing list