Annotation of Gnu-Mach/device/io_req.h, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie Mellon
                     24:  * the rights to redistribute these changes.
                     25:  */
                     26: /*
                     27:  *     Author: David B. Golub, Carnegie Mellon University
                     28:  *     Date:   10/88
                     29:  */
                     30: 
                     31: #ifndef        _IO_REQ_
                     32: #define        _IO_REQ_
                     33: 
                     34: #include <mach/boolean.h>
                     35: #include <mach/port.h>
                     36: #include <mach/message.h>
                     37: #include <mach/vm_param.h>
                     38: #include <kern/kalloc.h>
                     39: #include <kern/lock.h>
                     40: #include <vm/vm_page.h>
                     41: #include <device/device_types.h>
                     42: #include <device/dev_hdr.h>
                     43: 
                     44: #include <kern/macro_help.h>
                     45: 
                     46: /*
                     47:  * IO request element, queued on device for delayed replies.
                     48:  */
                     49: struct io_req {
                     50:        struct io_req * io_next;        /* next, ... */
                     51:        struct io_req * io_prev;        /* prev pointers: link in done,
                     52:                                           defered, or in-progress list */
                     53:        mach_device_t   io_device;      /* pointer to open-device structure */
                     54:        char *          io_dev_ptr;     /* pointer to driver structure -
                     55:                                           filled in by driver if necessary */
                     56:        int             io_unit;        /* unit number ('minor') of device */
                     57:        int             io_op;          /* IO operation */
                     58:        dev_mode_t      io_mode;        /* operation mode (wait, truncate) */
                     59:        recnum_t        io_recnum;      /* starting record number for
                     60:                                           random-access devices */
                     61: 
                     62:        union io_un {
                     63:            io_buf_ptr_t    data;       /* data, for IO requests */
                     64:        } io_un;
                     65: #define        io_data         io_un.data
                     66: 
                     67:        long            io_count;       /* amount requested */
                     68:        long            io_alloc_size;  /* amount allocated */
                     69:        long            io_residual;    /* amount NOT done */
                     70:        io_return_t     io_error;       /* error code */
                     71:        boolean_t       (*io_done)();   /* call when done - returns TRUE
                     72:                                           if IO really finished */
                     73:        struct ipc_port *io_reply_port; /* reply port, for asynchronous
                     74:                                           messages */
                     75:        mach_msg_type_name_t io_reply_port_type;
                     76:                                        /* send or send-once right? */
                     77:        struct io_req * io_link;        /* forward link (for driver header) */
                     78:        struct io_req * io_rlink;       /* reverse link (for driver header) */
                     79:        vm_map_copy_t   io_copy;        /* vm_map_copy obj. for this op. */
                     80:        long            io_total;       /* total op size, for write */
                     81:        decl_simple_lock_data(,io_req_lock)
                     82:                                        /* Lock for this structure */
                     83:        long            io_physrec;    /* mapping to the physical block
                     84:                                           number */
                     85:        long            io_rectotal;   /* total number of blocks to move */
                     86: };
                     87: typedef struct io_req *        io_req_t;
                     88: 
                     89: /*
                     90:  * LOCKING NOTE: Operations on io_req's are in general single threaded by
                     91:  * the invoking code, obviating the need for a lock.  The usual IO_CALL
                     92:  * path through the code is: Initiating thread hands io_req to device driver,
                     93:  * driver passes it to io_done thread, io_done thread sends reply message.  No
                     94:  * locking is needed in this sequence.  Unfortunately, a synchronous wait
                     95:  * for a buffer requires a lock to avoid problems if the wait and interrupt
                     96:  * happen simultaneously on different processors.
                     97:  */
                     98: 
                     99: #define ior_lock(ior)  simple_lock(&(ior)->io_req_lock)
                    100: #define ior_unlock(ior)        simple_unlock(&(ior)->io_req_lock)
                    101: 
                    102: /*
                    103:  * Flags and operations
                    104:  */
                    105: 
                    106: #define        IO_WRITE        0x00000000      /* operation is write */
                    107: #define        IO_READ         0x00000001      /* operation is read */
                    108: #define        IO_OPEN         0x00000002      /* operation is open */
                    109: #define        IO_DONE         0x00000100      /* operation complete */
                    110: #define        IO_ERROR        0x00000200      /* error on operation */
                    111: #define        IO_BUSY         0x00000400      /* operation in progress */
                    112: #define        IO_WANTED       0x00000800      /* wakeup when no longer BUSY */
                    113: #define        IO_BAD          0x00001000      /* bad disk block */
                    114: #define        IO_CALL         0x00002000      /* call io_done_thread when done */
                    115: #define IO_INBAND      0x00004000      /* mig call was inband */
                    116: #define IO_INTERNAL    0x00008000      /* internal, device-driver specific */
                    117: #define        IO_LOANED       0x00010000      /* ior loaned by another module */
                    118: 
                    119: #define        IO_SPARE_START  0x00020000      /* start of spare flags */
                    120: 
                    121: /*
                    122:  * Standard completion routine for io_requests.
                    123:  */
                    124: void   iodone(/* io_req_t */);
                    125: 
                    126: /*
                    127:  * Macros to allocate and free IORs - will convert to zones later.
                    128:  */
                    129: #define        io_req_alloc(ior,size)                                  \
                    130:        MACRO_BEGIN                                             \
                    131:        (ior) = (io_req_t)kalloc(sizeof(struct io_req));        \
                    132:        simple_lock_init(&(ior)->io_req_lock);                  \
                    133:        MACRO_END
                    134: 
                    135: #define        io_req_free(ior)                                        \
                    136:        (kfree((vm_offset_t)(ior), sizeof(struct io_req)))
                    137: 
                    138: 
                    139: zone_t io_inband_zone; /* for inband reads */
                    140: 
                    141: #endif _IO_REQ_

unix.superglobalmegacorp.com

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