debug.c

来自「优龙2410linux2.6.8内核源代码」· C语言 代码 · 共 1,784 行 · 第 1/4 页

C
1,784
字号
                                        (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_hard (&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_hard (&dbg_adapter_lock, &old_irql1, "read");  diva_os_enter_spin_lock_hard (&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_hard (&dbg_q_lock, &old_irql, "read_ack");  diva_os_leave_spin_lock_hard (&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 (!format)    return;    diva_os_get_time (&sec, &usec);  if (do_lock) {    diva_os_enter_spin_lock_hard (&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_hard (&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_hard (&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_hard (&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_hard (&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_hard (&dbg_q_lock, &old_irql, "driver info");  return (ret);}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_hard (&dbg_adapter_lock, &old_irql1, "dbg mask");  diva_os_enter_spin_lock_hard (&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_hard (&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_hard (&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:%d-%d",             (int)logical,             serial & 0x00ffffff,             (byte)(((serial & 0xff000000) >> 24) + 1));  } else {    sprintf (tmp, "ADAPTER:%d SN:%d", (int)logical, serial);  }  if (!(pmem = diva_os_malloc (0, DivaSTraceGetMemotyRequirement (d->channels)))) {    return;  }  memset (pmem, 0x00, DivaSTraceGetMemotyRequirement (d->channels));  diva_os_enter_spin_lock_hard (&dbg_adapter_lock, &old_irql1, "register");  diva_os_enter_spin_lock_hard (&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_hard (&dbg_q_lock, &old_irql, "register");      diva_os_leave_spin_lock_hard (&dbg_adapter_lock, &old_irql1, "register");      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;    }  }

⌨️ 快捷键说明

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