From: Wei Xu <xuwei5@hisilicon.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Rob Herring <rob.herring@linaro.org>,
Marc Zyngier <marc.zyngier@arm.com>,
"Chenxin \(Charles\)" <charles.chenxin@huawei.com>,
tiantao6@huawei.com, QEMU Developers <qemu-devel@nongnu.org>,
Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>,
Linuxarm <linuxarm@huawei.com>,
"Liuxinliang \(Matthew Liu\)" <z.liuxinliang@hisilicon.com>,
qemu-arm <qemu-arm@nongnu.org>,
Daode Huang <huangdaode@hisilicon.com>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Paolo Bonzini <pbonzini@redhat.com>,
"Liguozhu \(Kenneth\)" <liguozhu@hisilicon.com>,
Zhangyi ac <zhangyi.ac@huawei.com>
Subject: Re: [Qemu-devel] [Qemu-arm] [PATCH] pl011: do not put into fifo before enabled the interruption
Date: Fri, 26 Jan 2018 17:05:14 +0000 [thread overview]
Message-ID: <5A6B5FCA.2080009@hisilicon.com> (raw)
In-Reply-To: <CAFEAcA_39SgDKFnkrcVePs89kYUMHvqqAdnkFhrCa=GYTu0Kpw@mail.gmail.com>
Hi Peter,
On 2018/1/26 16:36, Peter Maydell wrote:
> On 26 January 2018 at 16:00, Wei Xu <xuwei5@hisilicon.com> wrote:
>> If the user pressed some keys in the console during the guest booting,
>> the console will be hanged after entering the shell.
>> Because in the above case the pl011_can_receive will return 0 that
>> the pl011_receive will not be called. That means no interruption will
>> be injected in to the kernel and the pl011 state could not be driven
>> further.
>>
>> This patch fixed that issue by checking the interruption is enabled or
>> not before putting into the fifo.
>>
>> Signed-off-by: Wei Xu <xuwei5@hisilicon.com>
>> ---
>> hw/char/pl011.c | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/hw/char/pl011.c b/hw/char/pl011.c
>> index 2aa277fc4f..6296de9527 100644
>> --- a/hw/char/pl011.c
>> +++ b/hw/char/pl011.c
>> @@ -229,6 +229,8 @@ static int pl011_can_receive(void *opaque)
>> PL011State *s = (PL011State *)opaque;
>> int r;
>>
>> + if (!s->int_enabled)
>> + return 0;
>> if (s->lcr & 0x10) {
>> r = s->read_count < 16;
>> } else {
>> --
>
> This doesn't look right. You should be able to use the PL011
> in a strictly polling mode, without ever enabling interrupts.
> Returning false in can_receive if interrupts are disabled
> would break that.
>
> If the user presses keys before interrupts are enabled,
> what ought to happen is:
> * we put the key in the FIFO, and update the int_level flags
> * when the FIFO is full, can_receive starts returning 0 and
> QEMU stops passing us new characters
> * when the guest driver for the pl011 initializes the
> device and enables interrupts then either:
> (a) it does something that clears the FIFO, which will
> mean can_receive starts allowing new chars again, or
> (b) it leaves the FIFO as it is, and we should thus
> immediately raise an interrupt for the characters still
> in the FIFO; when the guest handles this interrupt and
> gets the characters, can_receive will permit new ones
>
Yes, now it is handled like b.
> What is happening in your situation that means this is not
> working as expected ?
But in the kernel side, the pll011 is triggered as a level interruption.
During the booting, if any key is pressed ,the call stack is as below:
QEMU side:
pl011_update
-->qemu_set_irq(level as 0)
---->kvm_arm_gic_set_irq
Kernel side:
kvm_vm_ioctl_irq_line
-->kvm_vgic_inject_irq
---->vgic_validate_injection (if level did not change, return)
---->vgic_queue_irq_unlock
Without above changes, in the vgic_validate_injection, because the
interruption level is always 0, this irq will not be queued into vgic.
And the guest will not read the pl011 fifo.
Best Regards,
Wei
>
> thanks
> -- PMM
>
> .
>
WARNING: multiple messages have this Message-ID (diff)
From: Wei Xu <xuwei5@hisilicon.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
qemu-arm <qemu-arm@nongnu.org>,
QEMU Developers <qemu-devel@nongnu.org>,
Linuxarm <linuxarm@huawei.com>,
Rob Herring <rob.herring@linaro.org>,
Daode Huang <huangdaode@hisilicon.com>,
"Chenxin (Charles)" <charles.chenxin@huawei.com>,
Zhangyi ac <zhangyi.ac@huawei.com>,
"Liguozhu (Kenneth)" <liguozhu@hisilicon.com>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>,
"Liuxinliang (Matthew Liu)" <z.liuxinliang@hisilicon.com>,
tiantao6@huawei.com, Marc Zyngier <marc.zyngier@arm.com>
Subject: Re: [Qemu-devel] [Qemu-arm] [PATCH] pl011: do not put into fifo before enabled the interruption
Date: Fri, 26 Jan 2018 17:05:14 +0000 [thread overview]
Message-ID: <5A6B5FCA.2080009@hisilicon.com> (raw)
In-Reply-To: <CAFEAcA_39SgDKFnkrcVePs89kYUMHvqqAdnkFhrCa=GYTu0Kpw@mail.gmail.com>
Hi Peter,
On 2018/1/26 16:36, Peter Maydell wrote:
> On 26 January 2018 at 16:00, Wei Xu <xuwei5@hisilicon.com> wrote:
>> If the user pressed some keys in the console during the guest booting,
>> the console will be hanged after entering the shell.
>> Because in the above case the pl011_can_receive will return 0 that
>> the pl011_receive will not be called. That means no interruption will
>> be injected in to the kernel and the pl011 state could not be driven
>> further.
>>
>> This patch fixed that issue by checking the interruption is enabled or
>> not before putting into the fifo.
>>
>> Signed-off-by: Wei Xu <xuwei5@hisilicon.com>
>> ---
>> hw/char/pl011.c | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/hw/char/pl011.c b/hw/char/pl011.c
>> index 2aa277fc4f..6296de9527 100644
>> --- a/hw/char/pl011.c
>> +++ b/hw/char/pl011.c
>> @@ -229,6 +229,8 @@ static int pl011_can_receive(void *opaque)
>> PL011State *s = (PL011State *)opaque;
>> int r;
>>
>> + if (!s->int_enabled)
>> + return 0;
>> if (s->lcr & 0x10) {
>> r = s->read_count < 16;
>> } else {
>> --
>
> This doesn't look right. You should be able to use the PL011
> in a strictly polling mode, without ever enabling interrupts.
> Returning false in can_receive if interrupts are disabled
> would break that.
>
> If the user presses keys before interrupts are enabled,
> what ought to happen is:
> * we put the key in the FIFO, and update the int_level flags
> * when the FIFO is full, can_receive starts returning 0 and
> QEMU stops passing us new characters
> * when the guest driver for the pl011 initializes the
> device and enables interrupts then either:
> (a) it does something that clears the FIFO, which will
> mean can_receive starts allowing new chars again, or
> (b) it leaves the FIFO as it is, and we should thus
> immediately raise an interrupt for the characters still
> in the FIFO; when the guest handles this interrupt and
> gets the characters, can_receive will permit new ones
>
Yes, now it is handled like b.
> What is happening in your situation that means this is not
> working as expected ?
But in the kernel side, the pll011 is triggered as a level interruption.
During the booting, if any key is pressed ,the call stack is as below:
QEMU side:
pl011_update
-->qemu_set_irq(level as 0)
---->kvm_arm_gic_set_irq
Kernel side:
kvm_vm_ioctl_irq_line
-->kvm_vgic_inject_irq
---->vgic_validate_injection (if level did not change, return)
---->vgic_queue_irq_unlock
Without above changes, in the vgic_validate_injection, because the
interruption level is always 0, this irq will not be queued into vgic.
And the guest will not read the pl011 fifo.
Best Regards,
Wei
>
> thanks
> -- PMM
>
> .
>
next prev parent reply other threads:[~2018-01-26 18:08 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-26 16:00 [Qemu-arm] [PATCH] pl011: do not put into fifo before enabled the interruption Wei Xu
2018-01-26 16:00 ` [Qemu-devel] " Wei Xu
2018-01-26 16:36 ` Peter Maydell
2018-01-26 16:36 ` Peter Maydell
2018-01-26 17:05 ` Wei Xu [this message]
2018-01-26 17:05 ` Wei Xu
2018-01-26 17:15 ` Peter Maydell
2018-01-26 17:15 ` [Qemu-devel] " Peter Maydell
2018-01-26 17:33 ` Wei Xu
2018-01-26 17:33 ` Wei Xu
2018-01-26 18:01 ` Peter Maydell
2018-01-26 18:01 ` Peter Maydell
2018-01-29 10:29 ` [Qemu-arm] [Qemu-devel] " Andrew Jones
2018-01-29 10:29 ` [Qemu-devel] [Qemu-arm] " Andrew Jones
2018-01-29 11:10 ` [Qemu-arm] [Qemu-devel] " Peter Maydell
2018-01-29 11:10 ` [Qemu-devel] [Qemu-arm] " Peter Maydell
2018-01-29 11:37 ` [Qemu-arm] [Qemu-devel] " Wei Xu
2018-01-29 11:37 ` [Qemu-devel] [Qemu-arm] " Wei Xu
2018-01-29 12:57 ` [Qemu-arm] [Qemu-devel] " Andrew Jones
2018-01-29 12:57 ` [Qemu-devel] [Qemu-arm] " Andrew Jones
2018-01-29 12:18 ` Wei Xu
2018-01-29 12:18 ` Wei Xu
2018-01-29 13:36 ` Peter Maydell
2018-01-29 13:36 ` [Qemu-devel] " Peter Maydell
2018-01-26 18:14 ` no-reply
2018-01-26 18:14 ` no-reply
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=5A6B5FCA.2080009@hisilicon.com \
--to=xuwei5@hisilicon.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=charles.chenxin@huawei.com \
--cc=huangdaode@hisilicon.com \
--cc=liguozhu@hisilicon.com \
--cc=linuxarm@huawei.com \
--cc=marc.zyngier@arm.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=rob.herring@linaro.org \
--cc=shameerali.kolothum.thodi@huawei.com \
--cc=tiantao6@huawei.com \
--cc=z.liuxinliang@hisilicon.com \
--cc=zhangyi.ac@huawei.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.