Hi Peng:
On 1/22/2026 5:31 PM, Peng Jiang wrote:
> Hi Chao,
> 
> I found a small issue in the reset_rom implementation in hw/riscv/k230.c.
> 
>> +static void k230_machine_done(Notifier *notifier, void *data)
>> +{
>> +    ...
>> +    /* Mask ROM reset vector */
>> +    uint32_t reset_vec[] = {
>> +        /* 0x91200000: auipc  t0, 0x0              */ 0x00000297,
>> +        /* 0x91200004: addi   t0, t0, 36 # <trap>  */ 0x02428293,
>> +        /* 0x91200008: csrw   mtvec, t0            */ 0x30529073,
>> +        ...
>> +        /* trap:                                   */
>> +        /* 0x91200030: j      0x91200030 # <trap>  */ 0x0000006f,
>> +    };
>> +
>> +    /* copy in the reset vector in little_endian byte order */
>> +    for (int i = 0; i < sizeof(reset_vec) >> 2; i++) {
>> +        reset_vec[i] = cpu_to_le32(reset_vec[i]);
>> +    }
>> +    rom_add_blob_fixed_as("mrom.reset", reset_vec, sizeof(reset_vec),
>> +                          memmap[K230_DEV_BOOTROM].base, 
>> &address_space_memory);
>> ...
>> +}
> 
> It seems the offset for the trap handler is incorrect.
> 
> The instruction at 0x91200004 is addi t0, t0, 36. After the auipc at 
> 0x91200000, this sets the value of t0 to 0x91200000 + 36 (0x91200024), which 
> is then written to the mtvec register.
> 
> However, the actual trap: label is located at offset 0x30 (0x91200030).
> 
> The immediate value in the addi instruction should probably be 48 (0x30) 
> instead of 36 (0x24) to point to the correct trap handler address.
> 
> Best regards,
> Panda Jiang
Thank you for reporting this bug. I will fix it in v5. :)

Thanks,
Chao

Reply via email to