Re: [PATCH v3 1/5] [PATCH 1/5] gdb/aarch64: Add POR_EL0 register support for FEAT_S1POE

Srinath Parvathaneni <[email protected]>
Newsgroups gmane.comp.gdb.patches
Message-ID <AS8PR08MB10099C30174429EDE2AC594659BD12@AS8PR08MB10099.eurprd08.prod.outlook.com>
Hi,

>On 25/07/2026 07:13, Thiago Jung Bauermann wrote:
>> Srinath Parvathaneni <[email protected]> writes:
>>
>>>>> *  p/x $por_el0
>>>>> *  set $por_el0 = <value>
>>>>>
>>>>> Example:
>>>>> (gdb) info register por_el0
>>>>> por_el0 0x7 [ P15=--- P14=--- P13=--- P12=--- P11=--- P10=--- P9=--- P8=--- P7=---
>>> P6=--- P5=--- P4=--- P3=--- P2=--- P1=--- P0=rwx ]
>>>>> (gdb) set $por_el0=0xffffffff77777777
>>>>> (gdb) info register por_el0
>>>>> por_el0 0xffffffff77777777 [ P15=??? P14=??? P13=??? P12=??? P11=??? P10=??? P9=???
>>> P8=??? P7=rwx P6=rwx P5=rwx P4=rwx P3=rwx P2=rwx P1=rwx P0=rwx ]
>>>>> (gdb) p $por_el0
>>>>> $1 = [ P15=??? P14=??? P13=??? P12=??? P11=??? P10=??? P9=??? P8=??? P7=rwx P6=rwx
>>> P5=rwx P4=rwx P3=rwx P2=rwx P1=rwx P0=rwx ]
>>>>> (gdb) p/x $por_el0
>>>>> $2 = 0xffffffff77777777
>>>>> (gdb) set $por_el0=0x57
>>>>> (gdb) info register por_el0
>>>>> por_el0 0x57 [ P15=--- P14=--- P13=--- P12=--- P11=--- P10=--- P9=--- P8=--- P7=---
>>> P6=--- P5=--- P4=--- P3=--- P2=--- P1=rw- P0=rwx ]
>>>>> (gdb) set $por_el0=0xf7f7f7f7f7f7f7f7
>>>>> (gdb) info register por_el0
>>>>> por_el0 0xf7f7f7f7f7f7f7f7 [ P15=??? P14=rwx P13=??? P12=rwx P11=??? P10=rwx P9=???
>>> P8=rwx P7=??? P6=rwx P5=??? P4=rwx P3=??? P2=rwx P1=??? P0=rwx ]
>>>>> (gdb)
>>>>
>>>> Looking at the output above I think it is a bit hard to read.
>>
>> I think part of the reason for it being hard to read is that the output
>> is very wide.
>
>Indeed. I mean, as an overview it's fine. But it really depends on the
>most common use case for this register.
>
>What I want to steer clear from is something like we have for SVE
>registers. It is a barrage of text that isn´t very easy to use.
>
>>
>> One way to address this is Srinath's suggestion below to not print
>> zeroed keys. Another would be to improve the output of the flag type to
>> add line breaks when the terminal's width is reached, as is done when
>> printing array values.
>>
>> Another option would be to use a struct rather than a flags type. Then
>> there would be one type per field, and it would be possible to display
>> (and set) only one key.
>>
>> Not sure which of them I prefer. The struct idea has the advantage of
>> letting the user easily set protection keys individually. OTOH it's
>> not printed isn a very compact way.
>>
>> If easily displaying/setting individual keys isn't that important, I
>> think I slightly prefer not printing zeroed keys as Srinath suggests,
>> possibly coupled with adding line breaks when the line is too long, to
>> address the case of having many keys set in the register.
>>
>
>Good suggestions. I'd say if users want...
>
>- An overview with permissions, then print what we have above
>- To use it as a mask, we should have the raw value
>- To read/write individual P<x> entries within the register, then we
>should have pseudo-registers that map back to por_el0.
>
>The pseudo registers would leave the interpretation of the raw values
>out of the XML, therefore remote stubs wouldn´t need to pass that sort
>of information.
>
>Stretching it a little bit, remote stubs could even send a modified
>version of these fields in the XML and gdb would start printing
>something else.
>

Hi Luis/Thiago,

After looking at the suggestions in the thread, I made a few changes to the
POR_EL0 interface. The custom display for por_el0 has been updated, and I've
also added support for pseudo registers for the individual permission fields.

Could you please have a look at the output below? If this looks ok, I'll re-spin
the series, address the remaining review comments and send it out for another
review.

Also added a new group (por) for por_el0 register along with poe pseduo registers.

Set 1:
(gdb) info register por_el0
por_el0        0x0000000000000077 [ P1=rwx P0=rwx ]
(gdb) info register por
por_el0        0x0000000000000077 [ P1=rwx P0=rwx ]
por_el0_p0     0x7                rwx
por_el0_p1     0x7                rwx
por_el0_p2     0x0                ---
por_el0_p3     0x0                ---
por_el0_p4     0x0                ---
por_el0_p5     0x0                ---
por_el0_p6     0x0                ---
por_el0_p7     0x0                ---
por_el0_p8     0x0                ---
por_el0_p9     0x0                ---
por_el0_p10    0x0                ---
por_el0_p11    0x0                ---
por_el0_p12    0x0                ---
por_el0_p13    0x0                ---
por_el0_p14    0x0                ---
por_el0_p15    0x0                ---

