z90hardware.c
来自「LINUX 2.6.17.4的源码」· 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 + -
显示快捷键?