|
|
1.1 ! root 1: driverkit msg_send notes ! 2: ! 3: thread.ipc_kernel TRUE ==> "body of message is in kernel pmap" (avoids copyin ! 4: and copyout) ! 5: task.kernel_ipc_space TRUE ==> ports are kernel objects, i.e., they are ! 6: ptrs to struct kern_port_t instread of ints. ! 7: ! 8: difference between msg_send() and msg_send_from_kernel(): ! 9: -- msg_send() does copyin() of entire msg body (instead of bcopy()) ! 10: -- msg_send_from_kernel() forces both ipc_kernel and kernel_ipc_space ! 11: TRUE ! 12: ! 13: Must do msg_send_from_kernel() if it's possible that current_task() is a user task. For example, the exported methods in SCSIController call enqueueCmd, which will do a msg_send to cmdPort. No good - the msg_send() will do a copyin() to get a local copy of the message body; the copyin() willget garbage from the user task. Thus SCSIController has to keep a kern_port_t version of cmdPort; enqueueCmd will do a msg_send_from_kernel to that. ! 14: ! 15: Other msg_send()s in kernel drivers which need to be msg_send_from_kernel: ! 16: ! 17: adbDriver: ! 18: threadOpCommon in adbDriver.m - same fix (cmdPort) ! 19: fake_hw_intr_msg() in adbArch.m - same fix (interruptPort) ! 20: SCSIController: ! 21: enqueueCmd in SCSIControllerPrivate (cmdPort) ! 22: FAKE_HARDWARE version of enableInterrupt in SCSIDevice.m ! 23: (interruptPort) <<<probably can skip....>> ! 24: Ethernet: ! 25: enetNotifyThread in Ethernet.m (IOPort) ! 26: enetSyncCmd in Ethernet.m (IOPort) ! 27: ! 28: msg_send()s which are OK as is: ! 29: SCSIController: ! 30: SCSITimerFcn (timerPort) - called via IOTimeout ! 31: libIO: ! 32: iotaskTest() - this is an IOTask thread. ! 33:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.