LoongArch architecture development
 help / color / mirror / Atom feed
From: Enze Li <lienze@kylinos.cn>
To: WANG Xuerui <kernel@xen0n.name>
Cc: Huacai Chen <chenhuacai@kernel.org>,
	 loongarch@lists.linux.dev,  WANG Xuerui <git@xen0n.name>
Subject: Re: [PATCH v7 03/12] LoongArch: Print GPRs with ABI names when showing registers
Date: Thu, 27 Apr 2023 10:07:57 +0800	[thread overview]
Message-ID: <87leie6ps2.fsf@kylinos.cn> (raw)
In-Reply-To: <293fb6d9-db3a-1435-5f1a-55103677d42c@xen0n.name> (WANG Xuerui's message of "Tue, 25 Apr 2023 21:39:13 +0800")

On Tue, Apr 25 2023 at 09:39:13 PM +0800, WANG Xuerui wrote:

> On 2023/4/25 21:06, Enze Li wrote:
>> Hi Xuerui,
>> Thanks for doing this.  Overall, I like this idea, but I think I
>> found
>> an easily fixable problem in this patch, please see below.
>> On Tue, 2023-04-25 at 16:10 +0800, WANG Xuerui wrote:
>>> From: WANG Xuerui <git@xen0n.name>
>>>
>>> Show PC (CSR.ERA) in place of $zero, and also show the syscall
>>> restart
>>> flag (conveniently stuffed in regs[0]) if non-zero.
>>>
>>> Signed-off-by: WANG Xuerui <git@xen0n.name>
>>> ---
>>>   arch/loongarch/kernel/traps.c | 36 ++++++++++++++++++++++-----------
>>> --
>>>   1 file changed, 23 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/arch/loongarch/kernel/traps.c
>>> b/arch/loongarch/kernel/traps.c
>>> index 529165eb6e6b..cdb17d6afc77 100644
>>> --- a/arch/loongarch/kernel/traps.c
>>> +++ b/arch/loongarch/kernel/traps.c
>>> @@ -158,22 +158,32 @@ static void __show_regs(const struct pt_regs
>>> *regs)
>>>          const int field = 2 * sizeof(unsigned long);
>>>          unsigned int excsubcode;
>>>          unsigned int exccode;
>>> -       int i;
>>>            show_regs_print_info(KERN_DEFAULT);
>>>   -       /*
>>> -        * Saved main processor registers
>>> -        */
>>> -       for (i = 0; i < 32; ) {
>>> -               if ((i % 4) == 0)
>>> -                       printk("$%2d   :", i);
>>> -               pr_cont(" %0*lx", field, regs->regs[i]);
>>> -
>>> -               i++;
>>> -               if ((i % 4) == 0)
>>> -                       pr_cont("\n");
>>> -       }
>>> +       /* Print GPRs except $zero (substituting with PC/ERA) */
>>> +#define GPR_FIELD(x) field, regs->regs[x]
>> The checkpatch.pl throws up the following error,
>> -------------------------------------------------------------------
>> ERROR: Macros with complex values should be enclosed in parentheses
>> #40: FILE: arch/loongarch/kernel/traps.c:165:
>> +#define GPR_FIELD(x) field, regs->regs[x]
>> -------------------------------------------------------------------
>> and I think adding a pair of parentheses is a good way, like this,
>> =======================================================================
>> --- a/arch/loongarch/kernel/traps.c
>> +++ b/arch/loongarch/kernel/traps.c
>> @@ -162,7 +162,7 @@ static void __show_regs(const struct pt_regs *regs)
>>          show_regs_print_info(KERN_DEFAULT);
>>            /* Print GPRs except $zero (substituting with PC/ERA) */
>> -#define GPR_FIELD(x) field, regs->regs[x]
>> +#define GPR_FIELD(x) (field, regs->regs[x])
>
> Have you checked whether the code even compiles after making this change?
>
> The macro use here is deliberate because otherwise for every register
> printed we would have to repeat the "field" argument once, leading to
> very long lines or more vertical space occupied. (The kernel vsprintf
> implementation doesn't support overriding argument positions like with
> "%0*1$lx", unlike modern C.)

Yeah, you're right.  Things are not always what they appear to be.

I tried several other ways, but they all failed.  I think your method
should be the most suitable.

>
>>          pr_cont("pc %0*lx ra %0*lx tp %0*lx sp %0*lx\n",
>>                  field, regs->csr_era, GPR_FIELD(1), GPR_FIELD(2),
>> GPR_FIELD(3));
>>          pr_cont("a0 %0*lx a1 %0*lx a2 %0*lx a3 %0*lx\n",
>> =======================================================================
>> In addition, the checkpatch.pl also throws up some warnings.  Should
>> these use pr_info() instead?
>
> Hmm perhaps. I originally thought of the whole show_regs output as one
> entry. Now I see how that's not the case and I'll tweak a bit. Thanks
> for pointing out.
>
>> --------------------------------------------------------
>> WARNING: Avoid logging continuation uses where feasible
>> #41: FILE: arch/loongarch/kernel/traps.c:166:
>> +	pr_cont("pc %0*lx ra %0*lx tp %0*lx sp %0*lx\n",
>> WARNING: Avoid logging continuation uses where feasible
>> #43: FILE: arch/loongarch/kernel/traps.c:168:
>> +	pr_cont("a0 %0*lx a1 %0*lx a2 %0*lx a3 %0*lx\n",
>> WARNING: Avoid logging continuation uses where feasible
>> #45: FILE: arch/loongarch/kernel/traps.c:170:
>> +	pr_cont("a4 %0*lx a5 %0*lx a6 %0*lx a7 %0*lx\n",
>> --------------------------------------------------------
>> Best Regards,
>> Enze
>> 
>>> +       pr_cont("pc %0*lx ra %0*lx tp %0*lx sp %0*lx\n",
>>> +               field, regs->csr_era, GPR_FIELD(1), GPR_FIELD(2),
>>> GPR_FIELD(3));
>>> +       pr_cont("a0 %0*lx a1 %0*lx a2 %0*lx a3 %0*lx\n",
>>> +               GPR_FIELD(4), GPR_FIELD(5), GPR_FIELD(6),
>>> GPR_FIELD(7));
>>> +       pr_cont("a4 %0*lx a5 %0*lx a6 %0*lx a7 %0*lx\n",
>>> +               GPR_FIELD(8), GPR_FIELD(9), GPR_FIELD(10),
>>> GPR_FIELD(11));
>>> +       pr_cont("t0 %0*lx t1 %0*lx t2 %0*lx t3 %0*lx\n",
>>> +               GPR_FIELD(12), GPR_FIELD(13), GPR_FIELD(14),
>>> GPR_FIELD(15));
>>> +       pr_cont("t4 %0*lx t5 %0*lx t6 %0*lx t7 %0*lx\n",
>>> +               GPR_FIELD(16), GPR_FIELD(17), GPR_FIELD(18),
>>> GPR_FIELD(19));
>>> +       pr_cont("t8 %0*lx u0 %0*lx s9 %0*lx s0 %0*lx\n",
>>> +               GPR_FIELD(20), GPR_FIELD(21), GPR_FIELD(22),
>>> GPR_FIELD(23));
>>> +       pr_cont("s1 %0*lx s2 %0*lx s3 %0*lx s4 %0*lx\n",
>>> +               GPR_FIELD(24), GPR_FIELD(25), GPR_FIELD(26),
>>> GPR_FIELD(27));
>>> +       pr_cont("s5 %0*lx s6 %0*lx s7 %0*lx s8 %0*lx\n",
>>> +               GPR_FIELD(28), GPR_FIELD(29), GPR_FIELD(30),
>>> GPR_FIELD(31));
>>> +
>>> +       /* The slot for $zero is reused as the syscall restart flag
>>> */
>>> +       if (regs->regs[0])
>>> +               pr_cont("syscall restart flag: %0*lx\n",
>>> GPR_FIELD(0));

>>> +#undef GPR_FIELD

BTW, I like this habit.  It makes it clearer to see the scope of what
the macro applies to, thank you.

Cheers!
Enze

>>>            /*
>>>           * Saved csr registers
>> 

  reply	other threads:[~2023-04-27  2:04 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-25  8:10 [PATCH v7 00/12] LoongArch: Better backtraces WANG Xuerui
2023-04-25  8:10 ` [PATCH v7 01/12] LoongArch: Clean up the architectural interrupt definitions WANG Xuerui
2023-04-25  8:10 ` [PATCH v7 02/12] LoongArch: Add exception subcode definitions for the watchpoint exception WANG Xuerui
2023-04-25  8:10 ` [PATCH v7 03/12] LoongArch: Print GPRs with ABI names when showing registers WANG Xuerui
2023-04-25 13:06   ` Enze Li
2023-04-25 13:39     ` WANG Xuerui
2023-04-27  2:07       ` Enze Li [this message]
2023-04-25  8:10 ` [PATCH v7 04/12] LoongArch: Print symbol info for CSR.ERA and $ra only for kernel-mode contexts WANG Xuerui
2023-04-25  8:10 ` [PATCH v7 05/12] LoongArch: Fix format of CSR lines during show_regs WANG Xuerui
2023-04-25  8:10 ` [PATCH v7 06/12] LoongArch: Humanize the CRMD line when showing registers WANG Xuerui
2023-04-25 13:23   ` Enze Li
2023-04-25  8:10 ` [PATCH v7 07/12] LoongArch: Humanize the PRMD " WANG Xuerui
2023-04-25  8:10 ` [PATCH v7 08/12] LoongArch: Humanize the EUEN " WANG Xuerui
2023-04-25  8:10 ` [PATCH v7 09/12] LoongArch: Humanize the ECFG " WANG Xuerui
2023-04-25  8:10 ` [PATCH v7 10/12] LoongArch: Humanize the ESTAT " WANG Xuerui
2023-04-25  8:10 ` [PATCH v7 11/12] LoongArch: Use ISA manual names for BADV and CPUCFG.PRID lines in show_regs WANG Xuerui
2023-04-25  8:10 ` [PATCH v7 12/12] LoongArch: Also include current CPU's full name in show_regs output WANG Xuerui

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87leie6ps2.fsf@kylinos.cn \
    --to=lienze@kylinos.cn \
    --cc=chenhuacai@kernel.org \
    --cc=git@xen0n.name \
    --cc=kernel@xen0n.name \
    --cc=loongarch@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox