From: Peter Delevoryas <peter@pjd.dev>
To: "Cédric Le Goater" <clg@kaod.org>
Cc: Peter Maydell <peter.maydell@linaro.org>,
Andrew Jeffery <andrew@aj.id.au>, Joel Stanley <joel@jms.id.au>,
qemu-arm@nongnu.org, qemu-devel@nongnu.org
Subject: Re: [PATCH 1/2] hw/gpio/aspeed: Don't let guests modify input pins
Date: Thu, 7 Jul 2022 10:53:57 -0700 [thread overview]
Message-ID: <YscdtXYL5sJRSm6Z@pdel-mbp> (raw)
In-Reply-To: <fa52743a-5730-3b3f-f07f-99931bb66b01@kaod.org>
On Thu, Jul 07, 2022 at 10:56:02AM +0200, Cédric Le Goater wrote:
> On 7/7/22 09:17, Peter Delevoryas wrote:
> > It seems that aspeed_gpio_update is allowing the value for input pins to be
> > modified through register writes and QOM property modification.
> >
> > The QOM property modification is fine, but modifying the value through
> > register writes from the guest OS seems wrong if the pin's direction is set
> > to input.
> >
> > The datasheet specifies that "0" bits in the direction register select input
> > mode, and "1" selects output mode.
> >
> > OpenBMC userspace code is accidentally writing 0's to the GPIO data
> > registers somewhere (or perhaps the driver is doing it through a reset or
> > something), and this is overwriting GPIO FRU information (board ID, slot
> > presence pins) that is initialized in Aspeed machine reset code (see
> > fby35_reset() in hw/arm/aspeed.c).
>
> It might be good to log a GUEST_ERROR in that case, when writing to an
> input GPIO and when reading from an output GPIO.
Good idea, I'll include a GUEST_ERROR for writing to an input GPIO.
I'm actually not totally certain about emitting an error when reading from an
output GPIO, because the driver can only do 8-bit reads at the finest
granularity, and if 1 of the 8 pins' direction is output, then it will be
reading the value of an output pin. But, that's not really bad, because
presumably the value will be ignored. Maybe I can go test this out on
hardware and figure out what happens though.
Thanks,
Peter
>
> Thanks,
>
> C.
>
> >
> > Signed-off-by: Peter Delevoryas <peter@pjd.dev>
> > Fixes: 4b7f956862dc ("hw/gpio: Add basic Aspeed GPIO model for AST2400 and AST2500")
> > ---
> > hw/gpio/aspeed_gpio.c | 22 ++++++++++++----------
> > 1 file changed, 12 insertions(+), 10 deletions(-)
> >
> > diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
> > index a62a673857..2eae427201 100644
> > --- a/hw/gpio/aspeed_gpio.c
> > +++ b/hw/gpio/aspeed_gpio.c
> > @@ -268,7 +268,7 @@ static ptrdiff_t aspeed_gpio_set_idx(AspeedGPIOState *s, GPIOSets *regs)
> > }
> > static void aspeed_gpio_update(AspeedGPIOState *s, GPIOSets *regs,
> > - uint32_t value)
> > + uint32_t value, bool force)
> > {
> > uint32_t input_mask = regs->input_mask;
> > uint32_t direction = regs->direction;
> > @@ -293,10 +293,12 @@ static void aspeed_gpio_update(AspeedGPIOState *s, GPIOSets *regs,
> > }
> > /* ...then update the state. */
> > - if (mask & new) {
> > - regs->data_value |= mask;
> > - } else {
> > - regs->data_value &= ~mask;
> > + if (direction & mask || force) {
> > + if (mask & new) {
> > + regs->data_value |= mask;
> > + } else {
> > + regs->data_value &= ~mask;
> > + }
> > }
> > /* If the gpio is set to output... */
> > @@ -339,7 +341,7 @@ static void aspeed_gpio_set_pin_level(AspeedGPIOState *s, uint32_t set_idx,
> > value &= ~pin_mask;
> > }
> > - aspeed_gpio_update(s, &s->sets[set_idx], value);
> > + aspeed_gpio_update(s, &s->sets[set_idx], value, true);
> > }
> > /*
> > @@ -653,7 +655,7 @@ static void aspeed_gpio_write_index_mode(void *opaque, hwaddr offset,
> > reg_value = update_value_control_source(set, set->data_value,
> > reg_value);
> > set->data_read = reg_value;
> > - aspeed_gpio_update(s, set, reg_value);
> > + aspeed_gpio_update(s, set, reg_value, false);
> > return;
> > case gpio_reg_idx_direction:
> > reg_value = set->direction;
> > @@ -753,7 +755,7 @@ static void aspeed_gpio_write_index_mode(void *opaque, hwaddr offset,
> > __func__, offset, data, reg_idx_type);
> > return;
> > }
> > - aspeed_gpio_update(s, set, set->data_value);
> > + aspeed_gpio_update(s, set, set->data_value, false);
> > return;
> > }
> > @@ -799,7 +801,7 @@ static void aspeed_gpio_write(void *opaque, hwaddr offset, uint64_t data,
> > data &= props->output;
> > data = update_value_control_source(set, set->data_value, data);
> > set->data_read = data;
> > - aspeed_gpio_update(s, set, data);
> > + aspeed_gpio_update(s, set, data, false);
> > return;
> > case gpio_reg_direction:
> > /*
> > @@ -875,7 +877,7 @@ static void aspeed_gpio_write(void *opaque, hwaddr offset, uint64_t data,
> > PRIx64"\n", __func__, offset);
> > return;
> > }
> > - aspeed_gpio_update(s, set, set->data_value);
> > + aspeed_gpio_update(s, set, set->data_value, false);
> > return;
> > }
>
next prev parent reply other threads:[~2022-07-07 17:54 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20220707071731.34047-1-peter@pjd.dev>
2022-07-07 7:17 ` [PATCH 1/2] hw/gpio/aspeed: Don't let guests modify input pins Peter Delevoryas
2022-07-07 8:20 ` Joel Stanley
2022-07-07 17:50 ` Peter Delevoryas
2022-07-11 12:25 ` Andrew Jeffery
2022-07-07 8:56 ` Cédric Le Goater
2022-07-07 17:53 ` Peter Delevoryas [this message]
2022-07-07 19:04 ` Peter Delevoryas
2022-07-11 8:13 ` Cédric Le Goater
2022-07-11 13:26 ` Andrew Jeffery
2022-07-12 1:57 ` Peter Delevoryas
2022-07-18 1:07 ` Andrew Jeffery
2022-07-07 7:17 ` [PATCH 2/2] aspeed: Add fby35-bmc slot GPIO's Peter Delevoryas
2022-07-07 7:26 ` [PATCH 0/2] hw/gpio/aspeed: Don't let guests modify input pins Peter Delevoryas
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=YscdtXYL5sJRSm6Z@pdel-mbp \
--to=peter@pjd.dev \
--cc=andrew@aj.id.au \
--cc=clg@kaod.org \
--cc=joel@jms.id.au \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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.