/** * rtas_print_event * @brief print the contents of an entire rtas event * * @param stream output stream to print to * @param re rtas_event pointer to print out * @param verbosity verbose level of output * @return number of bytes written */ int rtas_print_event(FILE *stream, struct rtas_event *re, int verbosity) { struct scn_header *shdr; int len = 0; if ((stream == NULL) || (re == NULL)) { errno = EFAULT; return 0; } ostream = stream; if (re->event_no != -1) len += print_scn_title("RTAS Event Dump (%d) Begin", re->event_no); else len += print_scn_title("RTAS Event Dump Begin"); for (shdr = re->event_scns; shdr != NULL; shdr = shdr->next) len += rtas_print_scn(stream, shdr, verbosity); if (re->event_no != -1) len += print_scn_title("RTAS Event Dump (%d) End", re->event_no); else len += print_scn_title("RTAS Event Dump End"); return len; }
/** * rtas_print_raw_event * @brief Dump the entire rtas event in raw format * * @param stream ouput stream to write to * @param re rtas_event pointer * @return number of bytes written */ int rtas_print_raw_event(FILE *stream, struct rtas_event *re) { int len = 0; ostream = stream; len += print_scn_title("Raw RTAS Event Begin"); len += print_raw_data(re->buffer, re->event_length); len += print_scn_title("Raw RTAS Event End"); return len; }
/** * print_re_vend_specific_scn * @brief print the contents of a vendor specific section * * @param res rtas_event_scn to print * @param verbosity verbose level * @return number of bytes written */ int print_re_vend_errlog_scn(struct scn_header *shdr, int verbosity) { struct rtas_vend_errlog *ve; int len = 0; if (shdr->scn_id != RTAS_VEND_ERRLOG_SCN) { errno = EFAULT; return -1; } ve = (struct rtas_vend_errlog *)shdr; len += print_scn_title("Vendor Error Log Section"); len += rtas_print("%-20s%c%c%c%c\n", "Vendor ID:", ve->vendor_id[0], ve->vendor_id[1], ve->vendor_id[2], ve->vendor_id[3]); if (ve->vendor_data != NULL) { len += rtas_print("Raw Vendor Error Log:\n"); len += print_raw_data(ve->vendor_data, ve->vendor_data_sz); } return len; }
/** * print_fru_pe_scn * @bried print the contents of a FRU Power Enclosure substructure * * @param fruhdr pointer to the fru_hdr of the FRU PE section to print * @param verbosity verbose level * @returns the number of bytes printed */ static int print_fru_pe_scn(struct rtas_fru_hdr *fruhdr, int verbosity) { struct rtas_fru_pe_scn *fru_pe = (struct rtas_fru_pe_scn *)fruhdr; int len; len = print_scn_title("FRU PE Section"); len += print_fru_hdr(fruhdr, verbosity); len += print_mtms(&fru_pe->pce_mtms); if (fru_pe->pce_name[0] != '\0') len += rtas_print("%-20s%s\n\n", "PCE Name:", fru_pe->pce_name); else len += rtas_print("\n\n"); return len; }
/** * print_cpu_failure * @brief Print the contents of a cpu section * * @param res rtas_event_scn pointer to cpu section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_cpu_scn(struct scn_header *shdr, int verbosity) { struct rtas_cpu_scn *cpu; int len = 0; if (shdr->scn_id != RTAS_CPU_SCN) { errno = EFAULT; return 0; } cpu = (struct rtas_cpu_scn *)shdr; len += print_scn_title("CPU Section"); if (cpu->internal) len += rtas_print("Internal error (not cache).\n"); if (cpu->intcache) len += rtas_print("Internal cache.\n"); if (cpu->extcache_parity) len += rtas_print("External cache parity (or multi-bit).\n"); if (cpu->extcache_ecc) len += rtas_print("External cache ECC.\n"); if (cpu->sysbus_timeout) len += rtas_print("System bus timeout.\n"); if (cpu->io_timeout) len += rtas_print("I/O timeout.\n"); if (cpu->sysbus_parity) len += rtas_print("System bus parity.\n"); if (cpu->sysbus_protocol) len += rtas_print("System bus protocol/transfer.\n"); len += rtas_print(PRNT_FMT_2, "CPU id:", cpu->id, "Failing Element:", cpu->element); len += rtas_print(PRNT_FMT_ADDR, "Failing address:", cpu->failing_address_hi, cpu->failing_address_lo); if ((shdr->re->version >= 4) && (cpu->try_reboot)) len += rtas_print("A reboot of the system may correct the problem.\n"); len += rtas_print("\n"); return len; }
/** * print_re_ibm_diag_scn * @brief print the contents of an IBM diagnostics log section * * @param res rtas_event_scn pointer for IBM diagnostics log section * @param verbosity verbose level of output * @return number of bytes written */ int print_re_ibm_diag_scn(struct scn_header *shdr, int verbosity) { struct rtas_ibm_diag_scn *ibmdiag; int len = 0; if (shdr->scn_id != RTAS_IBM_DIAG_SCN) { errno = EFAULT; return -1; } ibmdiag = (struct rtas_ibm_diag_scn *)shdr; len += print_scn_title("IBM Diagnostics Section"); len += rtas_print(PRNT_FMT"\n", "Event ID:", ibmdiag->event_id); return len; }
/** * print_v6_scn_hdr * @brief print the generic version 6 section header * * @param name section name * @param shdr rtas_v6_scn_hdr pointer * @param verbosity verbose level of output * @return number of bytes written */ int print_v6_hdr(char *name, struct rtas_v6_hdr *v6hdr, int verbosity) { int len; len = print_scn_title(name); if (verbosity > 1) { len += rtas_print("%-20s %c%c "PRNT_FMT_R, "Section ID:", v6hdr->id[0], v6hdr->id[1], "Section Length:", v6hdr->length); len += rtas_print(PRNT_FMT_2, "Version:", v6hdr->version, "Sub_type:", v6hdr->subtype); len += rtas_print(PRNT_FMT_R, "Component ID:", v6hdr->creator_comp_id); } return len; }
/** * print_re_fru_scn * @brief print the contents of an FRU section * * @param res rtas_event_scn pointer for a fru section * @param verbosity verbose level of output * @param count current fru section number that we are printing * @return number of bytes written */ int print_re_fru_scn(struct rtas_fru_scn *fru, int verbosity, int count) { struct rtas_fru_hdr *fruhdr; int len = 0; len += print_scn_title("FRU Section (%d)", count); if (verbosity >= 2) { len += rtas_print(PRNT_FMT_2, "Length:", fru->length, "Call-Out Type:", fru->type); len += rtas_print("%-20s%-8s %-20s%-8s\n", "Fru ID Included:", (fru->fru_id_included) ? "Yes" : "No", "Fru Subscns:", (fru->fru_subscn_included) ? "Yes" : "No"); } len += print_fru_priority(fru->priority); if (fru->loc_code_length) { if (verbosity >= 2) len += rtas_print(PRNT_FMT_R, "Loc Code Length:", fru->loc_code_length); len += rtas_print("%-20s%s\n", "Location Code:", fru->loc_code); } len += rtas_print("\n"); for (fruhdr = fru->subscns; fruhdr != NULL; fruhdr = fruhdr->next) { if (strncmp(fruhdr->id, "ID", 2) == 0) len += print_fru_id_scn(fruhdr, verbosity); else if (strncmp(fruhdr->id, "PE", 2) == 0) len += print_fru_pe_scn(fruhdr, verbosity); else if (strncmp(fruhdr->id, "MR", 2) == 0) len += print_fru_mr_scn(fruhdr, verbosity); } return len; }
/** * print_fru_mr_scn * @bried print the contents of a FRU Manufacturing Replaceable substructure * * @param fruhdr pointer to the fru_hdr of the FRU MR section to print * @param verbosity verbose level * @returns the number of bytes printed */ static int print_fru_mr_scn(struct rtas_fru_hdr *fruhdr, int verbosity) { struct rtas_fru_mr_scn *fru_mr = (struct rtas_fru_mr_scn *)fruhdr; int i, len; len = print_scn_title("FRU MR Section"); len += print_fru_hdr(fruhdr, verbosity); len += rtas_print("\nManufacturing Replaceable Unit Fields (%d):\n", frumr_num_callouts(fru_mr)); for (i = 0; i < frumr_num_callouts(fru_mr); i++) { struct fru_mru *mru = &fru_mr->mrus[i]; len += rtas_print("%-20s%c %-20s%08x\n", "MRU Priority:", mru->priority, "MRU ID:", mru->id); } len += rtas_print("\n"); return len; }
/** * print_fru_id_scn * @bried print the contents of a FRU Identity substructure * * @param fruhdr pointer to the fru_hdr of the FRU ID section to print * @param verbosity verbose level * @returns the number of bytes printed */ static int print_fru_id_scn(struct rtas_fru_hdr *fruhdr, int verbosity) { struct rtas_fru_id_scn *fru_id = (struct rtas_fru_id_scn *)fruhdr; int len; uint32_t component; len = print_scn_title("FRU ID Section"); len += print_fru_hdr(fruhdr, verbosity); component = fru_id->fruhdr.flags & RTAS_FRUID_COMP_MASK; if (component) { len += rtas_print(PRNT_FMT" ", "Failing Component:", component); switch (component) { case RTAS_FRUID_COMP_HARDWARE: len += rtas_print("(\"normal\" hardware FRU)\n"); break; case RTAS_FRUID_COMP_CODE: len += rtas_print("(Code FRU)\n"); break; case RTAS_FRUID_COMP_CONFIG_ERROR: len += rtas_print("(Configuration error)\n"); break; case RTAS_FRUID_COMP_MAINT_REQUIRED: len += rtas_print("(Mainteneace procedure required)\n"); break; case RTAS_FRUID_COMP_EXTERNAL: len += rtas_print("(External FRU)\n"); break; case RTAS_FRUID_COMP_EXTERNAL_CODE: len += rtas_print("(External Code FRU)\n"); break; case RTAS_FRUID_COMP_TOOL: len += rtas_print("(Tool FRU)\n"); break; case RTAS_FRUID_COMP_SYMBOLIC: len += rtas_print("(Symbolic FRU)\n"); break; default: len += rtas_print("\n"); break; } } if (fruid_has_part_no(fru_id)) len += rtas_print("%-20s%s\n", "FRU Stocking Part:", fru_id->part_no); if (fruid_has_proc_id(fru_id)) len += rtas_print("%-20s%s\n", "Procedure ID:", fru_id->procedure_id); if (fruid_has_ccin(fru_id)) len += rtas_print("%-20s%s\n", "CCIN:", fru_id->ccin); if (fruid_has_serial_no(fru_id)) len += rtas_print("%-20s%s\n", "Serial Number:", fru_id->serial_no); len += rtas_print("\n"); return len; }