// 新しいデバイスの発見 void pro100_new(struct pci_device *dev) { PRO100_CTX *ctx = SeZeroMalloc(sizeof(PRO100_CTX)); printf ("pro100_new\n"); #ifdef VTD_TRANS if (iommu_detected) { add_remap(dev->address.bus_no ,dev->address.device_no ,dev->address.func_no, vmm_start_inf() >> 12, (vmm_term_inf()-vmm_start_inf()) >> 12, PERM_DMA_RW) ; } #endif // of VTD_TRANS ctx->dev = dev; ctx->lock = SeNewLock(); dev->host = ctx; pro100_alloc_recv_buffer(ctx); if (pro100_ctx == NULL) { pro100_ctx = ctx; } else { printf("Error: Two or more pro100 devices found.\n"); pro100_beep(1234, 5000); } }
// 新しい ETH の作成 SE_ETH *SeEthNew(SE_HANDLE nic_handle, UINT nic_type, SE_ETH_RECV_CALLBACK *recv_callback, void *recv_callback_param) { SE_ETH *e; // 引数チェック if (nic_handle == NULL || recv_callback == NULL) { return NULL; } e = SeZeroMalloc(sizeof(SE_ETH)); e->NicHandle = nic_handle; e->RecvCallback = recv_callback; e->RecvCallbackParam = recv_callback_param; e->NicType = nic_type; e->SenderMacList = SeNewList(NULL); e->SenderMacListLock = SeNewLock(); e->RecvQueue = SeNewQueue(); e->RecvQueueLock = SeNewLock(); e->SendQueue = SeNewQueue(); e->IsPromiscusMode = true; SeEthGenRandMacAddress(e->MyMacAddress, NULL, 0); if (e->NicType == SE_NIC_PHYSICAL) { SeSysGetPhysicalNicInfo(nic_handle, &e->Info); SeSysSetPhysicalNicRecvCallback(nic_handle, SeEthNicCallback, e); } else { SeSysGetVirtualNicInfo(nic_handle, &e->Info); SeSysSetVirtualNicRecvCallback(nic_handle, SeEthNicCallback, e); } return e; }
// タイマの新規作成 SE_TIMER *SeTimerNew(SE_TIMER_CALLBACK *callback, void *callback_param) { SE_TIMER *t; // 引数チェック if (callback == NULL) { return NULL; } t = SeZeroMalloc(sizeof(SE_TIMER)); t->TimerHandle = SeSysNewTimer(SeTimerCallback, t); t->TimerEntryList = SeNewList(SeTimerEntryCompare); t->TimerCallback = callback; t->TimerCallbackParam = callback_param; t->TimerEntryLock = SeNewLock(); return t; }
// カーネル系ライブラリの初期化 void SeInitKernel() { rt->TickLock = SeNewLock(); rt->StartTick64 = SeTick64Internal(); }