Message ID | 20221201140811.142123-7-bmeng@tinylab.org |
---|---|
State | New |
Headers | show |
Series | [01/15] hw/riscv: Select MSI_NONBROKEN in SIFIVE_PLIC | expand |
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 > >
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++; } }
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> --- hw/intc/sifive_plic.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-)