qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Philippe Mathieu-Daudé" <philmd@redhat.com>
To: "Sid Manning" <sidneym@quicinc.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>
Cc: "Alex Bennée" <alex.bennee@linaro.org>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Subject: Re: [gdbstub] redirecting qemu console output to a debugger
Date: Thu, 21 Oct 2021 15:11:28 +0200	[thread overview]
Message-ID: <fad02feb-09f3-4ef8-a2eb-bec76e2ee968@redhat.com> (raw)
In-Reply-To: <BYAPR02MB550976DDDA818CEB090B41C5BEBF9@BYAPR02MB5509.namprd02.prod.outlook.com>

Hi Sid,

Cc'ing maintainers:

$ ./scripts/get_maintainer.pl -f  chardev/char.c
"Marc-André Lureau" <marcandre.lureau@redhat.com> (maintainer:chardev)
Paolo Bonzini <pbonzini@redhat.com> (reviewer:Character device...)

$ ./scripts/get_maintainer.pl -f  gdbstub.c
"Alex Bennée" <alex.bennee@linaro.org> (maintainer:GDB stub)
"Philippe Mathieu-Daudé" <philmd@redhat.com> (reviewer:GDB stub)

On 10/21/21 14:37, Sid Manning wrote:
> Currently when I attach a debugger (lldb) to my qemu session all of the output goes to the shell running qemu not to the debugger.  Fixing this meant that I needed to point the semi-hosting output to the gdb chardev.  I started qemu like this:
> 
> -s -S -semihosting-config target=auto,chardev=ch0 -chardev gdb,id=ch0
> 
> But this failed with the error:
> -chardev gdb,id=ch0: 'gdb' is not a valid char driver name
> 
> In order to fix this I needed to change the stub's chardev from internal to external:
> 
> @@ -3446,7 +3446,7 @@ static void char_gdb_class_init(ObjectClass *oc, void *data)
>  {
>      ChardevClass *cc = CHARDEV_CLASS(oc);
>  
> -    cc->internal = true;
> +    cc->internal = false;
>      cc->open = gdb_monitor_open;
>      cc->chr_write = gdb_monitor_write;
>  }
> 
> Afterward console output was routed to the debugger.  This is the only chardev device I found that is marked as internal so I suspect this is the wrong thing to do.  What is the proper way to redirect output from qemu to the debugger?

commit 777357d758d937c9dd83082c39aff9f1e53e9ba3
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date:   Wed Dec 7 18:39:10 2016 +0300

    chardev: qom-ify

    Turn Chardev into Object.

    qemu_chr_alloc() is replaced by the qemu_chardev_new() constructor.
    It will call qemu_char_open() to open/intialize the chardev with the
    ChardevCommon *backend settings.

    The CharDriver::create() callback is turned into a
    ChardevClass::open() which is called from the newly introduced
    qemu_chardev_open().

    "chardev-gdb" and "chardev-hci" are internal chardev and aren't
    creatable directly with -chardev. Use a new internal flag to disable
    them. We may want to use TYPE_USER_CREATABLE interface instead, or
    perhaps allow -chardev usage.

    Although in general we keep typename and macros private, unless
    the type is being used by some other file, in this patch, all types
    and common helper macros for qemu-char.c are in char.h. This is to
    help transition now (some types must be declared early, while some
    aren't shared) and when splitting in several units. This is to be
    improved later.

    Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
    Reviewed-by: Eric Blake <eblake@redhat.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

I'm not sure why "chardev-gdb" is internal, maybe because it uses
static state as singleton, so can't be TYPE_USER_CREATABLE?

  static GDBState gdbserver_state;

But TYPE_DBUS_VMSTATE is TYPE_USER_CREATABLE and have:

static void
dbus_vmstate_complete(UserCreatable *uc, Error **errp)
{
    DBusVMState *self = DBUS_VMSTATE(uc);
    g_autoptr(GError) err = NULL;

    if (!object_resolve_path_type("", TYPE_DBUS_VMSTATE, NULL)) {
        error_setg(errp, "There is already an instance of %s",
                   TYPE_DBUS_VMSTATE);
        return;
    }
    ...

So it should be possible to have TYPE_CHARDEV_GDB implement
TYPE_USER_CREATABLE and check for singleton the same way,
then remove the ChardevClass::internal field IMO...

But let see what the maintainers prefer :)

Regards,

Phil.



  reply	other threads:[~2021-10-21 13:13 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-21 12:37 [gdbstub] redirecting qemu console output to a debugger Sid Manning
2021-10-21 13:11 ` Philippe Mathieu-Daudé [this message]
2021-10-21 14:51   ` Alex Bennée
2021-10-21 22:08     ` Sid Manning

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=fad02feb-09f3-4ef8-a2eb-bec76e2ee968@redhat.com \
    --to=philmd@redhat.com \
    --cc=alex.bennee@linaro.org \
    --cc=marcandre.lureau@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=sidneym@quicinc.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).