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

📄 debug.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
    }    free_id = id;    if (!strcmp (clients[id].drvName, hDbg->drvName)) {      /*        This driver was already registered with this name        and slot is still free - reuse it        */      best_id = 1;      break;    }    if (!clients[id].hDbg) { /* slot is busy */      break;    }  }  if (free_id != -1) {    diva_dbg_entry_head_t* pmsg = NULL;    int len;    char tmp[256];    word size;    /*      Register new driver with id == free_id      */    clients[free_id].hDbg = hDbg;    clients[free_id].sec  = sec;    clients[free_id].usec = usec;    strcpy (clients[free_id].drvName, hDbg->drvName);    clients[free_id].dbgMask = hDbg->dbgMask;    if (best_id) {      hDbg->dbgMask |= clients[free_id].last_dbgMask;    } else {      clients[free_id].last_dbgMask = 0;    }    hDbg->Registered = DBG_HANDLE_REG_NEW ;    hDbg->id         = (byte)free_id;    hDbg->dbg_end    = DI_deregister;    hDbg->dbg_prt    = DI_format_locked;    hDbg->dbg_ev     = DiProcessEventLog;    hDbg->dbg_irq    = DI_format_locked;    if (hDbg->Version > 0) {      hDbg->dbg_old  = DI_format_old;    }    hDbg->next       = (pDbgHandle)DBG_MAGIC;    /*      Log driver register, MAINT driver ID is '0'      */    len = sprintf (tmp, "DIMAINT - drv # %d = '%s' registered",                   free_id, hDbg->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();    }  }  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");}static void DI_deregister (pDbgHandle hDbg) {  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 == hDbg) {      diva_dbg_entry_head_t* pmsg;      char tmp[256];      int len;      clients[i].hDbg = NULL;      hDbg->id       = -1;      hDbg->dbgMask  = 0;      hDbg->dbg_end  = NULL;      hDbg->dbg_prt  = NULL;      hDbg->dbg_irq  = NULL;      if (hDbg->Version > 0)        hDbg->dbg_old = NULL;      hDbg->Registered = 0;      hDbg->next     = NULL;      if (clients[i].pIdiLib) {        (*(clients[i].pIdiLib->DivaSTraceLibraryFinit))(clients[i].pIdiLib->hLib);        clients[i].pIdiLib = NULL;        pmem = clients[i].pmem;        clients[i].pmem = NULL;      }      /*        Log driver register, MAINT driver ID is '0'        */      len = sprintf (tmp, "DIMAINT - drv # %d = '%s' de-registered",                     i, hDbg->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();      }      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);  }}static void DI_format_locked (unsigned short id,                       int type,                       char *format,                       va_list argument_list) {  DI_format (1, id, type, format, argument_list);}static void DI_format (int do_lock,                       unsigned short id,                       int type,                       char *format,                       va_list ap) {  diva_os_spin_lock_magic_t old_irql;  dword sec, usec;  diva_dbg_entry_head_t* pmsg = NULL;  dword length;  word size;  static char fmtBuf[MSG_FRAME_MAX_SIZE+sizeof(*pmsg)+1];  char          *data;  unsigned short code;  if (diva_os_in_irq()) {    dbg_sequence++;    return;  }	if ((!format) ||			((TraceFilter[0] != 0) && ((TraceFilterIdent < 0) || (TraceFilterChannel < 0)))) {		return;	}    diva_os_get_time (&sec, &usec);  if (do_lock) {    diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "format");  }  switch (type) {  case DLI_MXLOG :  case DLI_BLK :  case DLI_SEND:  case DLI_RECV:    if (!(length = va_arg(ap, unsigned long))) {      break;    }    if (length > MaxDumpSize) {      length = MaxDumpSize;    }    while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,                                (word)length+sizeof(*pmsg)))) {      if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {        queueFreeMsg (dbg_queue);      } else {        break;      }    }    if (pmsg) {      memcpy (&pmsg[1], format, length);      pmsg->sequence    = dbg_sequence++;      pmsg->time_sec    = sec;      pmsg->time_usec   = usec;      pmsg->facility    = MSG_TYPE_BINARY ;      pmsg->dli         = type; /* DLI_XXX */      pmsg->drv_id      = id;   /* driver MAINT id */      pmsg->di_cpu      = 0;      pmsg->data_length = length;      queueCompleteMsg (pmsg);    }		break;  case DLI_XLOG: {    byte* p;    data    = va_arg(ap, char*);    code    = (unsigned short)va_arg(ap, unsigned int);    length	= (unsigned long) va_arg(ap, unsigned int);    if (length > MaxXlogSize)      length = MaxXlogSize;    while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,                                  (word)length+sizeof(*pmsg)+2))) {      if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {        queueFreeMsg (dbg_queue);      } else {        break;      }    }    if (pmsg) {      p = (byte*)&pmsg[1];      p[0] = (char)(code) ;      p[1] = (char)(code >> 8) ;      if (data && length) {        memcpy (&p[2], &data[0], length) ;      }      length += 2 ;      pmsg->sequence    = dbg_sequence++;      pmsg->time_sec    = sec;      pmsg->time_usec   = usec;      pmsg->facility    = MSG_TYPE_BINARY ;      pmsg->dli         = type; /* DLI_XXX */      pmsg->drv_id      = id;   /* driver MAINT id */      pmsg->di_cpu      = 0;      pmsg->data_length = length;      queueCompleteMsg (pmsg);    }  } break;  case DLI_LOG :  case DLI_FTL :  case DLI_ERR :  case DLI_TRC :  case DLI_REG :  case DLI_MEM :  case DLI_SPL :  case DLI_IRP :  case DLI_TIM :  case DLI_TAPI:  case DLI_NDIS:  case DLI_CONN:  case DLI_STAT:  case DLI_PRV0:  case DLI_PRV1:  case DLI_PRV2:  case DLI_PRV3:    if ((length = (unsigned long)vsprintf (&fmtBuf[0], format, ap)) > 0) {      length += (sizeof(*pmsg)+1);      while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,                                                          (word)length))) {        if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {          queueFreeMsg (dbg_queue);        } else {          break;        }      }      pmsg->sequence    = dbg_sequence++;      pmsg->time_sec    = sec;      pmsg->time_usec   = usec;      pmsg->facility    = MSG_TYPE_STRING;      pmsg->dli         = type; /* DLI_XXX */      pmsg->drv_id      = id;   /* driver MAINT id */      pmsg->di_cpu      = 0;      pmsg->data_length = length - sizeof(*pmsg);      memcpy (&pmsg[1], fmtBuf, pmsg->data_length);		  queueCompleteMsg (pmsg);    }    break;  } /* switch type */  if (queueCount(dbg_queue)) {    diva_maint_wakeup_read();  }  if (do_lock) {    diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "format");  }}/*  Write driver ID and driver revision to callers buffer  */int diva_get_driver_info (dword id, byte* data, int data_length) {  diva_os_spin_lock_magic_t old_irql;  byte* p = data;  int to_copy;  if (!data || !id || (data_length < 17) ||      (id >= (sizeof(clients)/sizeof(clients[0])))) {    return (-1);  }  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "driver info");  if (clients[id].hDbg) {    *p++ = 1;    *p++ = (byte)clients[id].sec; /* save seconds */    *p++ = (byte)(clients[id].sec >>  8);    *p++ = (byte)(clients[id].sec >> 16);    *p++ = (byte)(clients[id].sec >> 24);    *p++ = (byte)(clients[id].usec/1000); /* save mseconds */    *p++ = (byte)((clients[id].usec/1000) >>  8);    *p++ = (byte)((clients[id].usec/1000) >> 16);    *p++ = (byte)((clients[id].usec/1000) >> 24);    data_length -= 9;    if ((to_copy = MIN(strlen(clients[id].drvName), data_length-1))) {      memcpy (p, clients[id].drvName, to_copy);      p += to_copy;      data_length -= to_copy;      if ((data_length >= 4) && clients[id].hDbg->drvTag[0]) {        *p++ = '(';        data_length -= 1;        if ((to_copy = MIN(strlen(clients[id].hDbg->drvTag), data_length-2))) {          memcpy (p, clients[id].hDbg->drvTag, to_copy);          p += to_copy;          data_length -= to_copy;          if (data_length >= 2) {            *p++ = ')';            data_length--;          }        }      }    }  }  *p++ = 0;  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "driver info");  return (p - data);}int diva_get_driver_dbg_mask (dword id, byte* data) {  diva_os_spin_lock_magic_t old_irql;  int ret = -1;  if (!data || !id || (id >= (sizeof(clients)/sizeof(clients[0])))) {    return (-1);  }  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "driver info");  if (clients[id].hDbg) {    ret = 4;    *data++= (byte)(clients[id].hDbg->dbgMask);    *data++= (byte)(clients[id].hDbg->dbgMask >>  8);    *data++= (byte)(clients[id].hDbg->dbgMask >> 16);    *data++= (byte)(clients[id].hDbg->dbgMask >> 24);  }  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "driver info");  return (ret);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -