All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: qemu-arm@nongnu.org, qemu-devel@nongnu.org,
	Shashi Mallela <shashi.mallela@linaro.org>
Subject: Re: [PATCH v2 01/13] hw/intc/arm_gicv3_its: Fix event ID bounds checks
Date: Tue, 18 Jan 2022 17:13:58 +0000	[thread overview]
Message-ID: <877dax9d9k.fsf@linaro.org> (raw)
In-Reply-To: <20220111171048.3545974-2-peter.maydell@linaro.org>


Peter Maydell <peter.maydell@linaro.org> writes:

> In process_its_cmd() and process_mapti() we must check the
> event ID against a limit defined by the size field in the DTE,
> which specifies the number of ID bits minus one. Convert
> this code to our num_foo convention:
>  * change the variable names
>  * use uint64_t and 1ULL when calculating the number
>    of valid event IDs, because DTE.SIZE is 5 bits and
>    so num_eventids may be up to 2^32
>  * fix the off-by-one error in the comparison
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>  hw/intc/arm_gicv3_its.c | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
> index fa3cdb57554..6d11fa02040 100644
> --- a/hw/intc/arm_gicv3_its.c
> +++ b/hw/intc/arm_gicv3_its.c
> @@ -225,7 +225,7 @@ static bool process_its_cmd(GICv3ITSState *s, uint64_t value, uint32_t offset,
>      MemTxResult res = MEMTX_OK;
>      bool dte_valid;
>      uint64_t dte = 0;
> -    uint32_t max_eventid;
> +    uint64_t num_eventids;
>      uint16_t icid = 0;
>      uint32_t pIntid = 0;
>      bool ite_valid = false;
> @@ -258,7 +258,7 @@ static bool process_its_cmd(GICv3ITSState *s, uint64_t value, uint32_t offset,
>      dte_valid = FIELD_EX64(dte, DTE, VALID);
>  
>      if (dte_valid) {
> -        max_eventid = 1UL << (FIELD_EX64(dte, DTE, SIZE) + 1);
> +        num_eventids = 1ULL << (FIELD_EX64(dte, DTE, SIZE) + 1);
>  
>          ite_valid = get_ite(s, eventid, dte, &icid, &pIntid, &res);
>  
> @@ -299,10 +299,11 @@ static bool process_its_cmd(GICv3ITSState *s, uint64_t value, uint32_t offset,
>                        dte_valid ? "valid" : "invalid",
>                        ite_valid ? "valid" : "invalid",
>                        cte_valid ? "valid" : "invalid");
> -    } else if (eventid > max_eventid) {
> +    } else if (eventid >= num_eventids) {
>          qemu_log_mask(LOG_GUEST_ERROR,
> -                      "%s: invalid command attributes: eventid %d > %d\n",
> -                      __func__, eventid, max_eventid);
> +                      "%s: invalid command attributes: eventid %d >= %"
> +                      PRId64 "\n",
> +                      __func__, eventid, num_eventids);
>      } else {
>          /*
>           * Current implementation only supports rdbase == procnum
> @@ -336,7 +337,8 @@ static bool process_mapti(GICv3ITSState *s, uint64_t value, uint32_t offset,
>      AddressSpace *as = &s->gicv3->dma_as;
>      uint32_t devid, eventid;
>      uint32_t pIntid = 0;
> -    uint32_t max_eventid, max_Intid;
> +    uint64_t num_eventids;
> +    uint32_t max_Intid;
>      bool dte_valid;
>      MemTxResult res = MEMTX_OK;
>      uint16_t icid = 0;
> @@ -376,11 +378,11 @@ static bool process_mapti(GICv3ITSState *s, uint64_t value, uint32_t offset,
>          return result;
>      }
>      dte_valid = FIELD_EX64(dte, DTE, VALID);
> -    max_eventid = 1UL << (FIELD_EX64(dte, DTE, SIZE) + 1);
> +    num_eventids = 1ULL << (FIELD_EX64(dte, DTE, SIZE) + 1);
>      max_Intid = (1ULL << (GICD_TYPER_IDBITS + 1)) - 1;
>  
>      if ((devid >= s->dt.num_ids) || (icid >= s->ct.num_ids)
> -            || !dte_valid || (eventid > max_eventid) ||
> +            || !dte_valid || (eventid >= num_eventids) ||
>              (((pIntid < GICV3_LPI_INTID_START) || (pIntid > max_Intid)) &&
>               (pIntid != INTID_SPURIOUS))) {

It seems process_mapti has the similar "catch all the errors" if leg
that I split apart in process_its_command to make it easier to see what
failed.

However:

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>

-- 
Alex Bennée

WARNING: multiple messages have this Message-ID (diff)
From: "Alex Bennée" <alex.bennee@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Shashi Mallela <shashi.mallela@linaro.org>,
	qemu-arm@nongnu.org, qemu-devel@nongnu.org
Subject: Re: [PATCH v2 01/13] hw/intc/arm_gicv3_its: Fix event ID bounds checks
Date: Tue, 18 Jan 2022 17:13:58 +0000	[thread overview]
Message-ID: <877dax9d9k.fsf@linaro.org> (raw)
In-Reply-To: <20220111171048.3545974-2-peter.maydell@linaro.org>


Peter Maydell <peter.maydell@linaro.org> writes:

> In process_its_cmd() and process_mapti() we must check the
> event ID against a limit defined by the size field in the DTE,
> which specifies the number of ID bits minus one. Convert
> this code to our num_foo convention:
>  * change the variable names
>  * use uint64_t and 1ULL when calculating the number
>    of valid event IDs, because DTE.SIZE is 5 bits and
>    so num_eventids may be up to 2^32
>  * fix the off-by-one error in the comparison
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>  hw/intc/arm_gicv3_its.c | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
> index fa3cdb57554..6d11fa02040 100644
> --- a/hw/intc/arm_gicv3_its.c
> +++ b/hw/intc/arm_gicv3_its.c
> @@ -225,7 +225,7 @@ static bool process_its_cmd(GICv3ITSState *s, uint64_t value, uint32_t offset,
>      MemTxResult res = MEMTX_OK;
>      bool dte_valid;
>      uint64_t dte = 0;
> -    uint32_t max_eventid;
> +    uint64_t num_eventids;
>      uint16_t icid = 0;
>      uint32_t pIntid = 0;
>      bool ite_valid = false;
> @@ -258,7 +258,7 @@ static bool process_its_cmd(GICv3ITSState *s, uint64_t value, uint32_t offset,
>      dte_valid = FIELD_EX64(dte, DTE, VALID);
>  
>      if (dte_valid) {
> -        max_eventid = 1UL << (FIELD_EX64(dte, DTE, SIZE) + 1);
> +        num_eventids = 1ULL << (FIELD_EX64(dte, DTE, SIZE) + 1);
>  
>          ite_valid = get_ite(s, eventid, dte, &icid, &pIntid, &res);
>  
> @@ -299,10 +299,11 @@ static bool process_its_cmd(GICv3ITSState *s, uint64_t value, uint32_t offset,
>                        dte_valid ? "valid" : "invalid",
>                        ite_valid ? "valid" : "invalid",
>                        cte_valid ? "valid" : "invalid");
> -    } else if (eventid > max_eventid) {
> +    } else if (eventid >= num_eventids) {
>          qemu_log_mask(LOG_GUEST_ERROR,
> -                      "%s: invalid command attributes: eventid %d > %d\n",
> -                      __func__, eventid, max_eventid);
> +                      "%s: invalid command attributes: eventid %d >= %"
> +                      PRId64 "\n",
> +                      __func__, eventid, num_eventids);
>      } else {
>          /*
>           * Current implementation only supports rdbase == procnum
> @@ -336,7 +337,8 @@ static bool process_mapti(GICv3ITSState *s, uint64_t value, uint32_t offset,
>      AddressSpace *as = &s->gicv3->dma_as;
>      uint32_t devid, eventid;
>      uint32_t pIntid = 0;
> -    uint32_t max_eventid, max_Intid;
> +    uint64_t num_eventids;
> +    uint32_t max_Intid;
>      bool dte_valid;
>      MemTxResult res = MEMTX_OK;
>      uint16_t icid = 0;
> @@ -376,11 +378,11 @@ static bool process_mapti(GICv3ITSState *s, uint64_t value, uint32_t offset,
>          return result;
>      }
>      dte_valid = FIELD_EX64(dte, DTE, VALID);
> -    max_eventid = 1UL << (FIELD_EX64(dte, DTE, SIZE) + 1);
> +    num_eventids = 1ULL << (FIELD_EX64(dte, DTE, SIZE) + 1);
>      max_Intid = (1ULL << (GICD_TYPER_IDBITS + 1)) - 1;
>  
>      if ((devid >= s->dt.num_ids) || (icid >= s->ct.num_ids)
> -            || !dte_valid || (eventid > max_eventid) ||
> +            || !dte_valid || (eventid >= num_eventids) ||
>              (((pIntid < GICV3_LPI_INTID_START) || (pIntid > max_Intid)) &&
>               (pIntid != INTID_SPURIOUS))) {

It seems process_mapti has the similar "catch all the errors" if leg
that I split apart in process_its_command to make it easier to see what
failed.

However:

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>

-- 
Alex Bennée


  reply	other threads:[~2022-01-18 17:15 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-11 17:10 [PATCH v2 00/13] arm gicv3 ITS: Various bug fixes and refactorings Peter Maydell
2022-01-11 17:10 ` Peter Maydell
2022-01-11 17:10 ` [PATCH v2 01/13] hw/intc/arm_gicv3_its: Fix event ID bounds checks Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-18 17:13   ` Alex Bennée [this message]
2022-01-18 17:13     ` Alex Bennée
2022-01-28  1:33   ` Richard Henderson
2022-01-28 10:50     ` Peter Maydell
2022-01-28 10:50       ` Peter Maydell
2022-01-11 17:10 ` [PATCH v2 02/13] hw/intc/arm_gicv3_its: Convert int ID check to num_intids convention Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-28  1:35   ` Richard Henderson
2022-01-28 10:51     ` Peter Maydell
2022-01-28 10:51       ` Peter Maydell
2022-01-11 17:10 ` [PATCH v2 03/13] hw/intc/arm_gicv3_its: Fix handling of process_its_cmd() return value Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-11 17:10 ` [PATCH v2 04/13] hw/intc/arm_gicv3_its: Don't use data if reading command failed Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-11 17:10 ` [PATCH v2 05/13] hw/intc/arm_gicv3_its: Use enum for return value of process_* functions Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-11 17:10 ` [PATCH v2 06/13] hw/intc/arm_gicv3_its: Fix return codes in process_its_cmd() Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-11 17:10 ` [PATCH v2 07/13] hw/intc/arm_gicv3_its: Refactor process_its_cmd() to reduce nesting Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-11 17:10 ` [PATCH v2 08/13] hw/intc/arm_gicv3_its: Fix return codes in process_mapti() Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-11 17:10 ` [PATCH v2 09/13] hw/intc/arm_gicv3_its: Fix return codes in process_mapc() Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-11 17:10 ` [PATCH v2 10/13] hw/intc/arm_gicv3_its: Fix return codes in process_mapd() Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-11 17:10 ` [PATCH v2 11/13] hw/intc/arm_gicv3_its: Factor out "find address of table entry" code Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-18 17:31   ` Alex Bennée
2022-01-18 17:31     ` Alex Bennée
2022-01-11 17:10 ` [PATCH v2 12/13] hw/intc/arm_gicv3_its: Check indexes before use, not after Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-18 17:32   ` Alex Bennée
2022-01-18 17:32     ` Alex Bennée
2022-01-28  1:42   ` Richard Henderson
2022-01-28  1:42     ` Richard Henderson
2022-01-11 17:10 ` [PATCH v2 13/13] hw/intc/arm_gicv3_its: Range-check ICID before indexing into collection table Peter Maydell
2022-01-11 17:10   ` Peter Maydell
2022-01-18 17:37   ` Alex Bennée
2022-01-18 17:37     ` Alex Bennée
2022-01-28  1:44   ` Richard Henderson
2022-01-18 17:37 ` [PATCH v2 00/13] arm gicv3 ITS: Various bug fixes and refactorings Alex Bennée
2022-01-18 17:37   ` Alex Bennée
2022-01-18 19:41   ` Peter Maydell
2022-01-18 19:41     ` Peter Maydell
2022-01-18 23:29     ` Andre Przywara
2022-01-18 23:29       ` Andre Przywara
2022-01-19 10:15       ` Peter Maydell
2022-01-19 10:15         ` Peter Maydell
2022-01-19 21:15         ` Andre Przywara
2022-01-19 21:15           ` Andre Przywara

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=877dax9d9k.fsf@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=shashi.mallela@linaro.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.