[PATCH] arm64: fix show_regs fallout from KERN_CONT changes

Robin Murphy robin.murphy at arm.com
Fri Oct 21 04:34:11 PDT 2016


Hi Mark,

On 20/10/16 12:23, Mark Rutland wrote:
> Recently in commit 4bcc595ccd80decb ("printk: reinstate KERN_CONT for
> printing continuation lines"), the behaviour of printk changed w.r.t.
> KERN_CONT. Now, KERN_CONT is mandatory to continue existing lines.
> Without this, prefixes are inserted, making output illegible, e.g.
> 
> [ 1007.069010] pc : [<ffff00000871898c>] lr : [<ffff000008718948>] pstate: 40000145
> [ 1007.076329] sp : ffff000008d53ec0
> [ 1007.079606] x29: ffff000008d53ec0 [ 1007.082797] x28: 0000000080c50018
> [ 1007.086160]
> [ 1007.087630] x27: ffff000008e0c7f8 [ 1007.090820] x26: ffff80097631ca00
> [ 1007.094183]
> [ 1007.095653] x25: 0000000000000001 [ 1007.098843] x24: 000000ea68b61cac
> [ 1007.102206]
> 
> ... or when dumped with the userpace dmesg tool, which has slightly
> different implicit newline behaviour. e.g.
> 
> [ 1007.069010] pc : [<ffff00000871898c>] lr : [<ffff000008718948>] pstate: 40000145
> [ 1007.076329] sp : ffff000008d53ec0
> [ 1007.079606] x29: ffff000008d53ec0
> [ 1007.082797] x28: 0000000080c50018
> [ 1007.086160]
> [ 1007.087630] x27: ffff000008e0c7f8
> [ 1007.090820] x26: ffff80097631ca00
> [ 1007.094183]
> [ 1007.095653] x25: 0000000000000001
> [ 1007.098843] x24: 000000ea68b61cac
> [ 1007.102206]
> 
> We can't simply always use KERN_CONT for lines which may or may not be
> continuations. That causes line prefixes (e.g. timestamps) to be
> supressed, and the alignment of all but the first line will be broken.
> 
> For even more fun, we can't simply insert some dummy empty-string printk
> calls, as GCC warns for an empty printk string, and even if we pass
> KERN_DEFAULT explcitly to silence the warning, the prefix gets swallowed
> unless there is an additional part to the string.
> 
> Instead, we must manually iterate over pairs of registers, which gives
> us the legible output we want in either case, e.g.
> 
> [  169.771790] pc : [<ffff00000871898c>] lr : [<ffff000008718948>] pstate: 40000145
> [  169.779109] sp : ffff000008d53ec0
> [  169.782386] x29: ffff000008d53ec0 x28: 0000000080c50018
> [  169.787650] x27: ffff000008e0c7f8 x26: ffff80097631de00
> [  169.792913] x25: 0000000000000001 x24: 00000027827b2cf4
> 
> Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> Cc: Catalin Marinas <catalin.marinas at arm.com>
> Cc: Will Deacon <will.deacon at arm.com>
> ---
>  arch/arm64/kernel/process.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
> index ddce61b..3f31cf93 100644
> --- a/arch/arm64/kernel/process.c
> +++ b/arch/arm64/kernel/process.c
> @@ -187,10 +187,19 @@ void __show_regs(struct pt_regs *regs)
>  	printk("pc : [<%016llx>] lr : [<%016llx>] pstate: %08llx\n",
>  	       regs->pc, lr, regs->pstate);
>  	printk("sp : %016llx\n", sp);
> -	for (i = top_reg; i >= 0; i--) {
> +
> +	i = top_reg;
> +
> +	while (i >= 0) {
>  		printk("x%-2d: %016llx ", i, regs->regs[i]);
> -		if (i % 2 == 0)
> -			printk("\n");
> +		i--;
> +
> +		if (i % 2 == 0) {
> +			pr_cont("x%-2d: %016llx ", i, regs->regs[i]);
> +			i--;
> +		}
> +
> +		pr_cont("\n");
>  	}

Might it be nicer to simply do this (or thereabouts)?

	for (i = top_reg; i > 1; i -= 2)
		printk("x%-2d: %016llx x%-2d: %016llx\n", i-1,
			regs->regs[i-1], i, regs->regs[i]);
	if (i > 0)
		printk("x%-2d: %016llx\n", i-1, regs->regs[i-1]);

Robin.

>  	printk("\n");
>  }
> 




More information about the linux-arm-kernel mailing list