[PATCH] lib: fix atomic_add_return

Anup Patel Anup.Patel at wdc.com
Fri Apr 9 14:48:29 BST 2021



> -----Original Message-----
> From: Anup Patel
> Sent: 06 April 2021 11:26
> To: Xiang W <wxjstz at 126.com>; opensbi at lists.infradead.org
> Subject: RE: [PATCH] lib: fix atomic_add_return
> 
> 
> 
> > -----Original Message-----
> > From: Xiang W <wxjstz at 126.com>
> > Sent: 06 April 2021 09:05
> > To: opensbi at lists.infradead.org
> > Cc: Anup Patel <Anup.Patel at wdc.com>; Xiang W <wxjstz at 126.com>
> > Subject: [PATCH] lib: fix atomic_add_return
> >
> > unsigned length may be 4 bytes or 8 bytes, amoadd.w only applies to 4
> > bytes, so submit this patch
> >
> > Signed-off-by: Xiang W <wxjstz at 126.com>
> 
> Good catch. This patch looks good to me.
> 
> Reviewed-by: Anup Patel <anup.patel at wdc.com>

Improved patch subject and commit description little bit
at time of applying this patch.

Applied this patch to the riscv/opensbi repo

Regards,
Anup

> 
> Regards,
> Anup
> 
> > ---
> >  lib/sbi/riscv_atomic.c | 18 ++++++++----------
> >  1 file changed, 8 insertions(+), 10 deletions(-)
> >
> > diff --git a/lib/sbi/riscv_atomic.c b/lib/sbi/riscv_atomic.c index
> > 558bca8..528686f 100644
> > --- a/lib/sbi/riscv_atomic.c
> > +++ b/lib/sbi/riscv_atomic.c
> > @@ -28,25 +28,23 @@ void atomic_write(atomic_t *atom, long value)
> > long atomic_add_return(atomic_t *atom, long value)  {
> >  	long ret;
> > -
> > +#if __SIZEOF_LONG__ == 4
> >  	__asm__ __volatile__("	amoadd.w.aqrl  %1, %2, %0"
> >  			     : "+A"(atom->counter), "=r"(ret)
> >  			     : "r"(value)
> >  			     : "memory");
> > -
> > +#elif __SIZEOF_LONG__ == 8
> > +	__asm__ __volatile__("	amoadd.d.aqrl  %1, %2, %0"
> > +			     : "+A"(atom->counter), "=r"(ret)
> > +			     : "r"(value)
> > +			     : "memory");
> > +#endif
> >  	return ret + value;
> >  }
> >
> >  long atomic_sub_return(atomic_t *atom, long value)  {
> > -	long ret;
> > -
> > -	__asm__ __volatile__("	amoadd.w.aqrl  %1, %2, %0"
> > -			     : "+A"(atom->counter), "=r"(ret)
> > -			     : "r"(-value)
> > -			     : "memory");
> > -
> > -	return ret - value;
> > +	return atomic_add_return(atom, -value);
> >  }
> >
> >  #define __axchg(ptr, new, size)
> > 		\
> > --
> > 2.20.1




More information about the opensbi mailing list