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

📄 err_titan.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
voidtitan_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs){	struct el_common *mchk_header = (struct el_common *)la_ptr;	struct el_TITAN_sysdata_mcheck *tmchk =		(struct el_TITAN_sysdata_mcheck *)		((unsigned long)mchk_header + mchk_header->sys_offset);	u64 irqmask;	/*	 * Mask of Titan interrupt sources which are reported as machine checks	 *	 * 63 - CChip Error	 * 62 - PChip 0 H_Error	 * 61 - PChip 1 H_Error	 * 60 - PChip 0 C_Error	 * 59 - PChip 1 C_Error	 */#define TITAN_MCHECK_INTERRUPT_MASK	0xF800000000000000UL	/*	 * Sync the processor	 */	mb();	draina();		/*	 * Only handle system errors here 	 */	if ((vector != SCB_Q_SYSMCHK) && (vector != SCB_Q_SYSERR)) {		ev6_machine_check(vector, la_ptr, regs);		return;	}	/* 	 * It's a system error, handle it here	 *	 * The PALcode has already cleared the error, so just parse it	 */		/* 	 * Parse the logout frame without printing first. If the only error(s)	 * found are classified as "dismissable", then just dismiss them and	 * don't print any message	 */	if (titan_process_logout_frame(mchk_header, 0) != 	    MCHK_DISPOSITION_DISMISS) {		char *saved_err_prefix = err_print_prefix;		err_print_prefix = KERN_CRIT;		/*		 * Either a nondismissable error was detected or no		 * recognized error was detected  in the logout frame 		 * -- report the error in either case		 */		printk("%s"		       "*System %s Error (Vector 0x%x) reported on CPU %d:\n", 		       err_print_prefix,		       (vector == SCB_Q_SYSERR)?"Correctable":"Uncorrectable",		       (unsigned int)vector, (int)smp_processor_id());		#ifdef CONFIG_VERBOSE_MCHECK		titan_process_logout_frame(mchk_header, alpha_verbose_mcheck);		if (alpha_verbose_mcheck)			dik_show_regs(regs, NULL);#endif /* CONFIG_VERBOSE_MCHECK */		err_print_prefix = saved_err_prefix;		/*		 * Convert any pending interrupts which report as system		 * machine checks to interrupts		 */		irqmask = tmchk->c_dirx & TITAN_MCHECK_INTERRUPT_MASK;		titan_dispatch_irqs(irqmask, regs);	}		/* 	 * Release the logout frame 	 */	wrmces(0x7);	mb();}/* * Subpacket Annotations */static char *el_titan_pchip0_extended_annotation[] = {	"Subpacket Header", 	"P0_SCTL",	"P0_SERREN",	"P0_APCTL",		"P0_APERREN",	"P0_AGPERREN",	"P0_ASPRST",		"P0_AWSBA0",	"P0_AWSBA1",	"P0_AWSBA2",		"P0_AWSBA3",	"P0_AWSM0",	"P0_AWSM1",		"P0_AWSM2",	"P0_AWSM3",	"P0_ATBA0",		"P0_ATBA1",	"P0_ATBA2",	"P0_ATBA3",		"P0_GPCTL",	"P0_GPERREN",	"P0_GSPRST",		"P0_GWSBA0",	"P0_GWSBA1",	"P0_GWSBA2",		"P0_GWSBA3",	"P0_GWSM0",	"P0_GWSM1",		"P0_GWSM2",	"P0_GWSM3",	"P0_GTBA0",		"P0_GTBA1",	"P0_GTBA2",	"P0_GTBA3",		NULL };static char *el_titan_pchip1_extended_annotation[] = {	"Subpacket Header", 	"P1_SCTL",	"P1_SERREN",	"P1_APCTL",		"P1_APERREN",	"P1_AGPERREN",	"P1_ASPRST",		"P1_AWSBA0",	"P1_AWSBA1",	"P1_AWSBA2",		"P1_AWSBA3",	"P1_AWSM0",	"P1_AWSM1",		"P1_AWSM2",	"P1_AWSM3",	"P1_ATBA0",		"P1_ATBA1",	"P1_ATBA2",	"P1_ATBA3",		"P1_GPCTL",	"P1_GPERREN",	"P1_GSPRST",		"P1_GWSBA0",	"P1_GWSBA1",	"P1_GWSBA2",		"P1_GWSBA3",	"P1_GWSM0",	"P1_GWSM1",		"P1_GWSM2",	"P1_GWSM3",	"P1_GTBA0",		"P1_GTBA1",	"P1_GTBA2",	"P1_GTBA3",		NULL };static char *el_titan_memory_extended_annotation[] = {	"Subpacket Header", 	"AAR0",		"AAR1",	"AAR2",			"AAR3",		"P0_SCTL",	"P0_GPCTL",		"P0_APCTL",	"P1_SCTL",	"P1_GPCTL",		"P1_SCTL",	NULL };static struct el_subpacket_annotation el_titan_annotations[] = {	SUBPACKET_ANNOTATION(EL_CLASS__REGATTA_FAMILY,			     EL_TYPE__REGATTA__TITAN_PCHIP0_EXTENDED,			     1,			     "Titan PChip 0 Extended Frame",			     el_titan_pchip0_extended_annotation),	SUBPACKET_ANNOTATION(EL_CLASS__REGATTA_FAMILY,			     EL_TYPE__REGATTA__TITAN_PCHIP1_EXTENDED,			     1,			     "Titan PChip 1 Extended Frame",			     el_titan_pchip1_extended_annotation),	SUBPACKET_ANNOTATION(EL_CLASS__REGATTA_FAMILY,			     EL_TYPE__REGATTA__TITAN_MEMORY_EXTENDED,			     1,			     "Titan Memory Extended Frame",			     el_titan_memory_extended_annotation),	SUBPACKET_ANNOTATION(EL_CLASS__REGATTA_FAMILY,			     EL_TYPE__TERMINATION__TERMINATION,			     1,			     "Termination Subpacket",			     NULL)};static struct el_subpacket *el_process_regatta_subpacket(struct el_subpacket *header){	int status;	if (header->class != EL_CLASS__REGATTA_FAMILY) {		printk("%s  ** Unexpected header CLASS %d TYPE %d, aborting\n",		       err_print_prefix,		       header->class, header->type);		return NULL;	}	switch(header->type) {	case EL_TYPE__REGATTA__PROCESSOR_ERROR_FRAME:	case EL_TYPE__REGATTA__SYSTEM_ERROR_FRAME:	case EL_TYPE__REGATTA__ENVIRONMENTAL_FRAME:	case EL_TYPE__REGATTA__PROCESSOR_DBL_ERROR_HALT:	case EL_TYPE__REGATTA__SYSTEM_DBL_ERROR_HALT:		printk("%s  ** Occurred on CPU %d:\n", 		       err_print_prefix,		       (int)header->by_type.regatta_frame.cpuid);		status = privateer_process_logout_frame((struct el_common *)			header->by_type.regatta_frame.data_start, 1);		break;	default:		printk("%s  ** REGATTA TYPE %d SUBPACKET\n", 		       err_print_prefix, header->type);		el_annotate_subpacket(header);		break;	}	return (struct el_subpacket *)((unsigned long)header + header->length);} static struct el_subpacket_handler titan_subpacket_handler = 	SUBPACKET_HANDLER_INIT(EL_CLASS__REGATTA_FAMILY, 			       el_process_regatta_subpacket);voidtitan_register_error_handlers(void){	size_t i;	for (i = 0; i < ARRAY_SIZE (el_titan_annotations); i++)		cdl_register_subpacket_annotation(&el_titan_annotations[i]);	cdl_register_subpacket_handler(&titan_subpacket_handler);	ev6_register_error_handlers();}/* * Privateer */static intprivateer_process_680_frame(struct el_common *mchk_header, int print){	int status = MCHK_DISPOSITION_UNKNOWN_ERROR;#ifdef CONFIG_VERBOSE_MCHECK	struct el_PRIVATEER_envdata_mcheck *emchk =		(struct el_PRIVATEER_envdata_mcheck *)		((unsigned long)mchk_header + mchk_header->sys_offset);	/* TODO - catagorize errors, for now, no error */	if (!print)		return status;	/* TODO - decode instead of just dumping... */	printk("%s  Summary Flags:         %016lx\n" 	         "  CChip DIRx:            %016lx\n"		 "  System Management IR:  %016lx\n"		 "  CPU IR:                %016lx\n"		 "  Power Supply IR:       %016lx\n"		 "  LM78 Fault Status:     %016lx\n"		 "  System Doors:          %016lx\n"		 "  Temperature Warning:   %016lx\n"		 "  Fan Control:           %016lx\n"		 "  Fatal Power Down Code: %016lx\n",	       err_print_prefix,	       emchk->summary,	       emchk->c_dirx,	       emchk->smir,	       emchk->cpuir,	       emchk->psir,	       emchk->fault,	       emchk->sys_doors,	       emchk->temp_warn,	       emchk->fan_ctrl,	       emchk->code);#endif /* CONFIG_VERBOSE_MCHECK */	return status;}intprivateer_process_logout_frame(struct el_common *mchk_header, int print){	struct el_common_EV6_mcheck *ev6mchk = 		(struct el_common_EV6_mcheck *)mchk_header;	int status = MCHK_DISPOSITION_UNKNOWN_ERROR;	/*	 * Machine check codes	 */#define PRIVATEER_MCHK__CORR_ECC		0x86	/* 630 */#define PRIVATEER_MCHK__DC_TAG_PERR		0x9E	/* 630 */#define PRIVATEER_MCHK__PAL_BUGCHECK		0x8E	/* 670 */#define PRIVATEER_MCHK__OS_BUGCHECK		0x90	/* 670 */#define PRIVATEER_MCHK__PROC_HRD_ERR		0x98	/* 670 */#define PRIVATEER_MCHK__ISTREAM_CMOV_PRX	0xA0	/* 670 */#define PRIVATEER_MCHK__ISTREAM_CMOV_FLT	0xA2	/* 670 */#define PRIVATEER_MCHK__SYS_HRD_ERR		0x202	/* 660 */#define PRIVATEER_MCHK__SYS_CORR_ERR		0x204	/* 620 */#define PRIVATEER_MCHK__SYS_ENVIRON		0x206	/* 680 */	switch(ev6mchk->MCHK_Code) {	/*	 * Vector 630 - Processor, Correctable	 */	case PRIVATEER_MCHK__CORR_ECC:	case PRIVATEER_MCHK__DC_TAG_PERR:		/*		 * Fall through to vector 670 for processing...		 */	/*	 * Vector 670 - Processor, Uncorrectable	 */	case PRIVATEER_MCHK__PAL_BUGCHECK:	case PRIVATEER_MCHK__OS_BUGCHECK:	case PRIVATEER_MCHK__PROC_HRD_ERR:	case PRIVATEER_MCHK__ISTREAM_CMOV_PRX:	case PRIVATEER_MCHK__ISTREAM_CMOV_FLT:		status |= ev6_process_logout_frame(mchk_header, print);		break;	/*	 * Vector 620 - System, Correctable	 */	case PRIVATEER_MCHK__SYS_CORR_ERR:		/*		 * Fall through to vector 660 for processing...		 */	/*	 * Vector 660 - System, Uncorrectable	 */	case PRIVATEER_MCHK__SYS_HRD_ERR:		status |= titan_process_logout_frame(mchk_header, print);		break;	/* 	 * Vector 680 - System, Environmental	 */	case PRIVATEER_MCHK__SYS_ENVIRON:	/* System, Environmental */		status |= privateer_process_680_frame(mchk_header, print);		break;	/* 	 * Unknown	 */	default:		status |= MCHK_DISPOSITION_REPORT;		if (print) {			printk("%s** Unknown Error, frame follows\n", 			       err_print_prefix);			mchk_dump_logout_frame(mchk_header);		}	}	return status;}voidprivateer_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs){	struct el_common *mchk_header = (struct el_common *)la_ptr;	struct el_TITAN_sysdata_mcheck *tmchk =		(struct el_TITAN_sysdata_mcheck *)		(la_ptr + mchk_header->sys_offset);	u64 irqmask;	char *saved_err_prefix = err_print_prefix;#define PRIVATEER_680_INTERRUPT_MASK		(0xE00UL)#define PRIVATEER_HOTPLUG_INTERRUPT_MASK	(0xE00UL)	/*	 * Sync the processor.	 */	mb();	draina();	/* 	 * Only handle system events here.	 */	if (vector != SCB_Q_SYSEVENT) 		return titan_machine_check(vector, la_ptr, regs);	/*	 * Report the event - System Events should be reported even if no	 * error is indicated since the event could indicate the return	 * to normal status.	 */	err_print_prefix = KERN_CRIT;	printk("%s*System Event (Vector 0x%x) reported on CPU %d:\n", 	       err_print_prefix,	       (unsigned int)vector, (int)smp_processor_id());	privateer_process_680_frame(mchk_header, 1);	err_print_prefix = saved_err_prefix;		/* 	 * Convert any pending interrupts which report as 680 machine	 * checks to interrupts.	 */	irqmask = tmchk->c_dirx & PRIVATEER_680_INTERRUPT_MASK;	/*	 * Dispatch the interrupt(s).	 */	titan_dispatch_irqs(irqmask, regs);	/* 	 * Release the logout frame.	 */	wrmces(0x7);	mb();}

⌨️ 快捷键说明

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