On Mon, 2023-01-23 at 17:14 -0500, Jesse Taube wrote:
>  > From: Alistair Francis <alistair.fran...@wdc.com>
>  >
>  > If the CSRs and CSR instructions are disabled because the Zicsr
>  > extension isn't enabled then we want to make sure we don't run any
> CSR
>  > instructions in the boot ROM.
>  >
>  > This patches removes the CSR instructions from the reset-vec if
> the
>  > extension isn't enabled. We replace the instruction with a NOP
> instead.
>  >
>  > Note that we don't do this for the SiFive U machine, as we are
> modelling
>  > the hardware in that case.
>  >
>  > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1447
>  > Signed-off-by: Alistair Francis <alistair.fran...@wdc.com>
>  > ---
>  >  hw/riscv/boot.c | 9 +++++++++
>  >  1 file changed, 9 insertions(+)
>  >
>  > diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c
>  > index 2594276223..cb27798a25 100644
>  > --- a/hw/riscv/boot.c
>  > +++ b/hw/riscv/boot.c
>  > @@ -356,6 +356,15 @@ void riscv_setup_rom_reset_vec(MachineState 
> *machine,
>  > RISCVHartArrayState *harts
>  >          reset_vec[4] = 0x0182b283;   /*     ld     t0, 24(t0) */
>  >      }
>  >
>  > +    if (!harts->harts[0].cfg.ext_icsr) {
>  > +        /*
>  > +         * The Zicsr extension has been disabled, so let's ensure
> we 
> don't
>  > +         * run the CSR instruction. Let's fill the address with a
> non
>  > +         * compressed nop.
>  > +         */
>  > +        reset_vec[2] = 0x00000013;   /*     addi   x0, x0, 0 */
>                 reset_vec[2] = 0x00000513; /*     li   a0, 0 */
> Shouldn't it be li as a0 should contain the cpu number. The regs are
> initialized with 0 so its not necessary but nice to be explicit.

So we can't just run:

   li   a0, x

where x is the hart ID as each CPU runs the same reset code.

So we could run:

    li   a0, 0

To zero out a0, but as a0 is 0 on reset I don't think we need to.

This current instruction should be decoded as a NOP, which I think is
simpler for users to understand. Otherwise we will have code on CPU1
that sets a0 to 0, which to me seems more confusing.

Alistair

> 
> Thanks,
> Jesse T
>  > +    }
>  > +
>  >      /* copy in the reset vector in little_endian byte order */
>  >      for (i = 0; i < ARRAY_SIZE(reset_vec); i++) {
>  >          reset_vec[i] = cpu_to_le32(reset_vec[i]);
>  > --
>  > 2.39.0

Reply via email to