memory barrier functions available for drivers.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25183 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user