The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/osfmk/i386/io_emulate.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
    3  *
    4  * @APPLE_LICENSE_HEADER_START@
    5  * 
    6  * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
    7  * 
    8  * This file contains Original Code and/or Modifications of Original Code
    9  * as defined in and that are subject to the Apple Public Source License
   10  * Version 2.0 (the 'License'). You may not use this file except in
   11  * compliance with the License. Please obtain a copy of the License at
   12  * http://www.opensource.apple.com/apsl/ and read it before using this
   13  * file.
   14  * 
   15  * The Original Code and all software distributed under the License are
   16  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
   17  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
   18  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
   19  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
   20  * Please see the License for the specific language governing rights and
   21  * limitations under the License.
   22  * 
   23  * @APPLE_LICENSE_HEADER_END@
   24  */
   25 /*
   26  * @OSF_COPYRIGHT@
   27  */
   28 /* 
   29  * Mach Operating System
   30  * Copyright (c) 1991,1990 Carnegie Mellon University
   31  * All Rights Reserved.
   32  * 
   33  * Permission to use, copy, modify and distribute this software and its
   34  * documentation is hereby granted, provided that both the copyright
   35  * notice and this permission notice appear in all copies of the
   36  * software, derivative works or modified versions, and any portions
   37  * thereof, and that both notices appear in supporting documentation.
   38  * 
   39  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
   40  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
   41  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
   42  * 
   43  * Carnegie Mellon requests users of this software to return to
   44  * 
   45  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
   46  *  School of Computer Science
   47  *  Carnegie Mellon University
   48  *  Pittsburgh PA 15213-3890
   49  * 
   50  * any improvements or extensions that they make and grant Carnegie Mellon
   51  * the rights to redistribute these changes.
   52  */
   53 /*
   54  */
   55 
   56 #include <platforms.h>
   57 #include <cpus.h>
   58 #include <mach/boolean.h>
   59 #include <mach/port.h>
   60 #include <kern/thread.h>
   61 #include <kern/task.h>
   62 
   63 #include <ipc/ipc_port.h>
   64 #include <ipc/ipc_space.h>
   65 #include <ipc/ipc_right.h>
   66 #include <ipc/ipc_object.h>
   67 #include <ipc/ipc_entry.h>
   68 
   69 #include <i386/thread.h>
   70 #include <i386/io_port.h>
   71 #include <i386/io_emulate.h>
   72 #include <i386/iopb_entries.h>
   73 
   74 int
   75 emulate_io(
   76         struct i386_saved_state *regs,
   77         int                     opcode,
   78         int                     io_port)
   79 {
   80 #if 1
   81         /* At the moment, we are not allowing I/O emulation 
   82          *
   83          * FIXME - this should probably change due to 
   84          * the Window Server's need to map I/O ports into its space.
   85          */
   86 
   87         return EM_IO_ERROR;
   88 #else
   89         thread_t        thread = current_thread();
   90         at386_io_lock_state();
   91 
   92         if (iopl_emulate(regs, opcode, io_port))
   93             return EM_IO_DONE;
   94 
   95         if (iopb_check_mapping(thread, iopl_device))
   96             return EM_IO_ERROR;
   97 
   98         /*
   99          *      Check for send rights to the IOPL device port.
  100          */
  101         if (iopl_device_port == IP_NULL)
  102             return EM_IO_ERROR;
  103         {
  104             ipc_space_t space = current_space();
  105             mach_port_name_t    name;
  106             ipc_entry_t entry;
  107             boolean_t   has_rights = FALSE;
  108             ipc_entry_bits_t *capability;
  109 
  110             is_write_lock(space);
  111             assert(space->is_active);
  112 
  113             if (ipc_right_reverse(space, (ipc_object_t) iopl_device_port,
  114                                   &name, &entry, &capability)) {
  115                 /* iopl_device_port is locked and active */
  116                 if (capability[space->server_id] & MACH_PORT_TYPE_SEND)
  117                     has_rights = TRUE;
  118                 ip_unlock(iopl_device_port);
  119             }
  120 
  121             is_write_unlock(space);
  122             if (!has_rights) {
  123                 return EM_IO_ERROR;
  124             }
  125         }
  126 
  127         /*
  128          * Map the IOPL port set into the thread.
  129          */
  130 
  131         if (i386_io_port_add(thread, iopl_device)
  132             != KERN_SUCCESS) 
  133                 return EM_IO_ERROR;
  134 
  135         /*
  136          * Make the thread use its IO_TSS to get the IO permissions;
  137          * it may not have had one before this.
  138          */
  139         act_machine_switch_pcb(thread->top_act);
  140 
  141         return EM_IO_RETRY;
  142 #endif
  143 }

Cache object: e4a2e32977041a7f00eb535c974ea107


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.