diff options
author | zbb <zbb@FreeBSD.org> | 2015-06-09 23:54:20 +0000 |
---|---|---|
committer | zbb <zbb@FreeBSD.org> | 2015-06-09 23:54:20 +0000 |
commit | f92ed4607337cadd40fda365acfe1e1194f38b73 (patch) | |
tree | 709337490c83df4a41a34ac058de73346f336747 | |
parent | f345babbfca23dd10525de6091afde9081199776 (diff) | |
download | FreeBSD-src-f92ed4607337cadd40fda365acfe1e1194f38b73.zip FreeBSD-src-f92ed4607337cadd40fda365acfe1e1194f38b73.tar.gz |
Add options to dmb() and dsb() macros on ARM64
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.
Obtained from: Semihalf
Reviewed by: andrew, ian
Sponsored by: The FreeBSD Foundation
-rw-r--r-- | sys/arm64/arm64/db_interface.c | 4 | ||||
-rw-r--r-- | sys/arm64/arm64/vfp.c | 2 | ||||
-rw-r--r-- | sys/arm64/include/atomic.h | 28 |
3 files changed, 24 insertions, 10 deletions
diff --git a/sys/arm64/arm64/db_interface.c b/sys/arm64/arm64/db_interface.c index 38834af..e40802f 100644 --- a/sys/arm64/arm64/db_interface.c +++ b/sys/arm64/arm64/db_interface.c @@ -156,13 +156,11 @@ db_write_bytes(vm_offset_t addr, size_t size, char *data) } *dst++ = *data++; } + dsb(ish); - dsb(); /* 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(); - isb(); return (0); } diff --git a/sys/arm64/arm64/vfp.c b/sys/arm64/arm64/vfp.c index 7ce59b8..5e44d5e 100644 --- a/sys/arm64/arm64/vfp.c +++ b/sys/arm64/arm64/vfp.c @@ -120,7 +120,7 @@ vfp_save_state(struct thread *td) td->td_pcb->pcb_fpcr = fpcr; td->td_pcb->pcb_fpsr = fpsr; - dsb(); + dsb(ish); vfp_disable(); } critical_exit(); diff --git a/sys/arm64/include/atomic.h b/sys/arm64/include/atomic.h index f0f6c17..99252b8 100644 --- 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) |