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