[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 07/15] hw/intc: sifive_plic: Improve robustness of the PLIC c
From: |
Alistair Francis |
Subject: |
Re: [PATCH 07/15] hw/intc: sifive_plic: Improve robustness of the PLIC config parser |
Date: |
Wed, 7 Dec 2022 14:21:34 +1000 |
On Fri, Dec 2, 2022 at 12:15 AM Bin Meng <bmeng@tinylab.org> wrote:
>
> At present the PLIC config parser can only handle legal config string
> like "MS,MS". However if a config string like ",MS,MS,,MS,MS,," is
> given the parser won't get the correct configuration.
>
> This commit improves the config parser to make it more robust.
>
> Signed-off-by: Bin Meng <bmeng@tinylab.org>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
>
> hw/intc/sifive_plic.c | 24 ++++++++++++++++--------
> 1 file changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/hw/intc/sifive_plic.c b/hw/intc/sifive_plic.c
> index 3f6ffb1d70..5fd9a53569 100644
> --- a/hw/intc/sifive_plic.c
> +++ b/hw/intc/sifive_plic.c
> @@ -290,7 +290,7 @@ static void sifive_plic_reset(DeviceState *dev)
> */
> static void parse_hart_config(SiFivePLICState *plic)
> {
> - int addrid, hartid, modes;
> + int addrid, hartid, modes, m;
> const char *p;
> char c;
>
> @@ -299,11 +299,13 @@ static void parse_hart_config(SiFivePLICState *plic)
> p = plic->hart_config;
> while ((c = *p++)) {
> if (c == ',') {
> - addrid += ctpop8(modes);
> - modes = 0;
> - hartid++;
> + if (modes) {
> + addrid += ctpop8(modes);
> + hartid++;
> + modes = 0;
> + }
> } else {
> - int m = 1 << char_to_mode(c);
> + m = 1 << char_to_mode(c);
> if (modes == (modes | m)) {
> error_report("plic: duplicate mode '%c' in config: %s",
> c, plic->hart_config);
> @@ -314,8 +316,9 @@ static void parse_hart_config(SiFivePLICState *plic)
> }
> if (modes) {
> addrid += ctpop8(modes);
> + hartid++;
> + modes = 0;
> }
> - hartid++;
>
> plic->num_addrs = addrid;
> plic->num_harts = hartid;
> @@ -326,11 +329,16 @@ static void parse_hart_config(SiFivePLICState *plic)
> p = plic->hart_config;
> while ((c = *p++)) {
> if (c == ',') {
> - hartid++;
> + if (modes) {
> + hartid++;
> + modes = 0;
> + }
> } else {
> + m = char_to_mode(c);
> plic->addr_config[addrid].addrid = addrid;
> plic->addr_config[addrid].hartid = hartid;
> - plic->addr_config[addrid].mode = char_to_mode(c);
> + plic->addr_config[addrid].mode = m;
> + modes |= (1 << m);
> addrid++;
> }
> }
> --
> 2.34.1
>
>
- [PATCH 03/15] hw/riscv: Fix opentitan dependency to SIFIVE_PLIC, (continued)
- [PATCH 03/15] hw/riscv: Fix opentitan dependency to SIFIVE_PLIC, Bin Meng, 2022/12/01
- [PATCH 06/15] hw/intc: sifive_plic: Drop PLICMode_H, Bin Meng, 2022/12/01
- [PATCH 05/15] hw/riscv: spike: Remove misleading comments, Bin Meng, 2022/12/01
- [PATCH 07/15] hw/intc: sifive_plic: Improve robustness of the PLIC config parser, Bin Meng, 2022/12/01
- Re: [PATCH 07/15] hw/intc: sifive_plic: Improve robustness of the PLIC config parser,
Alistair Francis <=
- [PATCH 04/15] hw/riscv: Sort machines Kconfig options in alphabetical order, Bin Meng, 2022/12/01
- [PATCH 08/15] hw/intc: sifive_plic: Update "num-sources" property default value, Bin Meng, 2022/12/01
- [PATCH 09/15] hw/riscv: microchip_pfsoc: Fix the number of interrupt sources of PLIC, Bin Meng, 2022/12/01
- [PATCH 11/15] hw/riscv: sifive_u: Avoid using magic number for "riscv, ndev", Bin Meng, 2022/12/01