[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