[PATCH V2 2/2] powerpc/xmon: add command to dump OPAL msglog
Denis Kirjanov
kda at linux-powerpc.org
Fri Feb 12 01:15:38 AEDT 2016
On 2/9/16, Andrew Donnellan <andrew.donnellan at au1.ibm.com> wrote:
> Add the 'do' command to dump the OPAL msglog in xmon.
>
> Signed-off-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>
I think it would be better to create system-specific files under
powerpc/xmon/ directory, in this case something like xmon_powernv.c.
There are some many macros there.
Current code already looks very ugly, look at the cell-specific spu* stuff
for example.
> ---
> arch/powerpc/xmon/xmon.c | 60
> ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 60 insertions(+)
>
> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
> index 07a8508..48b75ae 100644
> --- a/arch/powerpc/xmon/xmon.c
> +++ b/arch/powerpc/xmon/xmon.c
> @@ -47,6 +47,11 @@
> #include <asm/debug.h>
> #include <asm/hw_breakpoint.h>
>
> +#ifdef CONFIG_PPC_POWERNV
> +#include <asm/opal.h>
> +#include <asm/firmware.h>
> +#endif
> +
> #ifdef CONFIG_PPC64
> #include <asm/hvcall.h>
> #include <asm/paca.h>
> @@ -119,6 +124,11 @@ static void dump(void);
> static void prdump(unsigned long, long);
> static int ppc_inst_dump(unsigned long, long, int);
> static void dump_log_buf(void);
> +
> +#ifdef CONFIG_PPC_POWERNV
> +static void dump_opal_msglog(void);
> +#endif
> +
> static void backtrace(struct pt_regs *);
> static void excprint(struct pt_regs *);
> static void prregs(struct pt_regs *);
> @@ -202,6 +212,10 @@ Commands:\n\
> df dump float values\n\
> dd dump double values\n\
> dl dump the kernel log buffer\n"
> +#ifdef CONFIG_PPC_POWERNV
> + "\
> + do dump the OPAL message log\n"
> +#endif
> #ifdef CONFIG_PPC64
> "\
> dp[#] dump paca for current cpu, or cpu #\n\
> @@ -2253,6 +2267,12 @@ dump(void)
> last_cmd = "di\n";
> } else if (c == 'l') {
> dump_log_buf();
> + } else if (c == 'o') {
> +#ifdef CONFIG_PPC_POWERNV
> + dump_opal_msglog();
> +#else
> + printf("Machine is not running OPAL firmware.\n");
> +#endif
> } else if (c == 'r') {
> scanhex(&ndump);
> if (ndump == 0)
> @@ -2395,6 +2415,46 @@ dump_log_buf(void)
> catch_memory_errors = 0;
> }
>
> +#ifdef CONFIG_PPC_POWERNV
> +void
> +dump_opal_msglog(void)
> +{
> + unsigned char buf[128];
> + ssize_t res;
> + loff_t pos = 0;
> +
> + if (!firmware_has_feature(FW_FEATURE_OPAL)) {
> + printf("Machine is not running OPAL firmware.\n");
> + return;
> + }
> +
> + if (setjmp(bus_error_jmp) != 0) {
> + printf("Error dumping OPAL msglog!\n");
> + return;
> + }
> +
> + catch_memory_errors = 1;
> + sync();
> +
> + xmon_start_pagination();
> + while ((res = opal_msglog_copy(buf, pos, sizeof(buf) - 1))) {
> + if (res < 0) {
> + printf("Error dumping OPAL msglog! Error: %zd\n", res);
> + break;
> + }
> + buf[res] = '\0';
> + printf("%s", buf);
> + pos += res;
> + }
> + xmon_end_pagination();
> +
> + sync();
> + /* wait a little while to see if we get a machine check */
> + __delay(200);
> + catch_memory_errors = 0;
> +}
> +#endif
> +
> /*
> * Memory operations - move, set, print differences
> */
> --
> Andrew Donnellan Software Engineer, OzLabs
> andrew.donnellan at au1.ibm.com Australia Development Lab, Canberra
> +61 2 6201 8874 (work) IBM Australia Limited
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
More information about the Linuxppc-dev
mailing list