[PATCH v1] generic: mips: support harts to boot from mips_warm_boot

Chao-ying Fu icebergfu at gmail.com
Tue Jul 22 14:35:21 PDT 2025


On Wed, Jul 16, 2025 at 5:04 PM Samuel Holland
<samuel.holland at sifive.com> wrote:
>
> On 2025-07-10 6:17 PM, Chao-ying Fu wrote:
> > We program reset base for harts (other than hart 0) to boot at
> > mips_warm_boot that jumps to _start_warm. This helps to skip some code
> > sequence to speed up.
> >
> > Signed-off-by: Chao-ying Fu <cfu at mips.com>
> > ---
> >  platform/generic/mips/p8700.c | 19 +++++++++++++++++++
> >  1 file changed, 19 insertions(+)
> >
> > diff --git a/platform/generic/mips/p8700.c b/platform/generic/mips/p8700.c
> > index 888a45c..687912a 100644
> > --- a/platform/generic/mips/p8700.c
> > +++ b/platform/generic/mips/p8700.c
> > @@ -140,6 +140,22 @@ static void power_up_other_cluster(u32 hartid)
> >  }
> >  #endif
> >
> > +static void __attribute__((naked,no_instrument_function,aligned(4096)))
> > +mips_warm_boot(void)
> > +{
> > +  __asm__ __volatile__(
> > +     "       j       1f\n"
> > +     "       .align  2\n"
> > +     "       j       1f\n"
> > +     "       .align  2\n"
> > +     "       j       1f\n"
> > +     "       .align  2\n"
> > +     "       j       1f\n"
> > +     "1:     lla     t0, _start_warm\n"
> > +     "       jr      t0\n"
>
> The double/indirect jump is not necessary. jal (j) range is +/- 1 MiB, which is
> much larger than the OpenSBI firmware size. So each entry point can jump to
> _start_warm directly.
>
> Regards,
> Samuel
  Yes, we can use only one jump instruction to _start_warm for each
entry point, as you pointed out.
I will send out a new patch.

  Thanks a lot!

Regards,
Chao-ying

>
> > +     );
> > +}
> > +
> >  static int mips_hart_start(u32 hartid, ulong saddr)
> >  {
> >       unsigned int stat;
> > @@ -150,6 +166,9 @@ static int mips_hart_start(u32 hartid, ulong saddr)
> >       if (hartid == 0)
> >               return SBI_ENOTSUPP;
> >
> > +     /* Change reset base to mips_warm_boot */
> > +     write_gcr_co_reset_base(hartid, (unsigned long)mips_warm_boot, local_p);
> > +
> >       if (cpu_hart(hartid) == 0) {
> >               /* Ensure its coherency is disabled */
> >               write_gcr_co_coherence(hartid, 0, local_p);
>



More information about the opensbi mailing list