Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-1-5]: src/sys/compat/linux/common Pull up revisions 1.6-1.8 (requ...
details: https://anonhg.NetBSD.org/src/rev/82895588b7a4
branches: netbsd-1-5
changeset: 490987:82895588b7a4
user: he <he%NetBSD.org@localhost>
date: Fri Mar 30 21:37:59 2001 +0000
description:
Pull up revisions 1.6-1.8 (requested by fvdl):
Add some required Linux emulation bits to support the Linux
version of VMware.
diffstat:
sys/compat/linux/common/linux_cdrom.c | 297 ++++++++++++++++++++-------------
1 files changed, 181 insertions(+), 116 deletions(-)
diffs (truncated from 490 to 300 lines):
diff -r 89845f72d546 -r 82895588b7a4 sys/compat/linux/common/linux_cdrom.c
--- a/sys/compat/linux/common/linux_cdrom.c Fri Mar 30 21:37:26 2001 +0000
+++ b/sys/compat/linux/common/linux_cdrom.c Fri Mar 30 21:37:59 2001 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_cdrom.c,v 1.5 1999/10/29 15:02:56 mycroft Exp $ */
+/* $NetBSD: linux_cdrom.c,v 1.5.6.1 2001/03/30 21:37:59 he Exp $ */
/*
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -53,12 +53,39 @@
#include <compat/linux/linux_syscallargs.h>
+static int bsd_to_linux_msf_lba(unsigned address_format, union msf_lba *bml,
+ union linux_cdrom_addr *llml);
+
#if 0
#define DPRINTF(x) printf x
#else
#define DPRINTF(x)
#endif
+/*
+ * XXX from dev/scsipi/cd.c
+ */
+#define MAXTRACK 99
+
+static int
+bsd_to_linux_msf_lba(unsigned address_format, union msf_lba *bml,
+ union linux_cdrom_addr *llml)
+{
+ switch (address_format) {
+ case CD_LBA_FORMAT:
+ llml->lba = bml->lba;
+ break;
+ case CD_MSF_FORMAT:
+ llml->msf.minute = bml->msf.minute;
+ llml->msf.second = bml->msf.second;
+ llml->msf.frame = bml->msf.frame;
+ break;
+ default:
+ return -1;
+ }
+ return 0;
+}
+
int
linux_ioctl_cdrom(p, uap, retval)
struct proc *p;
@@ -83,6 +110,7 @@
struct linux_cdrom_tocentry l_tocentry;
struct linux_cdrom_subchnl l_subchnl;
struct linux_cdrom_volctrl l_volctrl;
+ struct linux_cdrom_multisession l_session;
struct ioc_play_blocks t_blocks;
struct ioc_play_msf t_msf;
@@ -99,18 +127,21 @@
fdp = p->p_fd;
if ((u_int)SCARG(uap, fd) >= fdp->fd_nfiles ||
- (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL)
+ (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL ||
+ (fp->f_iflags & FIF_WANTCLOSE) != 0)
return (EBADF);
+ FILE_USE(fp);
+
com = SCARG(uap, com);
ioctlf = fp->f_ops->fo_ioctl;
- retval[0] = 0;
+ retval[0] = error = 0;
switch(com) {
case LINUX_CDROMPLAYMSF:
error = copyin(SCARG(uap, data), &l_msf, sizeof l_msf);
if (error)
- return error;
+ break;
t_msf.start_m = l_msf.cdmsf_min0;
t_msf.start_s = l_msf.cdmsf_sec0;
@@ -119,35 +150,38 @@
t_msf.end_s = l_msf.cdmsf_sec1;
t_msf.end_f = l_msf.cdmsf_frame1;
- return ioctlf(fp, CDIOCPLAYMSF, (caddr_t)&t_msf, p);
+ error = ioctlf(fp, CDIOCPLAYMSF, (caddr_t)&t_msf, p);
+ break;
case LINUX_CDROMPLAYTRKIND:
error = copyin(SCARG(uap, data), &l_ti, sizeof l_ti);
if (error)
- return error;
+ break;
t_track.start_track = l_ti.cdti_trk0;
t_track.start_index = l_ti.cdti_ind0;
t_track.end_track = l_ti.cdti_trk1;
t_track.end_index = l_ti.cdti_ind1;
- return ioctlf(fp, CDIOCPLAYTRACKS, (caddr_t)&t_track, p);
+ error = ioctlf(fp, CDIOCPLAYTRACKS, (caddr_t)&t_track, p);
+ break;
case LINUX_CDROMREADTOCHDR:
error = ioctlf(fp, CDIOREADTOCHEADER, (caddr_t)&t_header, p);
if (error)
- return error;
+ break;
l_tochdr.cdth_trk0 = t_header.starting_track;
l_tochdr.cdth_trk1 = t_header.ending_track;
- return copyout(&l_tochdr, SCARG(uap, data), sizeof l_tochdr);
+ error = copyout(&l_tochdr, SCARG(uap, data), sizeof l_tochdr);
+ break;
case LINUX_CDROMREADTOCENTRY:
error = copyin(SCARG(uap, data), &l_tocentry,
sizeof l_tocentry);
if (error)
- return error;
+ break;
sg = stackgap_init(p->p_emul);
entry = stackgap_alloc(&sg, sizeof *entry);
@@ -156,71 +190,64 @@
t_toc_entry.data_len = sizeof *entry;
t_toc_entry.data = entry;
- error = ioctlf(fp, CDIOREADTOCENTRYS, (caddr_t)&t_toc_entry,
+ error = ioctlf(fp, CDIOREADTOCENTRIES, (caddr_t)&t_toc_entry,
p);
if (error)
- return error;
+ break;
error = copyin(entry, &t_entry, sizeof t_entry);
if (error)
- return error;
+ break;
l_tocentry.cdte_adr = t_entry.addr_type;
l_tocentry.cdte_ctrl = t_entry.control;
- switch (t_toc_entry.address_format) {
- case CD_LBA_FORMAT:
- l_tocentry.cdte_addr.lba = t_entry.addr.lba;
+ if (bsd_to_linux_msf_lba(t_entry.addr_type, &t_entry.addr,
+ &l_tocentry.cdte_addr) < 0) {
+ printf("linux_ioctl: unknown format msf/lba\n");
+ error = EINVAL;
break;
- case CD_MSF_FORMAT:
- l_tocentry.cdte_addr.msf.minute =
- t_entry.addr.msf.minute;
- l_tocentry.cdte_addr.msf.second =
- t_entry.addr.msf.second;
- l_tocentry.cdte_addr.msf.frame =
- t_entry.addr.msf.frame;
- break;
- default:
- printf("linux_ioctl: unknown format msf/lba\n");
- return EINVAL;
}
- return copyout(&l_tocentry, SCARG(uap, data),
+ error = copyout(&l_tocentry, SCARG(uap, data),
sizeof l_tocentry);
+ break;
case LINUX_CDROMVOLCTRL:
error = copyin(SCARG(uap, data), &l_volctrl, sizeof l_volctrl);
if (error)
- return error;
+ break;
t_vol.vol[0] = l_volctrl.channel0;
t_vol.vol[1] = l_volctrl.channel1;
t_vol.vol[2] = l_volctrl.channel2;
t_vol.vol[3] = l_volctrl.channel3;
- return ioctlf(fp, CDIOCSETVOL, (caddr_t)&t_vol, p);
+ error = ioctlf(fp, CDIOCSETVOL, (caddr_t)&t_vol, p);
+ break;
case LINUX_CDROMVOLREAD:
error = ioctlf(fp, CDIOCGETVOL, (caddr_t)&t_vol, p);
if (error)
- return error;
+ break;
l_volctrl.channel0 = t_vol.vol[0];
l_volctrl.channel1 = t_vol.vol[1];
l_volctrl.channel2 = t_vol.vol[2];
l_volctrl.channel3 = t_vol.vol[3];
- return copyout(&l_volctrl, SCARG(uap, data), sizeof l_volctrl);
+ error = copyout(&l_volctrl, SCARG(uap, data), sizeof l_volctrl);
+ break;
case LINUX_CDROMSUBCHNL:
error = copyin(SCARG(uap, data), &l_subchnl, sizeof l_subchnl);
if (error)
- return error;
-
+ break;
+
sg = stackgap_init(p->p_emul);
info = stackgap_alloc(&sg, sizeof *info);
- t_subchannel.address_format = l_subchnl.cdsc_format;
- t_subchannel.data_format = CD_CURRENT_POSITION;
- t_subchannel.track = l_subchnl.cdsc_trk;
+ t_subchannel.address_format = CD_MSF_FORMAT;
+ t_subchannel.track = 0;
+ t_subchannel.data_format = l_subchnl.cdsc_format;
t_subchannel.data_len = sizeof *info;
t_subchannel.data = info;
DPRINTF(("linux_ioctl: CDROMSUBCHNL %d %d\n",
@@ -229,153 +256,191 @@
error = ioctlf(fp, CDIOCREADSUBCHANNEL, (caddr_t)&t_subchannel,
p);
if (error)
- return error;
+ break;
error = copyin(info, &t_info, sizeof t_info);
if (error)
- return error;
+ break;
- l_subchnl.cdsc_audiostatus = t_info.header.audio_status;
- l_subchnl.cdsc_adr = t_info.what.position.addr_type;
- l_subchnl.cdsc_ctrl = t_info.what.position.control;
- l_subchnl.cdsc_ind = t_info.what.position.index_number;
+ l_subchnl.cdsc_audiostatus = t_info.header.audio_status;
+ l_subchnl.cdsc_adr = t_info.what.position.addr_type;
+ l_subchnl.cdsc_ctrl = t_info.what.position.control;
+ l_subchnl.cdsc_ind = t_info.what.position.index_number;
- DPRINTF(("linux_ioctl: CDIOCREADSUBCHANNEL %d %d %d\n",
- t_info.header.audio_status,
- t_info.header.data_len[0],
- t_info.header.data_len[1]));
- DPRINTF(("(more) %d %d %d %d %d\n",
- t_info.what.position.data_format,
- t_info.what.position.control,
- t_info.what.position.addr_type,
- t_info.what.position.track_number,
- t_info.what.position.index_number));
+ DPRINTF(("linux_ioctl: CDIOCREADSUBCHANNEL %d %d %d\n",
+ t_info.header.audio_status,
+ t_info.header.data_len[0],
+ t_info.header.data_len[1]));
+ DPRINTF(("(more) %d %d %d %d %d\n",
+ t_info.what.position.data_format,
+ t_info.what.position.control,
+ t_info.what.position.addr_type,
+ t_info.what.position.track_number,
+ t_info.what.position.index_number));
- switch (t_subchannel.address_format) {
- case CD_LBA_FORMAT:
- l_subchnl.cdsc_absaddr.lba =
- t_info.what.position.absaddr.lba;
- l_subchnl.cdsc_reladdr.lba =
- t_info.what.position.reladdr.lba;
- DPRINTF(("LBA: %d %d\n",
- t_info.what.position.absaddr.lba,
- t_info.what.position.reladdr.lba));
- break;
-
- case CD_MSF_FORMAT:
- l_subchnl.cdsc_absaddr.msf.minute =
- t_info.what.position.absaddr.msf.minute;
- l_subchnl.cdsc_absaddr.msf.second =
- t_info.what.position.absaddr.msf.second;
- l_subchnl.cdsc_absaddr.msf.frame =
- t_info.what.position.absaddr.msf.frame;
+ if (bsd_to_linux_msf_lba(t_subchannel.address_format,
+ &t_info.what.position.absaddr,
+ &l_subchnl.cdsc_absaddr) < 0 ||
+ bsd_to_linux_msf_lba(t_subchannel.address_format,
+ &t_info.what.position.reladdr,
+ &l_subchnl.cdsc_reladdr) < 0) {
+ DPRINTF(("linux_ioctl: unknown format msf/lba\n"));
+ error = EINVAL;
+ break;
+ }
- l_subchnl.cdsc_reladdr.msf.minute =
- t_info.what.position.reladdr.msf.minute;
- l_subchnl.cdsc_reladdr.msf.second =
- t_info.what.position.reladdr.msf.second;
- l_subchnl.cdsc_reladdr.msf.frame =
- t_info.what.position.reladdr.msf.frame;
- DPRINTF(("MSF: %d %d %d %d\n",
- t_info.what.position.absaddr.msf.minute,
- t_info.what.position.absaddr.msf.second,
- t_info.what.position.reladdr.msf.minute,
Home |
Main Index |
Thread Index |
Old Index