[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] xen/riscv: read hart_id and dtb_base passed by bootloader



On Mon, 2023-02-27 at 10:17 +0100, Jan Beulich wrote:
> On 24.02.2023 17:36, Oleksii wrote:
> > On Fri, 2023-02-24 at 16:04 +0100, Jan Beulich wrote:
> > > On 24.02.2023 15:48, Oleksii Kurochko wrote:
> > > > Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
> > > > ---
> > > >  xen/arch/riscv/setup.c | 12 ++++++++++++
> > > >  1 file changed, 12 insertions(+)
> > > > 
> > > > diff --git a/xen/arch/riscv/setup.c b/xen/arch/riscv/setup.c
> > > > index b3f8b10f71..154bf3a0bc 100644
> > > > --- a/xen/arch/riscv/setup.c
> > > > +++ b/xen/arch/riscv/setup.c
> > > > @@ -26,6 +26,18 @@ static void test_macros_from_bug_h(void)
> > > >  
> > > >  void __init noreturn start_xen(void)
> > > >  {
> > > > +    /*
> > > > +     * The following things are passed by bootloader:
> > > > +     *   a0 -> hart_id
> > > > +     *   a1 -> dtb_base
> > > > +    */
> > > > +    register unsigned long hart_id  asm("a0");
> > > > +    register unsigned long dtb_base asm("a1");
> > > > +
> > > > +    asm volatile( "mv %0, a0" : "=r" (hart_id) );
> > > > +
> > > > +    asm volatile( "mv %0, a1" : "=r" (dtb_base) );
> > > 
> > > Are you sure this (a) works and (b) is what you want? You're
> > > inserting
> > Oh, yeah... it should be:
> >   unsigned long hart_id;
> >   unsigned long dtb_base;
> 
> As per below - no, I don't think so. I continue to think these want
> to be function parameters.
> 
> > I did experiments with 'register' and 'asm()' and after rebase of
> > my
> > internal branches git backed these changes...
> > 
> > Sorry for that I have to double check patches next time.
> > 
> > It looks like it works only because the variables aren't used
> > anywhere.
> > > "mov a0, a0" and "mov a1, a1". I suppose as long as the two local
> > > variables aren't used further down in the function, the compiler
> > > will
> > > be able to recognize both registers as dead, and hence use them
> > > for
> > > argument passing to later functions that you call. But I would
> > > expect
> > > that to break once you actually consume either of the variables.
> > > 
> > > Fundamentally I think this is the kind of thing you want do to in
> > > assembly. However, in the specific case here, can't you simply
> > > have
> > > 
> > > void __init noreturn start_xen(unsigned long hard_id,
> > >                                unsigned long dtb_base)
> > > {
> > >     ...
> > > 
> > > and all is going to be fine, without any asm()?
> > One of the things that I would like to do is to not use an
> > assembler as
> > much as possible. And as we have C environment ready after a few
> > assembly instructions in head.S I thought it would be OK to do it
> > in C
> > code somewhere at the start so someone/sonething doesn't alter
> > register
> > a0 and a1.
> 
> Avoiding assembly code where possible if of course appreciated,
> because
> generally C code is easier to maintain. But of course this can only
> be
> done if things can be expressed correctly. And you need to keep in
> mind
> that asm() statements also are assembly code, just lower volume.
> 
Let's get hard_id and dtb_base in head.S and pass them as arguments of
start_xen() function as you mentioned before.
I'll update the patch and send new version.
> Jan
~ Oleksii




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.