diff --git a/headers/os/drivers/KernelExport.h b/headers/os/drivers/KernelExport.h index 921301c3be..2f419518ef 100644 --- a/headers/os/drivers/KernelExport.h +++ b/headers/os/drivers/KernelExport.h @@ -154,6 +154,8 @@ extern status_t unregister_kernel_daemon(daemon_hook hook, void *arg); extern void call_all_cpus(void (*func)(void *, int), void *cookie); extern void call_all_cpus_sync(void (*func)(void *, int), void *cookie); +extern void memory_read_barrier(void); +extern void memory_write_barrier(void); /* safe methods to access user memory without having to lock it */ extern status_t user_memcpy(void *to, const void *from, size_t size); diff --git a/headers/private/kernel/arch/cpu.h b/headers/private/kernel/arch/cpu.h index 725a2f4ad9..3bb4060d44 100644 --- a/headers/private/kernel/arch/cpu.h +++ b/headers/private/kernel/arch/cpu.h @@ -41,6 +41,10 @@ status_t arch_cpu_user_memset(void *s, char c, size_t count, void arch_cpu_idle(void); void arch_cpu_sync_icache(void *address, size_t length); +void arch_cpu_memory_read_barrier(void); +void arch_cpu_memory_write_barrier(void); + + #ifdef __cplusplus } #endif diff --git a/src/system/kernel/arch/m68k/arch_cpu.cpp b/src/system/kernel/arch/m68k/arch_cpu.cpp index 628b4e86ac..d26e20ebad 100644 --- a/src/system/kernel/arch/m68k/arch_cpu.cpp +++ b/src/system/kernel/arch/m68k/arch_cpu.cpp @@ -110,6 +110,22 @@ arch_cpu_sync_icache(void *address, size_t len) } +void +arch_cpu_memory_read_barrier(void) +{ + asm volatile ("nop;" : : : "memory"); +#warning M68k: check arch_cpu_memory_read_barrier +} + + +void +arch_cpu_memory_write_barrier(void) +{ + asm volatile ("nop;" : : : "memory"); +#warning M68k: check arch_cpu_memory_write_barrier +} + + void arch_cpu_invalidate_TLB_range(addr_t start, addr_t end) { diff --git a/src/system/kernel/arch/ppc/arch_cpu.cpp b/src/system/kernel/arch/ppc/arch_cpu.cpp index a27c179d9c..256bccae78 100644 --- a/src/system/kernel/arch/ppc/arch_cpu.cpp +++ b/src/system/kernel/arch/ppc/arch_cpu.cpp @@ -82,6 +82,23 @@ arch_cpu_sync_icache(void *address, size_t len) } +void +arch_cpu_memory_read_barrier(void) +{ +#warning PPC: is it model-dependant ? + asm volatile ("lwsync"); +} + + +void +arch_cpu_memory_write_barrier(void) +{ +#warning PPC: is it model-dependant ? + asm volatile ("isync"); + asm volatile ("eioio"); +} + + void arch_cpu_invalidate_TLB_range(addr_t start, addr_t end) { diff --git a/src/system/kernel/arch/x86/arch_cpu.c b/src/system/kernel/arch/x86/arch_cpu.c index ad5d25308a..3b2c949c76 100644 --- a/src/system/kernel/arch/x86/arch_cpu.c +++ b/src/system/kernel/arch/x86/arch_cpu.c @@ -713,3 +713,19 @@ arch_cpu_sync_icache(void *address, size_t length) // instruction cache is always consistent on x86 } + +void +arch_cpu_memory_read_barrier(void) +{ + asm volatile ("lock;" : : : "memory"); + asm volatile ("addl $0,0(%%esp);" : : : "memory"); +} + + +void +arch_cpu_memory_write_barrier(void) +{ + asm volatile ("lock;" : : : "memory"); + asm volatile ("addl $0,0(%%esp);" : : : "memory"); +} + diff --git a/src/system/kernel/smp.c b/src/system/kernel/smp.c index d932ef9e41..0fce443e5b 100644 --- a/src/system/kernel/smp.c +++ b/src/system/kernel/smp.c @@ -681,3 +681,17 @@ call_all_cpus_sync(void (*func)(void *, int), void *cookie) restore_interrupts(state); } + +void +memory_read_barrier(void) +{ + arch_cpu_memory_read_barrier(); +} + + +void +memory_write_barrier(void) +{ + arch_cpu_memory_write_barrier(); +} +