Set 2:
(gdb) set $por_el0=0xf7f7f7f7f7f7f7f7
(gdb) info register por_el0
por_el0        0xf7f7f7f7f7f7f7f7 [ P15=??? P14=rwx P13=??? P12=rwx
                                                           P11=??? P10=rwx P9=??? P8=rwx
                                                                 P7=??? P6=rwx P5=??? P4=rwx
                                                                 P3=??? P2=rwx P1=??? P0=rwx ]
(gdb) info register por
por_el0        0xf7f7f7f7f7f7f7f7 [ P15=??? P14=rwx P13=??? P12=rwx
                                                                 P11=??? P10=rwx P9=??? P8=rwx
                                                                 P7=??? P6=rwx P5=??? P4=rwx
                                                                 P3=??? P2=rwx P1=??? P0=rwx ]
por_el0_p0     0x7                       rwx
por_el0_p1     0xf                        ???
por_el0_p2     0x7                       rwx
por_el0_p3     0xf                        ???
por_el0_p4     0x7                       rwx
por_el0_p5     0xf                      ???
por_el0_p6     0x7                      rwx
por_el0_p7     0xf                      ???
por_el0_p8     0x7                            rwx
por_el0_p9     0xf                             ???
por_el0_p10    0x7                           rwx
por_el0_p11    0xf                            ???
por_el0_p12    0x7                           rwx
por_el0_p13    0xf                            ???
por_el0_p14    0x7                           rwx
por_el0_p15    0xf                            ???

Set 3:
(gdb) set $por_el0=0x0123456789abcdef
(gdb) info register por_el0
por_el0        0x0123456789abcdef [ P14=r-- P13=--x P12=r-x P11=-w-
                                                  P10=rw- P9=-wx P8=rwx P7=???
                                                   P6=??? P5=??? P4=??? P3=???
                                                   P2=??? P1=??? P0=??? ]
(gdb) info register por
por_el0        0x0123456789abcdef [ P14=r-- P13=--x P12=r-x P11=-w-
                                                  P10=rw- P9=-wx P8=rwx P7=???
                                                  P6=??? P5=??? P4=??? P3=???
                                                  P2=??? P1=??? P0=??? ]
por_el0_p0     0xf                     ???
por_el0_p1     0xe                    ???
por_el0_p2     0xd                    ???
por_el0_p3     0xc                    ???
por_el0_p4     0xb                         ???
por_el0_p5     0xa                         ???
por_el0_p6     0x9                         ???
por_el0_p7     0x8                         ???
por_el0_p8     0x7                         rwx
por_el0_p9     0x6                         -wx
por_el0_p10    0x5                         rw-
por_el0_p11    0x4                        -w-
por_el0_p12    0x3                        r-x
por_el0_p13    0x2                        --x
por_el0_p14    0x1                        r--
por_el0_p15    0x0                        ---
(gdb)

Set 4:
(gdb) set $por_el0=0x7
(gdb) info register por
por_el0        0x0000000000000007 [ P0=rwx ]
por_el0_p0     0x7                        rwx
por_el0_p1     0x0                        ---
por_el0_p2     0x0                       ---
por_el0_p3     0x0                        ---
por_el0_p4     0x0                        ---
por_el0_p5     0x0                        ---
por_el0_p6     0x0                        ---
por_el0_p7     0x0                        ---
por_el0_p8     0x0                        ---
por_el0_p9     0x0                        ---
por_el0_p10    0x0                        ---
por_el0_p11    0x0                        ---
por_el0_p12    0x0                        ---
por_el0_p13    0x0                        ---
por_el0_p14    0x0                        ---
por_el0_p15    0x0                        ---
(gdb) set $por_el0_p1=0x7
(gdb) set $por_el0_p3=0x5
(gdb) set $por_el0_p4=0x3
(gdb) set $por_el0_p5=0x1
(gdb) set $por_el0_p6=0xf
(gdb) info register por
por_el0        0x000000000f135077 [ P6=??? P5=r-- P4=r-x P3=rw-
                                                  P1=rwx P0=rwx ]
por_el0_p0     0x7                     rwx
por_el0_p1     0x7                   rwx
por_el0_p2     0x0                         ---
por_el0_p3     0x5                        rw-
por_el0_p4     0x3                        r-x
por_el0_p5     0x1                        r--
por_el0_p6     0xf                        ???
por_el0_p7     0x0                        ---
por_el0_p8     0x0                        ---
por_el0_p9     0x0                        ---
por_el0_p10    0x0                        ---
por_el0_p11    0x0                        ---
por_el0_p12    0x0                        ---
por_el0_p13    0x0                        ---
por_el0_p14    0x0                        ---
por_el0_p15    0x0                        ---
(gdb)

Please let me know your comments, thanks.

Regards,
Sri.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.