1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * 32bit -> 64bit ioctl wrapper for raw MIDI API
4 * Copyright (c) by Takashi Iwai <tiwai@suse.de>
7 /* This file included from rawmidi.c */
9 #include <linux/compat.h>
11 struct snd_rawmidi_params32
{
15 unsigned int no_active_sensing
; /* avoid bit-field */
17 unsigned char reserved
[12];
18 } __attribute__((packed
));
20 static int snd_rawmidi_ioctl_params_compat(struct snd_rawmidi_file
*rfile
,
21 struct snd_rawmidi_params32 __user
*src
)
23 struct snd_rawmidi_params params
;
26 if (get_user(params
.stream
, &src
->stream
) ||
27 get_user(params
.buffer_size
, &src
->buffer_size
) ||
28 get_user(params
.avail_min
, &src
->avail_min
) ||
29 get_user(params
.mode
, &src
->mode
) ||
30 get_user(val
, &src
->no_active_sensing
))
32 params
.no_active_sensing
= val
;
33 switch (params
.stream
) {
34 case SNDRV_RAWMIDI_STREAM_OUTPUT
:
37 return snd_rawmidi_output_params(rfile
->output
, ¶ms
);
38 case SNDRV_RAWMIDI_STREAM_INPUT
:
41 return snd_rawmidi_input_params(rfile
->input
, ¶ms
);
46 struct compat_snd_rawmidi_status64
{
48 u8 rsvd
[4]; /* alignment */
53 unsigned char reserved
[16];
54 } __attribute__((packed
));
56 static int snd_rawmidi_ioctl_status_compat64(struct snd_rawmidi_file
*rfile
,
57 struct compat_snd_rawmidi_status64 __user
*src
)
60 struct snd_rawmidi_status64 status
;
61 struct compat_snd_rawmidi_status64 compat_status
;
63 if (get_user(status
.stream
, &src
->stream
))
66 switch (status
.stream
) {
67 case SNDRV_RAWMIDI_STREAM_OUTPUT
:
70 err
= snd_rawmidi_output_status(rfile
->output
, &status
);
72 case SNDRV_RAWMIDI_STREAM_INPUT
:
75 err
= snd_rawmidi_input_status(rfile
->input
, &status
);
83 compat_status
= (struct compat_snd_rawmidi_status64
) {
84 .stream
= status
.stream
,
85 .tstamp_sec
= status
.tstamp_sec
,
86 .tstamp_nsec
= status
.tstamp_nsec
,
87 .avail
= status
.avail
,
88 .xruns
= status
.xruns
,
91 if (copy_to_user(src
, &compat_status
, sizeof(*src
)))
98 SNDRV_RAWMIDI_IOCTL_PARAMS32
= _IOWR('W', 0x10, struct snd_rawmidi_params32
),
99 SNDRV_RAWMIDI_IOCTL_STATUS_COMPAT32
= _IOWR('W', 0x20, struct snd_rawmidi_status32
),
100 SNDRV_RAWMIDI_IOCTL_STATUS_COMPAT64
= _IOWR('W', 0x20, struct compat_snd_rawmidi_status64
),
103 static long snd_rawmidi_ioctl_compat(struct file
*file
, unsigned int cmd
, unsigned long arg
)
105 struct snd_rawmidi_file
*rfile
;
106 void __user
*argp
= compat_ptr(arg
);
108 rfile
= file
->private_data
;
110 case SNDRV_RAWMIDI_IOCTL_PVERSION
:
111 case SNDRV_RAWMIDI_IOCTL_INFO
:
112 case SNDRV_RAWMIDI_IOCTL_DROP
:
113 case SNDRV_RAWMIDI_IOCTL_DRAIN
:
114 return snd_rawmidi_ioctl(file
, cmd
, (unsigned long)argp
);
115 case SNDRV_RAWMIDI_IOCTL_PARAMS32
:
116 return snd_rawmidi_ioctl_params_compat(rfile
, argp
);
117 case SNDRV_RAWMIDI_IOCTL_STATUS_COMPAT32
:
118 return snd_rawmidi_ioctl_status32(rfile
, argp
);
119 case SNDRV_RAWMIDI_IOCTL_STATUS_COMPAT64
:
120 return snd_rawmidi_ioctl_status_compat64(rfile
, argp
);