[Differential] [Request, 34 lines] D2701: Add options to dmb() and dsb() macros

zbb (Zbigniew Bodek) phabric-noreply at FreeBSD.org
Mon Jun 1 00:14:53 UTC 2015


zbb created this revision.
zbb added reviewers: andrew, emaste, imp, ian.
zbb added a subscriber: freebsd-arm.
zbb set the repository for this revision to rS FreeBSD src repository.
Herald added subscribers: imp, andrew, emaste.

REVISION SUMMARY
  Using plain dsb()/dmb() as full system barriers is usually to much.
  Adding proper options to those barriers (instead of full system - sy)
  will most likely reduce the cost of the instructions and will benefit
  in performance improvement.
  This commit adds options to barrier macro definitions.
  All previously set barriers are as they were (full system barriers) but
  this approach should be revised in the future.
  
  Obtained from: Semihalf
  Sponsored by:  The FreeBSD Foundation

REPOSITORY
  rS FreeBSD src repository

REVISION DETAIL
  https://reviews.freebsd.org/D2701

AFFECTED FILES
  sys/arm64/arm64/db_interface.c
  sys/arm64/arm64/vfp.c
  sys/arm64/include/atomic.h

CHANGE DETAILS
  diff --git a/sys/arm64/include/atomic.h b/sys/arm64/include/atomic.h
  --- a/sys/arm64/include/atomic.h
  +++ b/sys/arm64/include/atomic.h
  @@ -29,13 +29,29 @@
   #ifndef	_MACHINE_ATOMIC_H_
   #define	_MACHINE_ATOMIC_H_
   
  -#define	isb()  __asm __volatile("isb" : : : "memory")
  -#define	dsb()  __asm __volatile("dsb sy" : : : "memory")
  -#define	dmb()  __asm __volatile("dmb sy" : : : "memory")
  +#define isb()  __asm __volatile("isb" : : : "memory")
   
  -#define	mb()   dmb()
  -#define	wmb()  dmb()
  -#define	rmb()  dmb()
  +/*
  + * Options for DMB and DSB:
  + *	oshld	Outer Shareable, load
  + *	oshst	Outer Shareable, store
  + *	osh	Outer Shareable, all
  + *	nshld	Non-shareable, load
  + *	nshst	Non-shareable, store
  + *	nsh	Non-shareable, all
  + *	ishld	Inner Shareable, load
  + *	ishst	Inner Shareable, store
  + *	ish	Inner Shareable, all
  + *	ld	Full system, load
  + *	st	Full system, store
  + *	sy	Full system, all
  + */
  +#define dsb(opt)  __asm __volatile("dsb " __STRING(opt) : : : "memory")
  +#define dmb(opt)  __asm __volatile("dmb " __STRING(opt) : : : "memory")
  +
  +#define mb()   dmb(sy)	/* Full system memory barrier all */
  +#define wmb()  dmb(st)	/* Full system memory barrier store */
  +#define rmb()  dmb(ld)	/* Full system memory barrier load */
   
   static __inline void
   atomic_add_32(volatile uint32_t *p, uint32_t val)
  diff --git a/sys/arm64/arm64/vfp.c b/sys/arm64/arm64/vfp.c
  --- a/sys/arm64/arm64/vfp.c
  +++ b/sys/arm64/arm64/vfp.c
  @@ -120,7 +120,7 @@
   		td->td_pcb->pcb_fpcr = fpcr;
   		td->td_pcb->pcb_fpsr = fpsr;
   
  -		dsb();
  +		dsb(sy);
   		vfp_disable();
   	}
   	critical_exit();
  diff --git a/sys/arm64/arm64/db_interface.c b/sys/arm64/arm64/db_interface.c
  --- a/sys/arm64/arm64/db_interface.c
  +++ b/sys/arm64/arm64/db_interface.c
  @@ -157,11 +157,11 @@
   		*dst++ = *data++;
   	}
   
  -	dsb();
  +	dsb(sy);
   	/* Clean D-cache and invalidate I-cache */
   	cpu_dcache_wb_range(addr, (vm_size_t)size);
   	cpu_icache_sync_range(addr, (vm_size_t)size);
  -	dsb();
  +	dsb(sy);
   	isb();
   
   	return (0);

EMAIL PREFERENCES
  https://reviews.freebsd.org/settings/panel/emailpreferences/

To: zbb, andrew, emaste, imp, ian
Cc: emaste, andrew, imp, freebsd-arm
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D2701.5849.patch
Type: text/x-patch
Size: 1974 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-arm/attachments/20150601/978405e6/attachment.bin>


More information about the freebsd-arm mailing list