Пример #1
0
void iwl_dump_nic_error_log(struct iwl_priv *priv)
{
	u32 data2, line;
	u32 desc, time, count, base, data1;
	u32 blink1, blink2, ilink1, ilink2;
	int ret;

	if (priv->ucode_type == UCODE_INIT)
		base = le32_to_cpu(priv->card_alive_init.error_event_table_ptr);
	else
		base = le32_to_cpu(priv->card_alive.error_event_table_ptr);

	if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
		IWL_ERROR("Not valid error log pointer 0x%08X\n", base);
		return;
	}

	ret = iwl_grab_nic_access(priv);
	if (ret) {
		IWL_WARNING("Can not read from adapter at this time.\n");
		return;
	}

	count = iwl_read_targ_mem(priv, base);

	if (ERROR_START_OFFSET <= count * ERROR_ELEM_SIZE) {
		IWL_ERROR("Start IWL Error Log Dump:\n");
		IWL_ERROR("Status: 0x%08lX, count: %d\n", priv->status, count);
	}

	desc = iwl_read_targ_mem(priv, base + 1 * sizeof(u32));
	blink1 = iwl_read_targ_mem(priv, base + 3 * sizeof(u32));
	blink2 = iwl_read_targ_mem(priv, base + 4 * sizeof(u32));
	ilink1 = iwl_read_targ_mem(priv, base + 5 * sizeof(u32));
	ilink2 = iwl_read_targ_mem(priv, base + 6 * sizeof(u32));
	data1 = iwl_read_targ_mem(priv, base + 7 * sizeof(u32));
	data2 = iwl_read_targ_mem(priv, base + 8 * sizeof(u32));
	line = iwl_read_targ_mem(priv, base + 9 * sizeof(u32));
	time = iwl_read_targ_mem(priv, base + 11 * sizeof(u32));

	IWL_ERROR("Desc        Time       "
		"data1      data2      line\n");
	IWL_ERROR("%-13s (#%d) %010u 0x%08X 0x%08X %u\n",
		desc_lookup(desc), desc, time, data1, data2, line);
	IWL_ERROR("blink1  blink2  ilink1  ilink2\n");
	IWL_ERROR("0x%05X 0x%05X 0x%05X 0x%05X\n", blink1, blink2,
		ilink1, ilink2);

	iwl_release_nic_access(priv);
}
static void iwl_dump_nic_error_log(struct iwl_trans *trans)
{
	u32 base;
	struct iwl_error_event_table table;
	struct iwl_priv *priv = priv(trans);
	struct iwl_trans_pcie *trans_pcie =
		IWL_TRANS_GET_PCIE_TRANS(trans);

	base = priv->device_pointers.error_event_table;
	if (priv->ucode_type == IWL_UCODE_INIT) {
		if (!base)
			base = priv->init_errlog_ptr;
	} else {
		if (!base)
			base = priv->inst_errlog_ptr;
	}

	if (!iwlagn_hw_valid_rtc_data_addr(base)) {
		IWL_ERR(trans,
			"Not valid error log pointer 0x%08X for %s uCode\n",
			base,
			(priv->ucode_type == IWL_UCODE_INIT)
					? "Init" : "RT");
		return;
	}

	iwl_read_targ_mem_words(bus(priv), base, &table, sizeof(table));

	if (ERROR_START_OFFSET <= table.valid * ERROR_ELEM_SIZE) {
		IWL_ERR(trans, "Start IWL Error Log Dump:\n");
		IWL_ERR(trans, "Status: 0x%08lX, count: %d\n",
			trans->shrd->status, table.valid);
	}

	trans_pcie->isr_stats.err_code = table.error_id;

	trace_iwlwifi_dev_ucode_error(priv, table.error_id, table.tsf_low,
				      table.data1, table.data2, table.line,
				      table.blink1, table.blink2, table.ilink1,
				      table.ilink2, table.bcon_time, table.gp1,
				      table.gp2, table.gp3, table.ucode_ver,
				      table.hw_ver, table.brd_ver);
	IWL_ERR(trans, "0x%08X | %-28s\n", table.error_id,
		desc_lookup(table.error_id));
	IWL_ERR(trans, "0x%08X | uPc\n", table.pc);
	IWL_ERR(trans, "0x%08X | branchlink1\n", table.blink1);
	IWL_ERR(trans, "0x%08X | branchlink2\n", table.blink2);
	IWL_ERR(trans, "0x%08X | interruptlink1\n", table.ilink1);
	IWL_ERR(trans, "0x%08X | interruptlink2\n", table.ilink2);
	IWL_ERR(trans, "0x%08X | data1\n", table.data1);
	IWL_ERR(trans, "0x%08X | data2\n", table.data2);
	IWL_ERR(trans, "0x%08X | line\n", table.line);
	IWL_ERR(trans, "0x%08X | beacon time\n", table.bcon_time);
	IWL_ERR(trans, "0x%08X | tsf low\n", table.tsf_low);
	IWL_ERR(trans, "0x%08X | tsf hi\n", table.tsf_hi);
	IWL_ERR(trans, "0x%08X | time gp1\n", table.gp1);
	IWL_ERR(trans, "0x%08X | time gp2\n", table.gp2);
	IWL_ERR(trans, "0x%08X | time gp3\n", table.gp3);
	IWL_ERR(trans, "0x%08X | uCode version\n", table.ucode_ver);
	IWL_ERR(trans, "0x%08X | hw version\n", table.hw_ver);
	IWL_ERR(trans, "0x%08X | board version\n", table.brd_ver);
	IWL_ERR(trans, "0x%08X | hcmd\n", table.hcmd);
}
Пример #3
0
static
void print_message(struct debug_hdr_t *req)
{
	struct in_addr in_addr;
	struct bproc_message_hdr_t *hdr;

	hdr = bproc_debug_msg(req);
	printf("  %d.%03d:%4d: ", (int)req->time.tv_sec,
	       (int)req->time.tv_usec / 1000, hdr->size);

	if (req->tofrom == BPROC_DEBUG_OTHER) {
		switch (hdr->req) {
		case 1000:{
				struct bproc_debug_1000_msg_t *msg;
				msg = bproc_debug_msg(req);
				printf("Process move %d  %d -> %d", msg->pid,
				       msg->last, msg->node);
			} break;
		default:
			printf(" ???? ");
		}
	} else {
		/* Routing */
		printf("%8p %s %4d %c%5d->%c%5d\t",
		       hdr->id, msg_dst_names[req->tofrom], req->node,
		       (hdr->fromtype == BPROC_ROUTE_REAL) ? 'R' :
		       (hdr->fromtype == BPROC_ROUTE_NODE) ? 'N' :
		       (hdr->fromtype == BPROC_ROUTE_GHOST) ? 'G' : '?',
		       hdr->from,
		       (hdr->totype == BPROC_ROUTE_REAL) ? 'R' :
		       (hdr->totype == BPROC_ROUTE_NODE) ? 'N' :
		       (hdr->totype == BPROC_ROUTE_GHOST) ? 'G' : '?', hdr->to);

		printf("%-13s %c %4ld\t",
		       desc_lookup(descs, BPROC_REQUEST(hdr->req)),
		       BPROC_ISRESPONSE(hdr->req) ? 'R' : ' ', hdr->result);

		/* Misc message details */
		switch (hdr->req) {
		case BPROC_VERSION:{
				struct bproc_version_msg_t *msg;
				msg = bproc_debug_msg(req);
				printf("%s-%u-%d  %Ld",
				       msg->vers.version_string,
				       (int)msg->vers.magic,
				       (int)msg->vers.arch,
				       (long long)msg->cookie);
			} break;
		case BPROC_NODE_CONF:{
				struct bproc_conf_msg_t *msg;
				msg = bproc_debug_msg(req);
				printf("time=%ld.%06ld ping=%d masters=%d@%d",
				       msg->time_sec, msg->time_usec,
				       msg->ping_timeout, msg->masters_size,
				       msg->masters);
			} break;
		case BPROC_NODE_PING:{
				struct bproc_ping_msg_t *msg;
				msg = bproc_debug_msg(req);
				printf("time=%ld.%06ld", msg->time_sec,
				       msg->time_usec);
			} break;

		case BPROC_RUN:{
				struct bproc_move_msg_t *msg;
				msg = bproc_debug_msg(req);
				in_addr.s_addr = msg->addr;
				printf
				    ("pid=%d ppid=%d addr=%s:%d chld=%d o/ppid=%d/%d",
				     msg->pid, msg->ppid, inet_ntoa(in_addr),
				     (int)ntohs(msg->port), msg->children,
				     msg->ppid, msg->oppid);
				if (verbose_moves) {
					printf("	  exit signal = %d\n",
					       msg->exit_signal);
					printf("\n");
					printf("	  call_creds (@%d)\n",
					       msg->call_creds);
					print_creds(hdr, msg->call_creds);
					printf("	  proc_creds (@%d)\n",
					       msg->proc_creds);
					print_creds(hdr, msg->proc_creds);
				}
			}
			break;
		case BPROC_EXEC:{
#if 0
				in_addr.s_addr = req->req.bpr_move_addr;
				printf("addr=%s:%d chld=%d o/ppid=%d/%d",
				       inet_ntoa(in_addr),
				       (int)ntohs(req->req.bpr_move_port),
				       req->req.bpr_move_children,
				       req->req.bpr_move_ppid,
				       req->req.bpr_move_oppid);
#endif
			} break;
		case BPROC_RESPONSE(BPROC_RUN):{
				struct bproc_move_msg_t *msg;
				msg = bproc_debug_msg(req);

				/* Move responses can be small... */
				if (msg->hdr.size >= sizeof(*msg)) {
					in_addr.s_addr = msg->addr;
					printf("addr=%s:%d",
					       inet_ntoa(in_addr),
					       (int)ntohs(msg->port));

					if (verbose_moves) {
						printf("\n");
						printf
						    ("	      call_creds (@%d)\n",
						     msg->call_creds);
						print_creds(hdr,
							    msg->call_creds);
						printf
						    ("	      proc_creds (@%d)\n",
						     msg->proc_creds);
						print_creds(hdr,
							    msg->proc_creds);
					}
				}
			}
			break;
		case BPROC_SYS_FORK:{
				struct bproc_rsyscall_msg_t *msg;
				msg = bproc_debug_msg(req);
				printf("flags=0x%lx", msg->arg[0]);
			} break;
		case BPROC_RESPONSE(BPROC_SYS_FORK):{
				struct bproc_fork_resp_t *msg;
				msg = bproc_debug_msg(req);
				printf("oppid=%d ppid=%d", msg->oppid,
				       msg->ppid);
			} break;

		case BPROC_SYS_WAIT:{
				struct bproc_rsyscall_msg_t *msg;
				msg = bproc_debug_msg(req);
				printf("pid=%ld options=0x%lx", msg->arg[0],
				       msg->arg[1]);
			} break;

		case BPROC_PTRACE:{
				struct bproc_ptrace_msg_t *msg =
				    bproc_debug_msg(req);
				printf("%-8.8s pid=%d addr=0x%lx data=0x%lx",
				       desc_lookup(descs_ptrace, msg->request),
				       msg->hdr.to, msg->addr,
				       msg->data.data[0]);
				if (msg->request == PTRACE_ATTACH) {
					printf(" uid=%d gid=%d ce=0x%x",
					       msg->uid, msg->gid,
					       msg->cap_effective);
				}
			}
			break;
		case BPROC_RESPONSE(BPROC_PTRACE):{
				struct bproc_ptrace_msg_t *msg =
				    bproc_debug_msg(req);
				printf("%-8.8s",
				       desc_lookup(descs_ptrace, msg->request));
				if (msg->request == PTRACE_ATTACH) {
					printf(" nlchild_adj=%d",
					       msg->data.data ? 1 : 0);
				}
				if (msg->request == PTRACE_PEEKDATA ||
				    msg->request == PTRACE_PEEKTEXT) {
					int i;
					printf(" addr=0x%0*lx bytes=%d",
					       (int)sizeof(long) * 2, msg->addr,
					       msg->bytes);
					/* ah fun. Cast depends on architecture type. I really love gcc */
					for (i = 0;
					     i < msg->bytes / sizeof(int); i++)
						printf(" %0*lx",
						       (int)sizeof(int) * 2,
						       ((long unsigned int *)
							msg->data.data)[i]);
				}
			} break;
		case BPROC_REPARENT:{
				struct bproc_reparent_msg_t *msg =
				    bproc_debug_msg(req);
				printf("ptrace=0x%x new_parent=%d", msg->ptrace,
				       msg->new_parent);
			} break;

		case BPROC_FWD_SIG:{
				struct bproc_signal_msg_t *sig =
				    bproc_debug_msg(req);
				printf("sig = %d   kill: pid=%d uid=%d",
				       sig->info.si_signo,
				       sig->info._sifields._kill._pid,
				       sig->info._sifields._kill._uid);
			} break;
		case BPROC_SYS_SETPGID:{
				struct bproc_rsyscall_msg_t *msg =
				    bproc_debug_msg(req);
				printf("pid=%ld pgid=%ld", msg->arg[0],
				       msg->arg[1]);
			} break;
		case BPROC_SYS_GETPGID:{
				struct bproc_rsyscall_msg_t *msg =
				    bproc_debug_msg(req);
				printf("pid=%ld", msg->arg[0]);
			} break;
		case BPROC_PGRP_CHANGE:{
				struct bproc_pgrp_msg_t *msg =
				    bproc_debug_msg(req);
				printf("pgid=%d", msg->pgid);
			} break;
		case BPROC_SYS_KILL:{
				struct bproc_signal_msg_t *msg =
				    bproc_debug_msg(req);
				printf("pid=%d sig=%d", msg->pid,
				       msg->info.si_signo);
			} break;
		case BPROC_STOP:
		case BPROC_CONT:
		case BPROC_RESPONSE(BPROC_GET_STATUS):{
				struct bproc_status_msg_t *msg =
				    bproc_debug_msg(req);
				printf("state=%d exit_code=0x%x (vm=%ld %ld)",
				       msg->state, msg->exit_code,
				       msg->vm.statm.size,
				       msg->vm.status.total_vm);
			} break;
		}
	}
	printf("\n");
	fflush(stdout);
}