Skip to content

Commit

Permalink
[arch][barriers] add default memory barriers for all of the architect…
Browse files Browse the repository at this point in the history
…ures

Most are pretty straightforward, but a few of the more esoteric
architectures just defaults are implemented.
  • Loading branch information
travisg committed May 10, 2024
1 parent d3cd5be commit 339ff89
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 1 deletion.
1 change: 1 addition & 0 deletions arch/arm/include/arch/arch_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ static inline void arch_set_current_thread(struct thread *t) {

#endif

// TODO: use less strong versions of these (dsb sy/ld/st)
#define mb() DSB
#define wmb() DSB
#define rmb() DSB
Expand Down
2 changes: 1 addition & 1 deletion arch/m68k/include/arch/arch_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ static inline uint arch_curr_cpu_num(void) {
return 0;
}

// TODO: see if there's a proper (or required) memory barrier on 68k
// Default barriers for architectures that generally don't need them
#define mb() CF
#define wmb() CF
#define rmb() CF
Expand Down
9 changes: 9 additions & 0 deletions arch/microblaze/include/arch/arch_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,12 @@ static inline uint arch_curr_cpu_num(void) {
return 0;
}

// Default barriers for architectures that generally don't need them
// TODO: do we need these for microblaze?
#define mb() CF
#define wmb() CF
#define rmb() CF
#define smp_mb() CF
#define smp_wmb() CF
#define smp_rmb() CF

10 changes: 10 additions & 0 deletions arch/mips/include/arch/arch_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,13 @@ static inline uint arch_curr_cpu_num(void) {
return 0;
}

// Default barriers for architectures that generally don't need them
// TODO: do we need these for mips?
#define mb() CF
#define wmb() CF
#define rmb() CF
#define smp_mb() CF
#define smp_wmb() CF
#define smp_rmb() CF


10 changes: 10 additions & 0 deletions arch/or1k/include/arch/arch_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,14 @@ static inline ulong arch_cycle_count(void) { return 0; }
static inline uint arch_curr_cpu_num(void) {
return 0;
}

// Default barriers for architectures that generally don't need them
// TODO: do we need these for or1k?
#define mb() CF
#define wmb() CF
#define rmb() CF
#define smp_mb() CF
#define smp_wmb() CF
#define smp_rmb() CF

#endif // !ASSEMBLY
27 changes: 27 additions & 0 deletions arch/x86/include/arch/arch_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,31 @@ static inline uint arch_curr_cpu_num(void) {
return 0;
}

#if ARCH_X86_64
// relies on SSE2
#define mb() __asm__ volatile("mfence" : : : "memory")
#define rmb() __asm__ volatile("lfence" : : : "memory")
#define wmb() __asm__ volatile("sfence" : : : "memory")
#else
// Store to the top of the stack as a load/store barrier. Cannot
// rely on SS2 being intrinsically available for older i386 class hardware.
#define __storeload_barrier \
__asm__ volatile("lock; addl $0, (%%esp)" : : : "memory", "cc")
#define mb() __storeload_barrier
#define rmb() __storeload_barrier
#define wmb() __storeload_barrier
#endif

#ifdef WITH_SMP
// XXX probably too strict
#define smp_mb() mb
#define smp_rmb() rmb
#define smp_wmb() wmb
#else
#define smp_mb() CF
#define smp_wmb() CF
#define smp_rmb() CF
#endif


#endif // !ASSEMBLY

0 comments on commit 339ff89

Please sign in to comment.