Annotation of driverkit/libDriver/Kernel/IOEthernetDebugger.m, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: /*
                     25:  * Copyright (c) 1992 NeXT Computer, Inc.
                     26:  *
                     27:  * Kernel Debugger Category for Ethernet Class.
                     28:  *
                     29:  * HISTORY
                     30:  *
                     31:  * 7 December 1992 David E. Bohman at NeXT
                     32:  *     Created.
                     33:  *
                     34:  * 29 May 1997 Dieter Siegmund at NeXT
                     35:  * - Added debugger registration call, and made
                     36:  *   en_send_pkt() and en_recv_pkt static
                     37:  */
                     38: 
                     39: #import <mach/boolean.h>
                     40: #import <mach/machine/simple_lock.h>
                     41: #import        <sys/types.h>
                     42: #import        <sys/socket.h>
                     43: #import <driverkit/IOEthernet.h>
                     44: #import <driverkit/IOEthernetPrivate.h>
                     45: #import <kern/kdp_en_debugger.h>
                     46: 
                     47: #ifndef ppc
                     48: extern int spl3();
                     49: #else
                     50: extern int splbio();
                     51: #endif
                     52: 
                     53: static id              debuggerDevice;
                     54: #ifndef sparc /* [ */
                     55: static int             savedIpl;
                     56: #ifndef ppc
                     57: int                    (*debuggerIplRoutine)() = spl3;
                     58: #else
                     59: int                    (*debuggerIplRoutine)() = splbio;
                     60: #endif
                     61: static BOOL            _kernDebuggerLocked = NO;
                     62: extern simple_lock_t   _kernDebuggerLock;
                     63: #endif sparc /* ] */
                     64: 
                     65: static void
                     66:     en_recv_pkt(
                     67:                void            *pkt,
                     68:                unsigned int    *pkt_len,
                     69:                unsigned int    timeout);
                     70: 
                     71: static void
                     72:     en_send_pkt(
                     73:                void            *pkt,
                     74:                unsigned int    pkt_len);
                     75: 
                     76: static void
                     77:     (*recvPkt_methd)(
                     78:                id, SEL,
                     79:                void *                  pkt,
                     80:                unsigned int *          pkt_len,
                     81:                unsigned int            timeout);
                     82: #define RECV_PKT_SEL           @selector(receivePacket:length:timeout:)
                     83: 
                     84: static void
                     85:     (*sendPkt_methd)(
                     86:                id, SEL,
                     87:                void *                  pkt,
                     88:                unsigned int            pkt_len);
                     89: #define SEND_PKT_SEL           @selector(sendPacket:length:)
                     90: 
                     91: #ifdef sparc
                     92: static BOOL
                     93:     (*reset_method)(
                     94:                id, SEL, 
                     95:                BOOL            enable);
                     96: #define RESET_SEL      @selector(resetAndEnable:)
                     97: #endif sparc
                     98: 
                     99: @implementation IOEthernet(EthernetDebugger)
                    100: 
                    101: - (void)registerAsDebuggerDevice
                    102: {
                    103:     if (debuggerDevice == nil) {
                    104:        /* register our debugger routines */
                    105:        kdp_register_send_receive(&en_send_pkt, &en_recv_pkt);
                    106:        (IMP)recvPkt_methd = [self methodFor:RECV_PKT_SEL];
                    107:        (IMP)sendPkt_methd = [self methodFor:SEND_PKT_SEL];
                    108: #ifndef  sparc
                    109:        if ((IMP)recvPkt_methd && (IMP)sendPkt_methd)
                    110:            debuggerDevice = self;
                    111: #else
                    112:        (IMP)reset_method = [self methodFor:RESET_SEL];
                    113:        if ((IMP)recvPkt_methd && (IMP)sendPkt_methd && (IMP)reset_method)
                    114:            debuggerDevice = self;
                    115: #endif sparc
                    116:     }
                    117: }
                    118: 
                    119: #ifndef sparc /* [ */
                    120: - (void)reserveDebuggerLock
                    121: {
                    122:     if (self == debuggerDevice) {
                    123:        if (_kernDebuggerLocked) {
                    124:            IOLog("reserveDebuggerLock: already locked\n");
                    125:            return;
                    126:        }
                    127:        savedIpl = (*debuggerIplRoutine)();
                    128:        simple_lock(_kernDebuggerLock);
                    129:        _kernDebuggerLocked = YES;
                    130:     }
                    131: }
                    132: 
                    133: - (void)releaseDebuggerLock
                    134: {
                    135:     if (self == debuggerDevice) {
                    136:        if (!_kernDebuggerLocked) {
                    137:            return;
                    138:        }
                    139:        simple_unlock(_kernDebuggerLock);
                    140:        _kernDebuggerLocked = NO;
                    141:        splx(savedIpl);
                    142:     }
                    143: }
                    144: 
                    145: #endif sparc /* ] */
                    146: @end
                    147: 
                    148: #ifndef sparc /* [ */
                    149: void reserveDebuggerLock(id debuggerDeviceObject)
                    150: {
                    151:     if (debuggerDeviceObject == debuggerDevice) {
                    152:        if (_kernDebuggerLocked) {
                    153:            IOLog("reserveDebuggerLock: already locked\n");
                    154:            return;
                    155:        }
                    156:        simple_lock(_kernDebuggerLock);
                    157:        _kernDebuggerLocked = YES;
                    158:     }
                    159: }
                    160: 
                    161: void releaseDebuggerLock(id debuggerDeviceObject)
                    162: {
                    163:     if (debuggerDeviceObject == debuggerDevice) {
                    164:        if (!_kernDebuggerLocked) {
                    165:            return;
                    166:        }
                    167:        simple_unlock(_kernDebuggerLock);
                    168:        _kernDebuggerLocked = NO;
                    169:     }
                    170: }
                    171: 
                    172: #endif sparc /* ] */
                    173: 
                    174: static void
                    175: en_recv_pkt(
                    176:     void               *pkt,
                    177:     unsigned int       *pkt_len,
                    178:     unsigned int       timeout
                    179: )
                    180: {
                    181:     *pkt_len = 0;
                    182:     
                    183:     if (debuggerDevice)
                    184:        (*recvPkt_methd)(debuggerDevice, RECV_PKT_SEL, pkt, pkt_len, timeout);    
                    185: }
                    186: 
                    187: static void
                    188: en_send_pkt(
                    189:     void               *pkt,
                    190:     unsigned int       pkt_len
                    191: )
                    192: {
                    193:     if (debuggerDevice)
                    194:        (*sendPkt_methd)(debuggerDevice, SEND_PKT_SEL, pkt, pkt_len);
                    195: }
                    196: 
                    197: #ifdef sparc 
                    198: void
                    199: en_reset(
                    200:     BOOL       enable
                    201: )
                    202: {
                    203:     if (debuggerDevice)
                    204:        (*reset_method)(debuggerDevice, RESET_SEL, enable);    
                    205: }
                    206: #endif sparc

unix.superglobalmegacorp.com

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