z90hardware.c

来自「linux2.6.16版本」· C语言 代码 · 共 2,426 行 · 第 1/5 页

C
2,426
字号
	 "	.long	2b		\n"	 "4:				\n"	 "	l	1,0(1)		\n"	 "	br	1		\n"	 ".previous			\n"	 ".section __ex_table,\"a\"	\n"	 "	.align	4		\n"	 "	.long	0b,3b		\n"	 "	.long	1b,3b		\n"	 ".previous"	 :"=d" (ccode),"=d" (*stat)	 :"d" (msg_len),"a" (msg_ext), "K" (DEV_SEN_EXCEPTION)	 :"cc","0","1","2","3","6","7","memory");#endif	return ccode;}static inline intrec(int q_nr, int buff_l, unsigned char *rsp, unsigned char *id,    struct ap_status_word *st){	int ccode;	asm volatile#ifdef CONFIG_64BIT	("	llgfr	0,%2		\n"	 "	lgr	3,%4		\n"	 "	lgr	6,%3		\n"	 "	llgfr	7,%5		\n"	 "	lghi	1,128		\n"	 "	sll	1,24		\n"	 "	or	0,1		\n"	 "	slgr	1,1		\n"	 "	lgr	2,1		\n"	 "	lgr	4,1		\n"	 "	lgr	5,1		\n"	 "0:	.long	0xb2ae0046	\n"	 "1:	brc	2,0b		\n"	 "	brc	4,0b		\n"	 "	ipm	%0		\n"	 "	srl	%0,28		\n"	 "	iihh	%0,0		\n"	 "	iihl	%0,0		\n"	 "	lgr	%1,1		\n"	 "	st	4,0(3)		\n"	 "	st	5,4(3)		\n"	 "2:				\n"	 ".section .fixup,\"ax\"	\n"	 "3:				\n"	 "	lhi   %0,%h6		\n"	 "	jg    2b		\n"	 ".previous			\n"	 ".section __ex_table,\"a\"	\n"	 "   .align	8		\n"	 "   .quad	0b,3b		\n"	 "   .quad	1b,3b		\n"	 ".previous"	 :"=d"(ccode),"=d"(*st)	 :"d" (q_nr), "d" (rsp), "d" (id), "d" (buff_l), "K" (DEV_REC_EXCEPTION)	 :"cc","0","1","2","3","4","5","6","7","memory");#else	("	lr	0,%2		\n"	 "	lr	3,%4		\n"	 "	lr	6,%3		\n"	 "	lr	7,%5		\n"	 "	lhi	1,128		\n"	 "	sll	1,24		\n"	 "	or	0,1		\n"	 "	slr	1,1		\n"	 "	lr	2,1		\n"	 "	lr	4,1		\n"	 "	lr	5,1		\n"	 "0:	.long	0xb2ae0046	\n"	 "1:	brc	2,0b		\n"	 "	brc	4,0b		\n"	 "	ipm	%0		\n"	 "	srl	%0,28		\n"	 "	lr	%1,1		\n"	 "	st	4,0(3)		\n"	 "	st	5,4(3)		\n"	 "2:				\n"	 ".section .fixup,\"ax\"	\n"	 "3:				\n"	 "	lhi   %0,%h6		\n"	 "	bras  1,4f		\n"	 "	.long 2b		\n"	 "4:				\n"	 "	l     1,0(1)		\n"	 "	br    1			\n"	 ".previous			\n"	 ".section __ex_table,\"a\"	\n"	 "   .align	4		\n"	 "   .long	0b,3b		\n"	 "   .long	1b,3b		\n"	 ".previous"	 :"=d"(ccode),"=d"(*st)	 :"d" (q_nr), "d" (rsp), "d" (id), "d" (buff_l), "K" (DEV_REC_EXCEPTION)	 :"cc","0","1","2","3","4","5","6","7","memory");#endif	return ccode;}static inline voiditoLe2(int *i_p, unsigned char *lechars){	*lechars       = *((unsigned char *) i_p + sizeof(int) - 1);	*(lechars + 1) = *((unsigned char *) i_p + sizeof(int) - 2);}static inline voidle2toI(unsigned char *lechars, int *i_p){	unsigned char *ic_p;	*i_p = 0;	ic_p = (unsigned char *) i_p;	*(ic_p + 2) = *(lechars + 1);	*(ic_p + 3) = *(lechars);}static inline intis_empty(unsigned char *ptr, int len){	return !memcmp(ptr, (unsigned char *) &static_pvt_me_key+60, len);}enum hdstatquery_online(int deviceNr, int cdx, int resetNr, int *q_depth, int *dev_type){	int q_nr, i, t_depth, t_dev_type;	enum devstat ccode;	struct ap_status_word stat_word;	enum hdstat stat;	int break_out;	q_nr = (deviceNr << SKIP_BITL) + cdx;	stat = HD_BUSY;	ccode = testq(q_nr, &t_depth, &t_dev_type, &stat_word);	PDEBUG("ccode %d response_code %02X\n", ccode, stat_word.response_code);	break_out = 0;	for (i = 0; i < resetNr; i++) {		if (ccode > 3) {			PRINTKC("Exception testing device %d\n", i);			return HD_TSQ_EXCEPTION;		}		switch (ccode) {		case 0:			PDEBUG("t_dev_type %d\n", t_dev_type);			break_out = 1;			stat = HD_ONLINE;			*q_depth = t_depth + 1;			switch (t_dev_type) {			case PCICA_HW:				*dev_type = PCICA;				break;			case PCICC_HW:				*dev_type = PCICC;				break;			case PCIXCC_HW:				*dev_type = PCIXCC_UNK;				break;			case CEX2C_HW:				*dev_type = CEX2C;				break;			case CEX2A_HW:				*dev_type = CEX2A;				break;			default:				*dev_type = NILDEV;				break;			}			PDEBUG("available device %d: Q depth = %d, dev "			       "type = %d, stat = %02X%02X%02X%02X\n",			       deviceNr, *q_depth, *dev_type,			       stat_word.q_stat_flags,			       stat_word.response_code,			       stat_word.reserved[0],			       stat_word.reserved[1]);			break;		case 3:			switch (stat_word.response_code) {			case AP_RESPONSE_NORMAL:				stat = HD_ONLINE;				break_out = 1;				*q_depth = t_depth + 1;				*dev_type = t_dev_type;				PDEBUG("cc3, available device "				       "%d: Q depth = %d, dev "				       "type = %d, stat = "				       "%02X%02X%02X%02X\n",				       deviceNr, *q_depth,				       *dev_type,				       stat_word.q_stat_flags,				       stat_word.response_code,				       stat_word.reserved[0],				       stat_word.reserved[1]);				break;			case AP_RESPONSE_Q_NOT_AVAIL:				stat = HD_NOT_THERE;				break_out = 1;				break;			case AP_RESPONSE_RESET_IN_PROGRESS:				PDEBUG("device %d in reset\n",				       deviceNr);				break;			case AP_RESPONSE_DECONFIGURED:				stat = HD_DECONFIGURED;				break_out = 1;				break;			case AP_RESPONSE_CHECKSTOPPED:				stat = HD_CHECKSTOPPED;				break_out = 1;				break;			case AP_RESPONSE_BUSY:				PDEBUG("device %d busy\n",				       deviceNr);				break;			default:				break;			}			break;		default:			stat = HD_NOT_THERE;			break_out = 1;			break;		}		if (break_out)			break;		udelay(5);		ccode = testq(q_nr, &t_depth, &t_dev_type, &stat_word);	}	return stat;}enum devstatreset_device(int deviceNr, int cdx, int resetNr){	int q_nr, ccode = 0, dummy_qdepth, dummy_devType, i;	struct ap_status_word stat_word;	enum devstat stat;	int break_out;	q_nr = (deviceNr << SKIP_BITL) + cdx;	stat = DEV_GONE;	ccode = resetq(q_nr, &stat_word);	if (ccode > 3)		return DEV_RSQ_EXCEPTION;	break_out = 0;	for (i = 0; i < resetNr; i++) {		switch (ccode) {		case 0:			stat = DEV_ONLINE;			if (stat_word.q_stat_flags & AP_Q_STATUS_EMPTY)				break_out = 1;			break;		case 3:			switch (stat_word.response_code) {			case AP_RESPONSE_NORMAL:				stat = DEV_ONLINE;				if (stat_word.q_stat_flags & AP_Q_STATUS_EMPTY)					break_out = 1;				break;			case AP_RESPONSE_Q_NOT_AVAIL:			case AP_RESPONSE_DECONFIGURED:			case AP_RESPONSE_CHECKSTOPPED:				stat = DEV_GONE;				break_out = 1;				break;			case AP_RESPONSE_RESET_IN_PROGRESS:			case AP_RESPONSE_BUSY:			default:				break;			}			break;		default:			stat = DEV_GONE;			break_out = 1;			break;		}		if (break_out == 1)			break;		udelay(5);		ccode = testq(q_nr, &dummy_qdepth, &dummy_devType, &stat_word);		if (ccode > 3) {			stat = DEV_TSQ_EXCEPTION;			break;		}	}	PDEBUG("Number of testq's needed for reset: %d\n", i);	if (i >= resetNr) {	  stat = DEV_GONE;	}	return stat;}#ifdef DEBUG_HYDRA_MSGSstatic inline voidprint_buffer(unsigned char *buffer, int bufflen){	int i;	for (i = 0; i < bufflen; i += 16) {		PRINTK("%04X: %02X%02X%02X%02X %02X%02X%02X%02X "		       "%02X%02X%02X%02X %02X%02X%02X%02X\n", i,		       buffer[i+0], buffer[i+1], buffer[i+2], buffer[i+3],		       buffer[i+4], buffer[i+5], buffer[i+6], buffer[i+7],		       buffer[i+8], buffer[i+9], buffer[i+10], buffer[i+11],		       buffer[i+12], buffer[i+13], buffer[i+14], buffer[i+15]);	}}#endifenum devstatsend_to_AP(int dev_nr, int cdx, int msg_len, unsigned char *msg_ext){	struct ap_status_word stat_word;	enum devstat stat;	int ccode;	u32 *q_nr_p = (u32 *)msg_ext;	*q_nr_p = (dev_nr << SKIP_BITL) + cdx;	PDEBUG("msg_len passed to sen: %d\n", msg_len);	PDEBUG("q number passed to sen: %02x%02x%02x%02x\n",	       msg_ext[0], msg_ext[1], msg_ext[2], msg_ext[3]);	stat = DEV_GONE;#ifdef DEBUG_HYDRA_MSGS	PRINTK("Request header: %02X%02X%02X%02X %02X%02X%02X%02X "	       "%02X%02X%02X%02X\n",	       msg_ext[0], msg_ext[1], msg_ext[2], msg_ext[3],	       msg_ext[4], msg_ext[5], msg_ext[6], msg_ext[7],	       msg_ext[8], msg_ext[9], msg_ext[10], msg_ext[11]);	print_buffer(msg_ext+CALLER_HEADER, msg_len);#endif	ccode = sen(msg_len, msg_ext, &stat_word);	if (ccode > 3)		return DEV_SEN_EXCEPTION;	PDEBUG("nq cc: %u, st: %02x%02x%02x%02x\n",	       ccode, stat_word.q_stat_flags, stat_word.response_code,	       stat_word.reserved[0], stat_word.reserved[1]);	switch (ccode) {	case 0:		stat = DEV_ONLINE;		break;	case 1:		stat = DEV_GONE;		break;	case 3:		switch (stat_word.response_code) {		case AP_RESPONSE_NORMAL:			stat = DEV_ONLINE;			break;		case AP_RESPONSE_Q_FULL:			stat = DEV_QUEUE_FULL;			break;		default:			stat = DEV_GONE;			break;		}		break;	default:		stat = DEV_GONE;		break;	}	return stat;}enum devstatreceive_from_AP(int dev_nr, int cdx, int resplen, unsigned char *resp,		unsigned char *psmid){	int ccode;	struct ap_status_word stat_word;	enum devstat stat;	memset(resp, 0x00, 8);	ccode = rec((dev_nr << SKIP_BITL) + cdx, resplen, resp, psmid,		    &stat_word);	if (ccode > 3)		return DEV_REC_EXCEPTION;	PDEBUG("dq cc: %u, st: %02x%02x%02x%02x\n",	       ccode, stat_word.q_stat_flags, stat_word.response_code,	       stat_word.reserved[0], stat_word.reserved[1]);	stat = DEV_GONE;	switch (ccode) {	case 0:		stat = DEV_ONLINE;#ifdef DEBUG_HYDRA_MSGS		print_buffer(resp, resplen);#endif		break;	case 3:		switch (stat_word.response_code) {		case AP_RESPONSE_NORMAL:			stat = DEV_ONLINE;			break;		case AP_RESPONSE_NO_PENDING_REPLY:			if (stat_word.q_stat_flags & AP_Q_STATUS_EMPTY)				stat = DEV_EMPTY;			else				stat = DEV_NO_WORK;			break;		case AP_RESPONSE_INDEX_TOO_BIG:		case AP_RESPONSE_NO_FIRST_PART:		case AP_RESPONSE_MESSAGE_TOO_BIG:			stat = DEV_BAD_MESSAGE;			break;		default:			break;		}		break;	default:		break;	}	return stat;}static inline intpad_msg(unsigned char *buffer, int  totalLength, int msgLength){	int pad_len;	for (pad_len = 0; pad_len < (totalLength - msgLength); pad_len++)		if (buffer[pad_len] != 0x00)			break;	pad_len -= 3;	if (pad_len < 8)		return SEN_PAD_ERROR;	buffer[0] = 0x00;	buffer[1] = 0x02;	memcpy(buffer+2, static_pad, pad_len);	buffer[pad_len + 2] = 0x00;	return 0;}static inline intis_common_public_key(unsigned char *key, int len){	int i;	for (i = 0; i < len; i++)		if (key[i])			break;	key += i;	len -= i;	if (((len == 1) && (key[0] == 3)) ||	    ((len == 3) && (key[0] == 1) && (key[1] == 0) && (key[2] == 1)))		return 1;	return 0;}static intICAMEX_msg_to_type4MEX_msg(struct ica_rsa_modexpo *icaMex_p, int *z90cMsg_l_p,			   union type4_msg *z90cMsg_p){	int mod_len, msg_size, mod_tgt_len, exp_tgt_len, inp_tgt_len;	unsigned char *mod_tgt, *exp_tgt, *inp_tgt;	union type4_msg *tmp_type4_msg;	mod_len = icaMex_p->inputdatalength;	msg_size = ((mod_len <= 128) ? TYPE4_SME_LEN : TYPE4_LME_LEN) +		    CALLER_HEADER;	memset(z90cMsg_p, 0, msg_size);	tmp_type4_msg = (union type4_msg *)		((unsigned char *) z90cMsg_p + CALLER_HEADER);	tmp_type4_msg->sme.header.msg_type_code = TYPE4_TYPE_CODE;

⌨️ 快捷键说明

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