📄 debug.c
字号:
int diva_set_driver_dbg_mask (dword id, dword mask) { diva_os_spin_lock_magic_t old_irql, old_irql1; int ret = -1; if (!id || (id >= (sizeof(clients)/sizeof(clients[0])))) { return (-1); } diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "dbg mask"); diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "dbg mask"); if (clients[id].hDbg) { dword old_mask = clients[id].hDbg->dbgMask; mask &= 0x7fffffff; clients[id].hDbg->dbgMask = mask; clients[id].last_dbgMask = (clients[id].hDbg->dbgMask | clients[id].dbgMask); ret = 4; diva_change_management_debug_mask (&clients[id], old_mask); } diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "dbg mask"); if (clients[id].request_pending) { clients[id].request_pending = 0; (*(clients[id].request))((ENTITY*)(*(clients[id].pIdiLib->DivaSTraceGetHandle))(clients[id].pIdiLib->hLib)); } diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "dbg mask"); return (ret);}static int diva_get_idi_adapter_info (IDI_CALL request, dword* serial, dword* logical) { IDI_SYNC_REQ sync_req; sync_req.xdi_logical_adapter_number.Req = 0; sync_req.xdi_logical_adapter_number.Rc = IDI_SYNC_REQ_XDI_GET_LOGICAL_ADAPTER_NUMBER; (*request)((ENTITY *)&sync_req); *logical = sync_req.xdi_logical_adapter_number.info.logical_adapter_number; sync_req.GetSerial.Req = 0; sync_req.GetSerial.Rc = IDI_SYNC_REQ_GET_SERIAL; sync_req.GetSerial.serial = 0; (*request)((ENTITY *)&sync_req); *serial = sync_req.GetSerial.serial; return (0);}/* Register XDI adapter as MAINT compatible driver */void diva_mnt_add_xdi_adapter (const DESCRIPTOR* d) { diva_os_spin_lock_magic_t old_irql, old_irql1; dword sec, usec, logical, serial, org_mask; int id, best_id = 0, free_id = -1; char tmp[256]; diva_dbg_entry_head_t* pmsg = NULL; int len; word size; byte* pmem; diva_os_get_time (&sec, &usec); diva_get_idi_adapter_info (d->request, &serial, &logical); if (serial & 0xff000000) { sprintf (tmp, "ADAPTER:%d SN:%u-%d", (int)logical, serial & 0x00ffffff, (byte)(((serial & 0xff000000) >> 24) + 1)); } else { sprintf (tmp, "ADAPTER:%d SN:%u", (int)logical, serial); } if (!(pmem = diva_os_malloc (0, DivaSTraceGetMemotyRequirement (d->channels)))) { return; } memset (pmem, 0x00, DivaSTraceGetMemotyRequirement (d->channels)); diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "register"); diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "register"); for (id = 1; id < (sizeof(clients)/sizeof(clients[0])); id++) { if (clients[id].hDbg && (clients[id].request == d->request)) { diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register"); diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register"); diva_os_free(0, pmem); return; } if (clients[id].hDbg) { /* slot is busy */ continue; } if (free_id < 0) { free_id = id; } if (!strcmp (clients[id].drvName, tmp)) { /* This driver was already registered with this name and slot is still free - reuse it */ free_id = id; best_id = 1; break; } } if (free_id < 0) { diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register"); diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register"); diva_os_free (0, pmem); return; } id = free_id; clients[id].request = d->request; clients[id].request_pending = 0; clients[id].hDbg = &clients[id].Dbg; clients[id].sec = sec; clients[id].usec = usec; strcpy (clients[id].drvName, tmp); strcpy (clients[id].Dbg.drvName, tmp); clients[id].Dbg.drvTag[0] = 0; clients[id].logical = (int)logical; clients[id].channels = (int)d->channels; clients[id].dma_handle = -1; clients[id].Dbg.dbgMask = 0; clients[id].dbgMask = clients[id].Dbg.dbgMask; if (id) { clients[id].Dbg.dbgMask |= clients[free_id].last_dbgMask; } else { clients[id].last_dbgMask = 0; } clients[id].Dbg.Registered = DBG_HANDLE_REG_NEW; clients[id].Dbg.id = (byte)id; clients[id].Dbg.dbg_end = DI_deregister; clients[id].Dbg.dbg_prt = DI_format_locked; clients[id].Dbg.dbg_ev = DiProcessEventLog; clients[id].Dbg.dbg_irq = DI_format_locked; clients[id].Dbg.next = (pDbgHandle)DBG_MAGIC; { diva_trace_library_user_interface_t diva_maint_user_ifc = { &clients[id], diva_maint_state_change_notify, diva_maint_trace_notify, diva_maint_error }; /* Attach to adapter management interface */ if ((clients[id].pIdiLib = DivaSTraceLibraryCreateInstance ((int)logical, &diva_maint_user_ifc, pmem))) { if (((*(clients[id].pIdiLib->DivaSTraceLibraryStart))(clients[id].pIdiLib->hLib))) { diva_mnt_internal_dprintf (0, DLI_ERR, "Adapter(%d) Start failed", (int)logical); (*(clients[id].pIdiLib->DivaSTraceLibraryFinit))(clients[id].pIdiLib->hLib); clients[id].pIdiLib = NULL; } } else { diva_mnt_internal_dprintf (0, DLI_ERR, "A(%d) management init failed", (int)logical); } } if (!clients[id].pIdiLib) { clients[id].request = NULL; clients[id].request_pending = 0; clients[id].hDbg = NULL; diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register"); diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register"); diva_os_free (0, pmem); return; } /* Log driver register, MAINT driver ID is '0' */ len = sprintf (tmp, "DIMAINT - drv # %d = '%s' registered", id, clients[id].Dbg.drvName); while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue, (word)(len+1+sizeof(*pmsg))))) { if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) { queueFreeMsg (dbg_queue); } else { break; } } if (pmsg) { pmsg->sequence = dbg_sequence++; pmsg->time_sec = sec; pmsg->time_usec = usec; pmsg->facility = MSG_TYPE_STRING; pmsg->dli = DLI_REG; pmsg->drv_id = 0; /* id 0 - DIMAINT */ pmsg->di_cpu = 0; pmsg->data_length = len+1; memcpy (&pmsg[1], tmp, len+1); queueCompleteMsg (pmsg); diva_maint_wakeup_read(); } org_mask = clients[id].Dbg.dbgMask; clients[id].Dbg.dbgMask = 0; diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register"); if (clients[id].request_pending) { clients[id].request_pending = 0; (*(clients[id].request))((ENTITY*)(*(clients[id].pIdiLib->DivaSTraceGetHandle))(clients[id].pIdiLib->hLib)); } diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register"); diva_set_driver_dbg_mask (id, org_mask);}/* De-Register XDI adapter */void diva_mnt_remove_xdi_adapter (const DESCRIPTOR* d) { diva_os_spin_lock_magic_t old_irql, old_irql1; dword sec, usec; int i; word size; byte* pmem = NULL; diva_os_get_time (&sec, &usec); diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "read"); diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "read"); for (i = 1; i < (sizeof(clients)/sizeof(clients[0])); i++) { if (clients[i].hDbg && (clients[i].request == d->request)) { diva_dbg_entry_head_t* pmsg; char tmp[256]; int len; if (clients[i].pIdiLib) { (*(clients[i].pIdiLib->DivaSTraceLibraryFinit))(clients[i].pIdiLib->hLib); clients[i].pIdiLib = NULL; pmem = clients[i].pmem; clients[i].pmem = NULL; } clients[i].hDbg = NULL; clients[i].request_pending = 0; if (clients[i].dma_handle >= 0) { /* Free DMA handle */ diva_free_dma_descriptor (clients[i].request, clients[i].dma_handle); clients[i].dma_handle = -1; } clients[i].request = NULL; /* Log driver register, MAINT driver ID is '0' */ len = sprintf (tmp, "DIMAINT - drv # %d = '%s' de-registered", i, clients[i].Dbg.drvName); memset (&clients[i].Dbg, 0x00, sizeof(clients[i].Dbg)); while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue, (word)(len+1+sizeof(*pmsg))))) { if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) { queueFreeMsg (dbg_queue); } else { break; } } if (pmsg) { pmsg->sequence = dbg_sequence++; pmsg->time_sec = sec; pmsg->time_usec = usec; pmsg->facility = MSG_TYPE_STRING; pmsg->dli = DLI_REG; pmsg->drv_id = 0; /* id 0 - DIMAINT */ pmsg->di_cpu = 0; pmsg->data_length = len+1; memcpy (&pmsg[1], tmp, len+1); queueCompleteMsg (pmsg); diva_maint_wakeup_read(); } break; } } diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "read_ack"); diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "read_ack"); if (pmem) { diva_os_free (0, pmem); }}/* ---------------------------------------------------------------- Low level interface for management interface client ---------------------------------------------------------------- *//* Return handle to client structure */void* SuperTraceOpenAdapter (int AdapterNumber) { int i; for (i = 1; i < (sizeof(clients)/sizeof(clients[0])); i++) { if (clients[i].hDbg && clients[i].request && (clients[i].logical == AdapterNumber)) { return (&clients[i]); } } return NULL;}int SuperTraceCloseAdapter (void* AdapterHandle) { return (0);}int SuperTraceReadRequest (void* AdapterHandle, const char* name, byte* data) { diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle; if (pC && pC->pIdiLib && pC->request) { ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib); byte* xdata = (byte*)&pC->xbuffer[0]; char tmp = 0; word length; if (!strcmp(name, "\\")) { /* Read ROOT */ name = &tmp; } length = SuperTraceCreateReadReq (xdata, name); single_p (xdata, &length, 0); /* End Of Message */ e->Req = MAN_READ; e->ReqCh = 0; e->X->PLength = length; e->X->P = (byte*)xdata; pC->request_pending = 1; return (0); } return (-1);}int SuperTraceGetNumberOfChannels (void* AdapterHandle) { if (AdapterHandle) { diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle; return (pC->channels); } return (0);}int SuperTraceASSIGN (void* AdapterHandle, byte* data) { diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle; if (pC && pC->pIdiLib && pC->request) { ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib); IDI_SYNC_REQ* preq; char buffer[((sizeof(preq->xdi_extended_features)+4) > sizeof(ENTITY)) ? (sizeof(preq->xdi_extended_features)+4) : sizeof(ENTITY)]; char features[4]; word assign_data_length = 1; features[0] = 0; pC->xbuffer[0] = 0; preq = (IDI_SYNC_REQ*)&buffer[0]; preq->xdi_extended_features.Req = 0; preq->xdi_extended_features.Rc = IDI_SYNC_REQ_XDI_GET_EXTENDED_FEATURES; preq->xdi_extended_features.info.buffer_length_in_bytes = sizeof(features); preq->xdi_extended_features.info.features = &features[0]; (*(pC->request))((ENTITY*)preq); if ((features[0] & DIVA_XDI_EXTENDED_FEATURES_VALID) && (features[0] & DIVA_XDI_EXTENDED_FEATURE_MANAGEMENT_DMA)) { dword rx_dma_magic; if ((pC->dma_handle = diva_get_dma_descriptor (pC->request, &rx_dma_magic)) >= 0) { pC->xbuffer[0] = LLI; pC->xbuffer[1] = 8; pC->xbuffer[2] = 0x40; pC->xbuffer[3] = (byte)pC->dma_handle; pC->xbuffer[4] = (byte)rx_dma_magic; pC->xbuffer[5] = (byte)(rx_dma_magic >> 8); pC->xbuffer[6] = (byte)(rx_dma_magic >> 16); pC->xbuffer[7] = (byte)(rx_dma_magic >> 24); pC->xbuffer[8] = (byte)DIVA_MAX_MANAGEMENT_TRANSFER_SIZE; pC->xbuffer[9] = (byte)(DIVA_MAX_MANAGEMENT_TRANSFER_SIZE >> 8); pC->xbuffer[10] = 0; assign_data_length = 11; } } else { pC->dma_handle = -1; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -