[PATCH] lib: sbi_illegal_insn: Emulate c.li

Xiang W wxjstz at 126.com
Thu Nov 9 07:22:46 PST 2023


在 2023-11-09星期四的 15:48 +0100,Björn Töpel写道:
> On Thu, 9 Nov 2023 at 09:26, Xiang W <wxjstz at 126.com> wrote:
> > 
> > The Linux kernel RISC-V image format allows that UEFI Images can also
> > be booted by non-UEFI firmware. However for that to work, the PE/Image
> > combo requires that 'MZ' is a valid instruction. On RISC-V, 'MZ' is
> > only a valid instruction if the hardware is C capable [1]. So add
> > Emulate c.li
> > 
> > Signed-off-by: Björn Töpel <bjorn at rivosinc.com>
> > Signed-off-by: Xiang W <wxjstz at 126.com>
> > ---
> >  lib/sbi/sbi_illegal_insn.c | 18 +++++++++++++++++-
> >  1 file changed, 17 insertions(+), 1 deletion(-)
> > 
> > diff --git a/lib/sbi/sbi_illegal_insn.c b/lib/sbi/sbi_illegal_insn.c
> > index 2be4757..4ab10f4 100644
> > --- a/lib/sbi/sbi_illegal_insn.c
> > +++ b/lib/sbi/sbi_illegal_insn.c
> > @@ -102,6 +102,22 @@ static int system_opcode_insn(ulong insn, struct sbi_trap_regs *regs)
> >         return 0;
> >  }
> > 
> > +static int compressed_insn(ulong insn, struct sbi_trap_regs *regs) {
> > +       unsigned long imm, rd;
> > +       unsigned long *regs_p = (unsigned long *)regs;
> > +
> > +       if ((insn & 0xe003) == 0x4001) { /* c.li */
> > +               imm = (insn >> 2) & 0x1f;
> > +               imm |= ((insn >> 12) & 1) ? -32 : 0;
> > +               rd = (insn >> 7) & 0x1f;
> > +               if (rd)
> > +                       regs_p[rd] = imm;
> > +               return 0;
> > +       }
> 
> The mepc update is missing, so this patch will not work.
> 
> That aside, what Jess pointed out is that on a machine *NOT*
> supporting C, we're not emulating anything. The 16b instruction
> parcels do not exist here, so we cannot really emulate that. Instead,
> what the firmware gets is a 32b bogus/nonexisting instruction.
> Emulating that is... weird. A valid concern! ;-)
> 
> The Linux Image spec says that code0 can be 'MZ' (and will be for UEFI
> images). One correct fix (I think) is changing the non-UEFI loader,
> fixing up code0 if it's MZ, making sure not to execute that (well, you
> could on C capable machines).  That, or changing specs.
Ok. let's abandon.

Regards,
Xiang W

> 
> 
> Björn




More information about the opensbi mailing list