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 + -
显示快捷键?