----- Original Message ----- > This patch adds support in crash-utility to dump opal console buffer for PPC64 > by adding -o option in mach command. Currently start address and size of opal > console log buffer is hard-coded. > As this option is specific to POWER, it is coded as such. Hello Ankit, OK, this looks good. I went ahead and addressed these compiler warnings: $ make warn TARGET: PPC64 CRASH: 7.1.8rc19 GDB: 7.6 cc -c -g -DPPC64 -DGDB_7_6 build_data.c -Wall -O2 -Wstrict-prototypes -Wmissing-prototypes -fstack-protector -Wformat-security cc -c -g -DPPC64 -DGDB_7_6 ppc64.c -Wall -O2 -Wstrict-prototypes -Wmissing-prototypes -fstack-protector -Wformat-security ppc64.c:2747:1: warning: no previous prototype for ‘opalmsg’ [-Wmissing-prototypes] opalmsg(void) ^ ppc64.c: In function ‘opalmsg’: ppc64.c:2815:3: warning: implicit declaration of function ‘isprint’ [-Wimplicit-function-declaration] if (isprint(mem.u8)) { ^ ppc64.c:2764:8: warning: unused variable ‘addrtype’ [-Wunused-variable] char *addrtype; ^ ppc64.c:2761:17: warning: unused variable ‘sz’ [-Wunused-variable] size_t typesz, sz; ^ I also fixed up the help page a bit, and replaced the fprintf(fp) error messages in ppc64_cmd_mach() with error(FATAL) calls. The borrowing of the memloc structure from the generic display_memory() function is overkill, but I left it alone in case you ever want extend the function to read non-ASCII data (?). Queued for crash-7.1.8: https://github.com/crash-utility/crash/commit/1a4af84dbda299bcf0a54b1e76eb963f3bbff98b Thanks, Dave > > Here is the sample output of 'mach' command with '-o' option: > crash> mach -o > [ 65.219056911,5] SkiBoot skiboot-5.4.0-218-ge0225cc-mukesh-dirty-df9a248 > starting... > [ 65.219065872,5] initial console log level: memory 7, driver 5 > [ 65.219068917,6] CPU: P8 generation processor(max 8 threads/core) > [ 65.219071681,7] CPU: Boot CPU PIR is 0x0060 PVR is 0x004d0200 > [ 65.219074685,7] CPU: Initial max PIR set to 0x1fff > [ 65.219602559,5] OPAL table: 0x300c7440 .. 0x300c78d0, branch table: > 0x30002000 > [ 65.219607955,5] FDT: Parsing fdt @0xff00000 > [ 65.225380389,5] XSCOM: chip 0x8 at 0x3fc4000000000 [P8 DD2.0] > [ 65.225387919,6] XSTOP: XSCOM addr = 0x2010c82, FIR bit = 31 > [ 491.377710151,7] PHB#0022: LINK: Link is up > [ 494.026291523,7] BT: seq 0x25 netfn 0x0a cmd 0x48: Message sent to host > [ 494.027636927,7] BT: seq 0x25 netfn 0x0a cmd 0x48: IPMI MSG done > > Log for dump collected on non OPAL ppc machine: > crash> mach -o > Dump was not captured on an OPAL based machine > > crash> help mach > > NAME > mach - machine specific data > > SYNOPSIS > mach [-m | -c | -o -[xd]] > > DESCRIPTION > This command displays data specific to a machine type. > ... > -o Display opal console log in crash (ppc64 only). > > Display opal console log in crash: > > crash> mach -o > [ 65.219056911,5] SkiBoot skiboot-5.4.0-218-ge0225cc-df9a248 > starting... > [ 65.219065872,5] initial console log level: memory 7, driver 5 > [ 65.219068917,6] CPU: P8 generation processor(max 8 threads/core) > [ 65.219071681,7] CPU: Boot CPU PIR is 0x0060 PVR is 0x004d0200 > [ 65.219074685,7] CPU: Initial max PIR set to 0x1fff > [ 65.219607955,5] FDT: Parsing fdt @0xff00000 > [ 494.026291523,7] BT: seq 0x25 netfn 0x0a cmd 0x48: Message sent to > host > [ 494.027636927,7] BT: seq 0x25 netfn 0x0a cmd 0x48: IPMI MSG done > > Signed-off-by: Ankit Kumar <ankit@xxxxxxxxxxxxxxxxxx> > --- > > Changelog since v1:(Worked on suggestion given by Dave Anderson) > - Implemented opalmsg as part of 'mach -o' option. > > help.c | 14 ++++++++- > ppc64.c | 104 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 116 insertions(+), 2 deletions(-) > > diff --git a/help.c b/help.c > index 1503a7c..45890b2 100644 > --- a/help.c > +++ b/help.c > @@ -2290,7 +2290,7 @@ NULL > char *help_mach[] = { > "mach", > "machine specific data", > -"[-m | -c -[xd]]", > +"[-m | -c | -o -[xd]]", > " This command displays data specific to a machine type.\n", > " -m Display the physical memory map (x86, x86_64 and ia64 only).", > " -c Display each cpu's cpuinfo structure (x86, x86_64 and ia64 only).", > @@ -2298,6 +2298,7 @@ char *help_mach[] = { > " Display the hwrpb_struct, and each cpu's percpu_struct (alpha > only).", > " -x override default output format with hexadecimal format.", > " -d override default output format with decimal format.", > +" -o Display opal console log in crash (ppc64 only).", > "\nEXAMPLES", > " %s> mach", > " MACHINE TYPE: i686", > @@ -2324,6 +2325,17 @@ char *help_mach[] = { > " 00000000fec00000 - 00000000fec90000 E820_RESERVED", > " 00000000fee00000 - 00000000fee10000 E820_RESERVED", > " 00000000ffb00000 - 0000000100000000 E820_RESERVED", > +" ", > +" Display opal console log in crash:\n", > +" %s> mach -o", > +" [ 65.219056911,5] SkiBoot skiboot-5.4.0-218-ge0225cc-df9a248 > starting...", > +" [ 65.219065872,5] initial console log level: memory 7, driver 5", > +" [ 65.219068917,6] CPU: P8 generation processor(max 8 threads/core)", > +" [ 65.219071681,7] CPU: Boot CPU PIR is 0x0060 PVR is 0x004d0200", > +" [ 65.219074685,7] CPU: Initial max PIR set to 0x1fff", > +" [ 65.219607955,5] FDT: Parsing fdt @0xff00000", > +" [ 494.026291523,7] BT: seq 0x25 netfn 0x0a cmd 0x48: Message sent to > host", > +" [ 494.027636927,7] BT: seq 0x25 netfn 0x0a cmd 0x48: IPMI MSG done", > NULL > }; > > diff --git a/ppc64.c b/ppc64.c > index 8dd0465..21c9827 100644 > --- a/ppc64.c > +++ b/ppc64.c > @@ -2733,6 +2733,106 @@ ppc64_get_smp_cpus(void) > return get_cpus_online(); > } > > + > +/* > + * Definitions derived from OPAL. These need to track corresponding values > in > + * https://github.com/open-power/skiboot/blob/master/include/mem-map.h > + */ > +#define SKIBOOT_CONSOLE_DUMP_START 0x31000000 > +#define SKIBOOT_CONSOLE_DUMP_SIZE 0x40000 > +#define SKIBOOT_BASE 0x30000000 > +#define ASCII_UNLIMITED ((ulong)(-1) >> 1) > + > +void > +opalmsg(void) > +{ > + struct memloc { > + uint8_t u8; > + uint16_t u16; > + uint32_t u32; > + uint64_t u64; > + uint64_t limit64; > + }; > + struct opal { > + unsigned long long base; > + unsigned long long entry; > + } opal; > + int i, a; > + size_t typesz, sz; > + void *location; > + char readtype[20]; > + char *addrtype; > + struct memloc mem; > + int displayed, per_line; > + int lost; > + ulong error_handle; > + long count = SKIBOOT_CONSOLE_DUMP_SIZE; > + ulonglong addr = SKIBOOT_CONSOLE_DUMP_START; > + > + if (CRASHDEBUG(4)) > + fprintf(fp, "<addr: %llx count: %ld (%s)>\n", > + addr, count, "PHYSADDR"); > + > + /* > + * OPAL based platform check > + * struct opal of BSS section and hence default value will be ZERO(0) > + * opal_init() in the kernel initializes this structure based on > + * the platform. Use it as a key to determine whether the dump > + * was taken on an OPAL based system or not. > + */ > + if (symbol_exists("opal")) { > + get_symbol_data("opal", sizeof(struct opal), &opal); > + if (opal.base != SKIBOOT_BASE) { > + fprintf(fp, "Dump was captured on Non PowerNV Machine"); > + return; > + } > + } else { > + fprintf(fp, "Dump was captured on Non PowerNV Machine"); > + return; > + } > + > + BZERO(&mem, sizeof(struct memloc)); > + lost = typesz = per_line = 0; > + location = NULL; > + > + /* ASCII */ > + typesz = SIZEOF_8BIT; > + location = &mem.u8; > + sprintf(readtype, "ascii"); > + per_line = 256; > + displayed = 0; > + > + error_handle = FAULT_ON_ERROR; > + > + for (i = a = 0; i < count; i++) { > + if (!readmem(addr, PHYSADDR, location, typesz, > + readtype, error_handle)) { > + addr += typesz; > + lost += 1; > + continue; > + } > + > + if (isprint(mem.u8)) { > + if ((a % per_line) == 0) { > + if (displayed && i) > + fprintf(fp, "\n"); > + } > + fprintf(fp, "%c", mem.u8); > + displayed++; > + a++; > + } else { > + if (count == ASCII_UNLIMITED) > + return; > + a = 0; > + } > + > + addr += typesz; > + } > + > + if (lost != count) > + fprintf(fp, "\n"); > +} > + > /* > * Machine dependent command. > */ > @@ -2741,7 +2841,7 @@ ppc64_cmd_mach(void) > { > int c; > > - while ((c = getopt(argcnt, args, "cm")) != EOF) { > + while ((c = getopt(argcnt, args, "cmo")) != EOF) { > switch(c) > { > case 'c': > @@ -2749,6 +2849,8 @@ ppc64_cmd_mach(void) > fprintf(fp, "PPC64: '-%c' option is not supported\n", > c); > break; > + case 'o': > + return opalmsg(); > default: > argerrs++; > break; > -- > 2.7.4 > -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility