|
|
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: /* Copyright (c) 1991 NeXT Computer, Inc. All rights reserved. ! 25: * ! 26: * IOStubKernLoad.m - kernload module for IOStub. ! 27: * ! 28: * HISTORY ! 29: * 25-Apr-91 Doug Mitchell at NeXT ! 30: * Created. ! 31: */ ! 32: ! 33: #undef MACH_USER_API ! 34: #define KERNEL_PRIVATE 1 ! 35: ! 36: #define STUB_BLOCK_DEVICE 7 ! 37: #define STUB_RAW_DEVICE 16 ! 38: ! 39: #import <kernserv/kern_server_types.h> ! 40: #import <mach/message.h> ! 41: #import "IOStub.h" ! 42: #import "IOStubPrivate.h" ! 43: #import "IOStubUnix.h" ! 44: #import <bsd/sys/conf.h> ! 45: #import <bsd/dev/ldd.h> ! 46: ! 47: kern_server_t stub_var; ! 48: ! 49: struct cdevsw stub_saved_cdevsw; ! 50: struct bdevsw stub_saved_bdevsw; ! 51: ! 52: extern int nulldev(); ! 53: extern int nodev(); ! 54: extern int seltrue(); ! 55: #define nullstr 0 ! 56: ! 57: /* ! 58: * these get copied into bdevsw/cdevsw at load time. ! 59: */ ! 60: struct bdevsw stub_bdevsw = { (PFI)stub_open, ! 61: (PFI)stub_close, ! 62: (PFI)stub_strategy, ! 63: nodev, ! 64: nodev, ! 65: 0 }; ! 66: struct cdevsw stub_cdevsw = { (PFI)stub_open, ! 67: (PFI)stub_close, ! 68: (PFI)stub_read, ! 69: (PFI)stub_write, ! 70: (PFI)stub_ioctl, ! 71: nodev, ! 72: nulldev, ! 73: seltrue, ! 74: nodev, ! 75: nodev, ! 76: nodev }; ! 77: ! 78: void stub_announce(int unit); ! 79: void stub_port_gone(port_name_t port); ! 80: void stub_terminate(int unit); ! 81: void stub_server(msg_header_t *in_p, int unit); ! 82: ! 83: /* ! 84: * we're just placed into memory here. Actual device initialization ! 85: * and instantiation is done in stub_server(). ! 86: */ ! 87: void stub_announce(int unit) ! 88: { ! 89: IOLog("stub%d: IOStub device Loaded\n", unit); ! 90: } /* stub_announce() */ ! 91: ! 92: void stub_port_gone(port_name_t port) ! 93: { ! 94: /* no-op, we don't really care about any ports. */ ! 95: ! 96: } /* stub_port_gone() */ ! 97: ! 98: void stub_terminate(int unit) ! 99: { ! 100: int i; ! 101: ! 102: xpr_stub("stub_terminate\n", 1,2,3,4,5); ! 103: ! 104: /* ! 105: * remove ourself from devsw's. ! 106: */ ! 107: bdevsw[STUB_BLOCK_DEVICE] = stub_saved_bdevsw; ! 108: cdevsw[STUB_RAW_DEVICE] = stub_saved_cdevsw; ! 109: for(i=0; i<NUM_IOSTUBS; i++) { ! 110: if(stub_object[i].stub_id != nil) { ! 111: [stub_object[i].stub_id free]; ! 112: stub_object[i].stub_id = nil; ! 113: IOFree(stub_object[i].physbuf, sizeof(struct buf)); ! 114: } ! 115: } ! 116: ! 117: IOLog("stub%d: Stub Device Unloaded\n", unit); ! 118: } /* stub_terminate() */ ! 119: ! 120: /* ! 121: * Initialize and instantiate. This is invoked upon receipt of any message. ! 122: * ! 123: * FIXME: this could share common code with stub_probe() when we're no longer ! 124: * a loadable module. ! 125: */ ! 126: static int stub_is_initialized = 0; ! 127: ! 128: void stub_server(msg_header_t *in_p, int unit) ! 129: { ! 130: int Unit; ! 131: ! 132: if(stub_is_initialized) { ! 133: IOLog("stub_server already initialized\n"); ! 134: goto done; ! 135: } ! 136: ! 137: #if m68k ! 138: /* ! 139: * First initialize the libraries we'll use. ! 140: */ ! 141: IOlibIOInit(); ! 142: #endif m68k ! 143: #ifdef XPR_DEBUG ! 144: #if m68k ! 145: xprInit(500); ! 146: #endif m68k ! 147: xprSetBitmask(XPR_IODEVICE_INDEX, XPR_DEVICE | XPR_STUB); ! 148: #endif XPR_DEBUG ! 149: xpr_stub("stub_server\n", 1,2,3,4,5); ! 150: ! 151: for(Unit=0; Unit<NUM_IOSTUBS; Unit++) { ! 152: stub_object[Unit].stub_id = [IOStub stubProbe:Unit]; ! 153: if(stub_object[Unit].stub_id != nil) { ! 154: stub_object[Unit].physbuf = ! 155: IOMalloc(sizeof(struct buf)); ! 156: stub_object[Unit].physbuf->b_flags = 0; ! 157: } ! 158: } ! 159: ! 160: /* ! 161: * place ourself in cdevsw and bdevsw. ! 162: */ ! 163: stub_saved_bdevsw = bdevsw[STUB_BLOCK_DEVICE]; ! 164: stub_saved_cdevsw = cdevsw[STUB_RAW_DEVICE]; ! 165: bdevsw[STUB_BLOCK_DEVICE] = stub_bdevsw; ! 166: cdevsw[STUB_RAW_DEVICE] = stub_cdevsw; ! 167: ! 168: IOLog("IOStub device Installed\n"); ! 169: ! 170: /* ! 171: * return message to loader. ! 172: */ ! 173: done: ! 174: msg_send(in_p, ! 175: MSG_OPTION_NONE, ! 176: 0); ! 177: } /* stub_server() */ ! 178: ! 179: ! 180: /* end of stub_ks.m */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.