Annotation of XNU/iokit/IOKit/network/IOKernelDebugger.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  * Copyright (c) 1999 Apple Computer, Inc.  All rights reserved. 
        !            24:  *
        !            25:  * IOKernelDebugger.cpp
        !            26:  *
        !            27:  * HISTORY
        !            28:  *
        !            29:  */
        !            30: 
        !            31: #ifndef _IOKERNELDEBUGGER_H
        !            32: #define _IOKERNELDEBUGGER_H
        !            33: 
        !            34: // #define __USE_DEBUGGER_LOCK  1    // XXX - not yet!!!
        !            35: 
        !            36: #include <IOKit/IOService.h>
        !            37: 
        !            38: 
        !            39: /*! @typedef IODebuggerRxHandler
        !            40:     @discussion Defines the receive handler that must be implemented
        !            41:     by the provider to service KDP requests. This handler is called
        !            42:     by the dispatch function in IOKernelDebugger.
        !            43:     @param provider The provider object.
        !            44:     @param buffer KDP receive buffer. The buffer allocated has room for
        !            45:            1518 bytes. Never overflow the buffer!
        !            46:     @param length The amount of data placed into the receive buffer
        !            47:            by teh receive handler. Set to 0 if no frame was received
        !            48:            during the poll interval.
        !            49:     @param timeout Poll for a maximum period of 'timeout' milliseconds
        !            50:            while waiting for a frame to arrive. */
        !            51: 
        !            52: typedef void (*IODebuggerRxHandler)(IOService * provider,
        !            53:                                     void *      buffer,
        !            54:                                     UInt *      length,
        !            55:                                     UInt        timeout);
        !            56: 
        !            57: /*! @typedef IODebuggerTxHandler
        !            58:     @discussion Defines the transmit handler that must be implemented
        !            59:     by the provider to service KDP requests. This handler is called
        !            60:     by the dispatch function in IOKernelDebugger.
        !            61:     @param provider The provider object.
        !            62:     @param buffer KDP transmit buffer. This buffer contains a KDP frame
        !            63:            to be sent on the wire.
        !            64:     @param length The number of bytes in the transmit buffer. */
        !            65: 
        !            66: typedef void (*IODebuggerTxHandler)(IOService * provider,
        !            67:                                     void *      buffer,
        !            68:                                     UInt        length);
        !            69: 
        !            70: /*! @typedef IODebuggerLockState
        !            71:     @discussion Defines the return from IOKernelDebugger::lock.
        !            72:     @constant kIODebuggerLocked Set if the debugger lock was taken.
        !            73:                  Otherwise, the debugger lock was not taken. */
        !            74: 
        !            75: typedef enum {
        !            76:     kIODebuggerLockTaken = 0x1,
        !            77: } IODebuggerLockState;
        !            78: 
        !            79: /*! class IOKernelDebugger : public IOService
        !            80:     @abstract Kernel debugger nub.
        !            81:     @discussion This object interfaces with the KDP module and
        !            82:     dispatches KDP requests to its provider. The provider, designated the
        !            83:     debugger device, must implement a pair of handler functions that are
        !            84:     called to handle KDP transmit and receive requests. A debugger lock,
        !            85:     allocated by the IOKernelDebugger, can be used by the debugger device
        !            86:     to block calls to its handler functions during critical sections.
        !            87:     Only a single IOKernelDebugger can be registered at any given time.
        !            88: 
        !            89:     The debugger device is usually a subclass of IOEthernetController.
        !            90:     However, any IOService can attach an IOKernelDebugger client,
        !            91:     implement the two polled mode handlers, and transport the KDP
        !            92:     packets through a data channel. Having said this, the KDP assumes
        !            93:     that the debugger device is an Ethernet interface and therefore
        !            94:     it will always send, and expect to receive, an Ethernet frame. */
        !            95: 
        !            96: class IOKernelDebugger : public IOService
        !            97: {
        !            98:     OSDeclareDefaultStructors(IOKernelDebugger)
        !            99: 
        !           100: protected:
        !           101:     IOService *            _provider;      // debugger device.
        !           102:     IODebuggerTxHandler    _txHandler;     // provider's transmit handler.
        !           103:     IODebuggerRxHandler    _rxHandler;     // provider's receive handler.
        !           104: 
        !           105: /*! @function initialize
        !           106:     @discussion IOKernelDebugger class initializer.
        !           107:     The debugger lock is allocated and initialized. */
        !           108: 
        !           109:     static void initialize();
        !           110: 
        !           111: /*! @function kdpReceiveDispatcher
        !           112:     @abstract The KDP receive dispatch function.
        !           113:     @discussion Handles KDP receive requests during a debugging session,
        !           114:     then dispatches the call to the registered receiver handler. This
        !           115:     function is registered with KDP via kdp_register_send_receive().
        !           116:     @param pkt KDP receive buffer. The buffer allocated has room for
        !           117:            1518 bytes. Never overflow the buffer!
        !           118:     @param pkt_len The amount of data placed into the receive buffer.
        !           119:            Set to 0 if a frame was not received during the poll interval.
        !           120:     @param timeout The registered handler must poll for a maximum period of
        !           121:            'timeout' milliseconds while waiting for a frame to arrive. */
        !           122: 
        !           123:     static void kdpReceiveDispatcher(void * pkt, UInt * pkt_len, UInt timeout);
        !           124: 
        !           125: /*! @function kdpTransmitDispatcher
        !           126:     @abstract The KDP transmit dispatch function.
        !           127:     @discussion Handles KDP transmit requests during a debugging session,
        !           128:     then dispatches the call to the registered transmit handler. This
        !           129:     function is registered with KDP via kdp_register_send_receive().
        !           130:     @param pkt KDP transmit buffer. This buffer contains a KDP frame to be
        !           131:            sent on the wire.
        !           132:     @param pkt_len The number of bytes in the transmit buffer. */
        !           133: 
        !           134:     static void kdpTransmitDispatcher(void * pkt, UInt pkt_len);
        !           135: 
        !           136: /*! @function free
        !           137:     @discussion Free the IOKernelDebugger instance. Used for debugging.
        !           138:     Log a message then call super::free(). */
        !           139: 
        !           140:     virtual void free();
        !           141: 
        !           142: /*! @function openProvider
        !           143:     @discussion Open the attached provider, register it as the debugger
        !           144:     device, and register the dispatch and handler functions.
        !           145:     @param provider The provider object. This object is registered as the
        !           146:            debugger device.
        !           147:     @result true on sucess, or false if the controller open failed, or an
        !           148:     IOKernelDebugger instance has already been registered. */
        !           149: 
        !           150:     bool openProvider(IOService * provider);
        !           151: 
        !           152: /*! @function closeProvider
        !           153:     @discussion Close our provider, and undo the registration performed in
        !           154:     openProvider(). Another IOKernelDebugger instance that comes along will
        !           155:     be able to take over the debugging responsibilities.
        !           156:     provider: The provider object. */
        !           157: 
        !           158:     void closeProvider(IOService * provider);
        !           159: 
        !           160: /*! @function nullTxHandler
        !           161:     @abstract Null transmit handler.
        !           162:     @discussion This function is registered as the transmit handler by
        !           163:     closeProvider() after the provider's handler is unregistered. This
        !           164:     function does nothing except to log a warning message. */
        !           165: 
        !           166:     static void nullTxHandler(IOService * provider,
        !           167:                               void *      buffer,
        !           168:                               UInt        length);
        !           169: 
        !           170: /*! @function nullRxHandler
        !           171:     @abstract Null receive handler.
        !           172:     @discussion This function is registered as the receive handler by
        !           173:     closeProvider() after the provider's handler is unregistered. This
        !           174:     function does nothing except to log a warning message. */
        !           175: 
        !           176:     static void nullRxHandler(IOService * provider,
        !           177:                               void *      buffer,
        !           178:                               UInt *      length,
        !           179:                               UInt        timeout);
        !           180: 
        !           181: public:
        !           182: 
        !           183: /*! @function lock
        !           184:     @discussion Take the debugger lock conditionally. The debugger lock
        !           185:     is taken only if the provider given is the current registered
        !           186:     debugger device. The debugger device is registered via the
        !           187:     openProvider() method, and unregistered via closeProvider().
        !           188:     @param provider The caller of the lock function.
        !           189:     @result kIODebuggerLocked if the lock was taken, or kIODebuggerUnlocked
        !           190:     if the lock was not taken. */
        !           191: 
        !           192:     static IODebuggerLockState   lock(IOService * provider);
        !           193: 
        !           194: /*! @function unlock
        !           195:     @discussion Release the debugger lock if the argument is
        !           196:     kIODebuggerLocked.
        !           197:     @param state The return from the IOKernelDebugger::lock(). */
        !           198: 
        !           199:     static void             unlock(IODebuggerLockState state);
        !           200: 
        !           201: /*! @function init
        !           202:     @discussion The IOKernelDebugger initializer.
        !           203:     @param provider  The provider of the IOKernelDebugger object.
        !           204:     @param txHandler The provider's transmit handler. A pointer to a C 
        !           205:            function.
        !           206:     @param rxHandler The provider's receive handler. A pointer to a C function.
        !           207:     @result true if the instance initialized successfully, false otherwise. */
        !           208: 
        !           209:     virtual bool init(IOService *         provider,
        !           210:                       IODebuggerTxHandler txHandler,
        !           211:                       IODebuggerRxHandler rxHandler);
        !           212: 
        !           213: /*! @function debugger
        !           214:     @discussion A factory method that performs allocation and initialization.
        !           215:     @param provider  The provider of the IOKernelDebugger object.
        !           216:     @param txHandler The provider's transmit handler. A pointer to a C 
        !           217:            function.
        !           218:     @param rxHandler The provider's receive handler. A pointer to a C function.
        !           219:     @result An IOKernelDebugger instance on success, 0 otherwise. */
        !           220: 
        !           221:     static IOKernelDebugger * debugger(IOService *         provider,
        !           222:                                        IODebuggerTxHandler txHandler,
        !           223:                                        IODebuggerRxHandler rxHandler);
        !           224: 
        !           225: /*! @function attach
        !           226:     @discussion Attach to our provider, then call openProvider().
        !           227:     @param provider The provider object.
        !           228:     @result true on success, false otherwise. */
        !           229: 
        !           230:     virtual bool attach(IOService * provider);
        !           231: 
        !           232: /*! @function detach
        !           233:     @discussion Call closeProvider(), then detach from our provider.
        !           234:     @param provider The provider object. */
        !           235: 
        !           236:     virtual void detach(IOService * provider);
        !           237: 
        !           238: /*! @function finalize
        !           239:     @discussion Final termination notification. To ensure that closeProvider()
        !           240:     is called before the object is terminated.
        !           241:     @param options termination options, not used. */
        !           242: 
        !           243:     virtual bool finalize(IOOptionBits options = 0);
        !           244: 
        !           245: /*! @function message
        !           246:     @discussion Facility provided by IOService for general purpose
        !           247:     provider-to-client notification. We catch the kIOMessageServiceIsTerminated
        !           248:     message to detect when our provider becomes inactive, and call
        !           249:     closeProvider().
        !           250:     @param type message tupe.
        !           251:     @param provider The provider object.
        !           252:     @param argument message argument. Not used.
        !           253:     @result kIOReturnSuccess for kIOMessageServiceIsTerminated messages,
        !           254:     kIOReturnUnsupported otherwise. */
        !           255: 
        !           256:     virtual IOReturn message(UInt32      type,
        !           257:                              IOService * provider,
        !           258:                              void *      argument = 0);
        !           259: };
        !           260: 
        !           261: // Shortened versions of the lock/unlock static functions.
        !           262: //
        !           263: #define IODebuggerLock    IOKernelDebugger::lock
        !           264: #define IODebuggerUnlock  IOKernelDebugger::unlock
        !           265: 
        !           266: #endif /* !_IOKERNELDEBUGGER_H */

unix.superglobalmegacorp.com

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