All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: Yanfeng Liu <yfliu2008@qq.com>
Cc: Mario Fleischmann <mario.fleischmann@lauterbach.com>,
	qemu-riscv@nongnu.org,  qemu-devel@nongnu.org,
	 alistair.francis@wdc.com
Subject: Re: [PATCH v2] riscv/gdb: add virt mode debug interface
Date: Thu, 05 Dec 2024 08:10:42 +0000	[thread overview]
Message-ID: <874j3ibldp.fsf@draig.linaro.org> (raw)
In-Reply-To: <tencent_06871EF8A4ECD65A90D4E769FC60C972DC09@qq.com> (Yanfeng Liu's message of "Thu, 05 Dec 2024 09:29:22 +0800")

Yanfeng Liu <yfliu2008@qq.com> writes:

> On Wed, 2024-12-04 at 17:03 +0100, Mario Fleischmann wrote:
>> Hi everyone,
>> 
>> I'd like to chime in here because we are sitting on a similar patch 
>> which I wanted to send to the mailing list as soon as riscv-debug-spec 
>> v1.0.0 becomes ratified.
>> 
>> For hypervisor support, `(qemu) info registers` isn't enough. We need to 
>> have both read and write access to the V-bit.
>> 
>> On 04.12.2024 14:43, Yanfeng Liu wrote:
>> > On Fri, 2024-11-29 at 09:59 +0000, Alex Bennée wrote:
>> > > Yanfeng <yfliu2008@qq.com> writes:
>> > > 
>> > > > On Thu, 2024-11-28 at 14:21 +0000, Alex Bennée wrote:
>> > > > > Yanfeng Liu <yfliu2008@qq.com> writes:
>> > > > > 
>> > > > > > This adds `virt` virtual register on debug interface so that users
>> > > > > > can access current virtualization mode for debugging purposes.
>> > > > > > 
>> > > > > > Signed-off-by: Yanfeng Liu <yfliu2008@qq.com>
>> > > > > > ---
>> > > > > >   gdb-xml/riscv-32bit-virtual.xml |  1 +
>> > > > > >   gdb-xml/riscv-64bit-virtual.xml |  1 +
>> > > > > >   target/riscv/gdbstub.c          | 18 ++++++++++++------
>> > > > > >   3 files changed, 14 insertions(+), 6 deletions(-)
>> > > > > > 
>> > > > > > diff --git a/gdb-xml/riscv-32bit-virtual.xml b/gdb-xml/riscv-32bit-
>> > > > > > virtual.xml
>> > > > > > index 905f1c555d..d44b6ca2dc 100644
>> > > > > > --- a/gdb-xml/riscv-32bit-virtual.xml
>> > > > > > +++ b/gdb-xml/riscv-32bit-virtual.xml
>> > > > > > @@ -8,4 +8,5 @@
>> > > > > >   <!DOCTYPE feature SYSTEM "gdb-target.dtd">
>> > > > > >   <feature name="org.gnu.gdb.riscv.virtual">
>> > > > > >     <reg name="priv" bitsize="32"/>
>> > > > > > +  <reg name="virt" bitsize="32"/>
>> > > > > >   </feature>
>> > > > > > diff --git a/gdb-xml/riscv-64bit-virtual.xml b/gdb-xml/riscv-64bit-
>> > > > > > virtual.xml
>> > > > > > index 62d86c237b..7c9b63d5b6 100644
>> > > > > > --- a/gdb-xml/riscv-64bit-virtual.xml
>> > > > > > +++ b/gdb-xml/riscv-64bit-virtual.xml
>> > > > > > @@ -8,4 +8,5 @@
>> > > > > >   <!DOCTYPE feature SYSTEM "gdb-target.dtd">
>> > > > > >   <feature name="org.gnu.gdb.riscv.virtual">
>> > > > > >     <reg name="priv" bitsize="64"/>
>> > > > > > +  <reg name="virt" bitsize="64"/>
>> > > > > >   </feature>
>> > > > > 
>> > > > > I assume these are mirrored in gdb not a QEMU only extension?
>> > > > 
>> > > > So far I think it is a QEMU extension and the `gdb-multiarch` doesn't
>> > > > treat
>> > > > is
>> > > > specially. My tests shows it basically works:
>> > > > 
>> > > > ```
>> > > > (gdb) ir virt
>> > > > priv           0x3      prv:3 [Machine]
>> > > > virt           0x0      0
>> > > > (gdb) set $priv = 2
>> > > > (gdb) ir virt
>> > > > priv           0x1      prv:1 [Supervisor]
>> > > > virt           0x0      0
>> > > > (gdb) set $virt = 1
>> > > > (gdb) ir virt
>> > > > priv           0x1      prv:1 [Supervisor]
>> > > > virt           0x1      1
>> > > > (gdb) set $virt = 0
>> > > > (gdb) ir virt
>> > > > priv           0x1      prv:1 [Supervisor]
>> > > > virt           0x0      0
>> > > > (gdb) set $virt = 1
>> > > > (gdb) ir virt
>> > > > priv           0x1      prv:1 [Supervisor]
>> > > > virt           0x1      1
>> > > > (gdb) set $priv = 3
>> > > > (gdb) ir virt
>> > > > priv           0x3      prv:3 [Machine]
>> > > > virt           0x0      0
>> > > > ```
>> > > 
>> > > A gdbstub test case would be useful for this although I don't know if
>> > > the RiscV check-tcg tests switch mode at all.
>> > > 
>> > > > 
>> > > > As I am rather new to QEMU, please teach how we can add it as a QEMU
>> > > > only
>> > > > extension.
>> > > 
>> > > You don't need to extend the XML from GDB, you can build a specific one
>> > > for QEMU extensions. For example:
>> > > 
>> > >      gdb_feature_builder_init(&param.builder,
>> > >                               &cpu->dyn_sysreg_feature.desc,
>> > >                               "org.qemu.gdb.arm.sys.regs",
>> > >                               "system-registers.xml",
>> > >                               base_reg);
>> > > 
>> > > This exports all the system registers QEMU knows about and GDB can
>> > > access generically. Note the id is org.qemu..., indicating its our
>> > > schema not gdbs.
>> > Thanks for teaching, I need time to digest. I guess more feature builder
>> > APIs
>> > are needed (like append_reg) and the getter/setter callbacks might be at a
>> > different place.
>> > 
>> > BTW, compared to adding virtual register `virt`, how do you think if we
>> > share
>> > the V bit as part of existing `priv` register?
>> 
>> IMHO this is a very good idea since the latest release candidate of 
>> riscv-debug-spec also includes the V bit in priv:2.
>> 
>
> Thanks for this information, I noticed the bit(2) of `priv` register is for the
> V bit as per section 4.10.1.
>
>> > Or maybe we shall talk to GDB community to get their opinions? If they agree
>> > to
>> > add a few words about V bit here
>> > https://sourceware.org/gdb/current/onlinedocs/gdb.html/RISC_002dV-Features.html
>> > ,
>> > then it saves us a lot.
>> 
>> Except being currently not supported by GDB
>> 
>> (gdb) info register $priv
>> priv           0x5      prv:5 [INVALID]
>> 
>> are there any reasons from QEMU's side that would speak against 
>> including V in priv?
>> 
>
> My v1 patch used `bit(8)` to avoid seeing the `[INVALID]` thing at GDB side,
> though that is due to GDB isn't in line with its own manual (i.e. use the two
> lowest bits only).
>
> Without a doc or specification. we felt people may not know `bit(8)` in v1 patch
> was for the V bit, so I drafted patch v2 as Alistair suggested. However, as Alex
> pointed out, directly adding `virt` register in "org.gnu.gdb.riscv.virtual" XML
> is improper. I also wanted to raise this in GDB side but my application to join
> the mail list is still pending.
>
> Alex and Alistair, now I am wondering if we can follow the RiscV debug
> specification to use `bit(2)` of `priv` virtual register? My test shows except
> for the `[INVALID]` label, both set/get access seems working.

I guess the INVALID just means gdb needs teaching about the format of
the register.

>
>
> Regards,
> yf

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro


  reply	other threads:[~2024-12-05  8:11 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-28  7:21 [PATCH v2] riscv/gdb: add virt mode debug interface Yanfeng Liu
2024-11-28 14:21 ` Alex Bennée
2024-11-28 18:01   ` Richard Henderson
2024-11-29  2:11   ` Yanfeng
2024-11-29  9:59     ` Alex Bennée
2024-11-30  0:14       ` Yanfeng Liu
2024-12-04 16:03         ` Mario Fleischmann
2024-12-05  1:29           ` Yanfeng Liu
2024-12-05  8:10             ` Alex Bennée [this message]
2024-12-05  9:15               ` Yanfeng Liu
2024-12-16  5:33                 ` Alistair Francis
2024-12-18  0:49                   ` Yanfeng Liu

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=874j3ibldp.fsf@draig.linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=alistair.francis@wdc.com \
    --cc=mario.fleischmann@lauterbach.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-riscv@nongnu.org \
    --cc=yfliu2008@qq.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.