Annotation of Gnu-Mach/i386/i386at/i386at_ds_routines.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach device server routines (i386at version).
                      3:  *
                      4:  * Copyright (c) 1996 The University of Utah and
                      5:  * the Computer Systems Laboratory at the University of Utah (CSL).
                      6:  * All rights reserved.
                      7:  *
                      8:  * Permission to use, copy, modify and distribute this software is hereby
                      9:  * granted provided that (1) source code retains these copyright, permission,
                     10:  * and disclaimer notices, and (2) redistributions including binaries
                     11:  * reproduce the notices in supporting documentation, and (3) all advertising
                     12:  * materials mentioning features or use of this software display the following
                     13:  * acknowledgement: ``This product includes software developed by the
                     14:  * Computer Systems Laboratory at the University of Utah.''
                     15:  *
                     16:  * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
                     17:  * IS" CONDITION.  THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
                     18:  * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     19:  *
                     20:  * CSL requests users of this software to return to [email protected] any
                     21:  * improvements that they make and grant CSL redistribution rights.
                     22:  *
                     23:  *      Author: Shantanu Goel, University of Utah CSL
                     24:  */
                     25: 
                     26: #include <mach/boolean.h>
                     27: #include <mach/kern_return.h>
                     28: #include <mach/mig_errors.h>
                     29: #include <mach/port.h>
                     30: #include <mach/notify.h>
                     31: 
                     32: #include <device/device_types.h>
                     33: #include <device/device_port.h>
                     34: #include "device_interface.h"
                     35: 
                     36: #include <i386at/dev_hdr.h>
                     37: #include <i386at/device_emul.h>
                     38: #include <i386/device-drivers.h>
                     39: 
                     40: extern struct device_emulation_ops mach_device_emulation_ops;
                     41: #ifdef LINUX_DEV
                     42: extern struct device_emulation_ops linux_block_emulation_ops;
                     43: #ifdef CONFIG_INET
                     44: extern struct device_emulation_ops linux_net_emulation_ops;
                     45: #endif
                     46: #endif
                     47: 
                     48: /* List of emulations.  */
                     49: static struct device_emulation_ops *emulation_list[] =
                     50: {
                     51: #ifdef LINUX_DEV
                     52:   &linux_block_emulation_ops,
                     53: #ifdef CONFIG_INET
                     54:   &linux_net_emulation_ops,
                     55: #endif
                     56: #endif
                     57:   &mach_device_emulation_ops,
                     58: };
                     59: 
                     60: #define NUM_EMULATION (sizeof (emulation_list) / sizeof (emulation_list[0]))
                     61: 
                     62: io_return_t
                     63: ds_device_open (ipc_port_t open_port, ipc_port_t reply_port,
                     64:                mach_msg_type_name_t reply_port_type, dev_mode_t mode,
                     65:                char *name, device_t *devp)
                     66: {
                     67:   int i;
                     68:   device_t dev;
                     69:   io_return_t err;
                     70: 
                     71:   /* Open must be called on the master device port.  */
                     72:   if (open_port != master_device_port)
                     73:     return D_INVALID_OPERATION;
                     74: 
                     75:   /* There must be a reply port.  */
                     76:   if (! IP_VALID (reply_port))
                     77:     {
                     78:       printf ("ds_* invalid reply port\n");
                     79:       Debugger ("ds_* reply_port");
                     80:       return MIG_NO_REPLY;
                     81:     }
                     82: 
                     83:   /* Call each emulation's open routine to find the device.  */
                     84:   for (i = 0; i < NUM_EMULATION; i++)
                     85:     {
                     86:       err = (*emulation_list[i]->open) (reply_port, reply_port_type,
                     87:                                        mode, name, devp);
                     88:       if (err != D_NO_SUCH_DEVICE)
                     89:        break;
                     90:     }
                     91: 
                     92:   return err;
                     93: }
                     94: 
                     95: io_return_t
                     96: ds_device_close (device_t dev)
                     97: {
                     98:   if (dev == DEVICE_NULL)
                     99:     return D_NO_SUCH_DEVICE;
                    100:   return (dev->emul_ops->close
                    101:          ? (*dev->emul_ops->close) (dev->emul_data)
                    102:          : D_SUCCESS);
                    103: }
                    104: 
                    105: io_return_t
                    106: ds_device_write (device_t dev, ipc_port_t reply_port,
                    107:                 mach_msg_type_name_t reply_port_type, dev_mode_t mode,
                    108:                 recnum_t recnum, io_buf_ptr_t data, unsigned int count,
                    109:                 int *bytes_written)
                    110: {
                    111:   if (dev == DEVICE_NULL)
                    112:     return D_NO_SUCH_DEVICE;
                    113:   if (! data)
                    114:     return D_INVALID_SIZE;
                    115:   if (! dev->emul_ops->write)
                    116:     return D_INVALID_OPERATION;
                    117:   return (*dev->emul_ops->write) (dev->emul_data, reply_port,
                    118:                                  reply_port_type, mode, recnum,
                    119:                                  data, count, bytes_written);
                    120: }
                    121: 
                    122: io_return_t
                    123: ds_device_write_inband (device_t dev, ipc_port_t reply_port,
                    124:                        mach_msg_type_name_t reply_port_type,
                    125:                        dev_mode_t mode, recnum_t recnum,
                    126:                        io_buf_ptr_inband_t data, unsigned count,
                    127:                        int *bytes_written)
                    128: {
                    129:   if (dev == DEVICE_NULL)
                    130:     return D_NO_SUCH_DEVICE;
                    131:   if (! data)
                    132:     return D_INVALID_SIZE;
                    133:   if (! dev->emul_ops->write_inband)
                    134:     return D_INVALID_OPERATION;
                    135:   return (*dev->emul_ops->write_inband) (dev->emul_data, reply_port,
                    136:                                         reply_port_type, mode, recnum,
                    137:                                         data, count, bytes_written);
                    138: }
                    139: 
                    140: io_return_t
                    141: ds_device_read (device_t dev, ipc_port_t reply_port,
                    142:                mach_msg_type_name_t reply_port_type, dev_mode_t mode,
                    143:                recnum_t recnum, int count, io_buf_ptr_t *data,
                    144:                unsigned *bytes_read)
                    145: {
                    146:   if (dev == DEVICE_NULL)
                    147:     return D_NO_SUCH_DEVICE;
                    148:   if (! dev->emul_ops->read)
                    149:     return D_INVALID_OPERATION;
                    150:   return (*dev->emul_ops->read) (dev->emul_data, reply_port,
                    151:                                 reply_port_type, mode, recnum,
                    152:                                 count, data, bytes_read);
                    153: }
                    154: 
                    155: io_return_t
                    156: ds_device_read_inband (device_t dev, ipc_port_t reply_port,
                    157:                       mach_msg_type_name_t reply_port_type, dev_mode_t mode,
                    158:                       recnum_t recnum, int count, char *data,
                    159:                       unsigned *bytes_read)
                    160: {
                    161:   if (dev == DEVICE_NULL)
                    162:     return D_NO_SUCH_DEVICE;
                    163:   if (! dev->emul_ops->read_inband)
                    164:     return D_INVALID_OPERATION;
                    165:   return (*dev->emul_ops->read_inband) (dev->emul_data, reply_port,
                    166:                                        reply_port_type, mode, recnum,
                    167:                                        count, data, bytes_read);
                    168: }
                    169: 
                    170: io_return_t
                    171: ds_device_set_status (device_t dev, dev_flavor_t flavor,
                    172:                      dev_status_t status, mach_msg_type_number_t status_count)
                    173: {
                    174:   if (dev == DEVICE_NULL)
                    175:     return D_NO_SUCH_DEVICE;
                    176:   if (! dev->emul_ops->set_status)
                    177:     return D_INVALID_OPERATION;
                    178: 
                    179:   return (*dev->emul_ops->set_status) (dev->emul_data, flavor, status,
                    180:                                       status_count);
                    181: }
                    182: 
                    183: io_return_t
                    184: ds_device_get_status (device_t dev, dev_flavor_t flavor, dev_status_t status,
                    185:                      mach_msg_type_number_t *status_count)
                    186: {
                    187:   if (dev == DEVICE_NULL)
                    188:     return D_NO_SUCH_DEVICE;
                    189:   if (! dev->emul_ops->get_status)
                    190:     return D_INVALID_OPERATION;
                    191: 
                    192:   return (*dev->emul_ops->get_status) (dev->emul_data, flavor, status,
                    193:                                       status_count);
                    194: }
                    195: 
                    196: io_return_t
                    197: ds_device_set_filter (device_t dev, ipc_port_t receive_port, int priority,
                    198:                      filter_t *filter, unsigned filter_count)
                    199: {
                    200:   if (dev == DEVICE_NULL)
                    201:     return D_NO_SUCH_DEVICE;
                    202:   if (! dev->emul_ops->set_filter)
                    203:     return D_INVALID_OPERATION;
                    204:   return (*dev->emul_ops->set_filter) (dev->emul_data, receive_port,
                    205:                                       priority, filter, filter_count);
                    206: }
                    207: 
                    208: io_return_t
                    209: ds_device_map (device_t dev, vm_prot_t prot, vm_offset_t offset,
                    210:               vm_size_t size, ipc_port_t *pager, boolean_t unmap)
                    211: {
                    212:   if (dev == DEVICE_NULL)
                    213:     return D_NO_SUCH_DEVICE;
                    214:   if (! dev->emul_ops->map)
                    215:     return D_INVALID_OPERATION;
                    216:   return (*dev->emul_ops->map) (dev->emul_data, prot,
                    217:                                offset, size, pager, unmap);
                    218: }
                    219: 
                    220: boolean_t
                    221: ds_notify (mach_msg_header_t *msg)
                    222: {
                    223:   if (msg->msgh_id == MACH_NOTIFY_NO_SENDERS)
                    224:     {
                    225:       device_t dev;
                    226:       mach_no_senders_notification_t *ns;
                    227: 
                    228:       ns = (mach_no_senders_notification_t *) msg;
                    229:       dev = (device_t) ns->not_header.msgh_remote_port;
                    230:       if (dev->emul_ops->no_senders)
                    231:        (*dev->emul_ops->no_senders) (ns);
                    232:       return TRUE;
                    233:     }
                    234: 
                    235:   printf ("ds_notify: strange notification %d\n", msg->msgh_id);
                    236:   return FALSE;
                    237: }
                    238: 
                    239: io_return_t
                    240: ds_device_write_trap (device_t dev, dev_mode_t mode,
                    241:                      recnum_t recnum, vm_offset_t data, vm_size_t count)
                    242: {
                    243:   if (dev == DEVICE_NULL)
                    244:     return D_NO_SUCH_DEVICE;
                    245:   if (! dev->emul_ops->write_trap)
                    246:     return D_INVALID_OPERATION;
                    247:   return (*dev->emul_ops->write_trap) (dev->emul_data,
                    248:                                       mode, recnum, data, count);
                    249: }
                    250: 
                    251: io_return_t
                    252: ds_device_writev_trap (device_t dev, dev_mode_t mode,
                    253:                       recnum_t recnum, io_buf_vec_t *iovec, vm_size_t count)
                    254: {
                    255:   if (dev == DEVICE_NULL)
                    256:     return D_NO_SUCH_DEVICE;
                    257:   if (! dev->emul_ops->writev_trap)
                    258:     return D_INVALID_OPERATION;
                    259:   return (*dev->emul_ops->writev_trap) (dev->emul_data,
                    260:                                        mode, recnum, iovec, count);
                    261: }
                    262: 
                    263: void
                    264: device_reference (device_t dev)
                    265: {
                    266:   if (dev->emul_ops->reference)
                    267:     (*dev->emul_ops->reference) (dev->emul_data);
                    268: }
                    269: 
                    270: void
                    271: device_deallocate (device_t dev)
                    272: {
                    273:   if (dev->emul_ops->dealloc)
                    274:     (*dev->emul_ops->dealloc) (dev->emul_data);
                    275: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.