⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debug.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
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 + -