1/*
2 * Copyright 2014, Pawe�� Dziepak, pdziepak@quarnos.org.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Alexander von Gluck IV <kallisti5@unixzen.com>
7 */
8#ifndef _KERNEL_ARCH_SPARC_ATOMIC_H
9#define _KERNEL_ARCH_SPARC_ATOMIC_H
10
11
12static inline void
13memory_read_barrier_inline(void)
14{
15	// TODO
16}
17
18
19static inline void
20memory_write_barrier_inline(void)
21{
22	// TODO
23}
24
25
26static inline void
27memory_full_barrier_inline(void)
28{
29	// TODO
30}
31
32
33#define memory_read_barrier		memory_read_barrier_inline
34#define memory_write_barrier	memory_write_barrier_inline
35#define memory_full_barrier		memory_full_barrier_inline
36
37
38static inline void
39atomic_set_inline(int32* value, int32 newValue)
40{
41	memory_write_barrier();
42	*(volatile int32*)value = newValue;
43}
44
45
46static inline int32
47atomic_get_and_set_inline(int32* value, int32 newValue)
48{
49	// BIG TODO: PowerPC Atomic get and set
50//	asm volatile("xchgl %0, (%1)"
51//		: "+r" (newValue)
52//		: "r" (value)
53//		: "memory");
54	return newValue;
55}
56
57
58static inline int32
59atomic_test_and_set_inline(int32* value, int32 newValue, int32 testAgainst)
60{
61	// BIG TODO: PowerPC Atomic test and set inline
62//	asm volatile("lock; cmpxchgl %2, (%3)"
63//		: "=a" (newValue)
64//		: "0" (testAgainst), "r" (newValue), "r" (value)
65//		: "memory");
66	return newValue;
67}
68
69
70static inline int32
71atomic_add_inline(int32* value, int32 newValue)
72{
73	// BIG TODO: PowerPC Atomic add inline
74//	asm volatile("lock; xaddl %0, (%1)"
75//		: "+r" (newValue)
76//		: "r" (value)
77//		: "memory");
78	return newValue;
79}
80
81
82static inline int32
83atomic_get_inline(int32* value)
84{
85	int32 newValue = *(volatile int32*)value;
86	memory_read_barrier();
87	return newValue;
88}
89
90
91#define atomic_set				atomic_set_inline
92#define atomic_get_and_set		atomic_get_and_set_inline
93#ifndef atomic_test_and_set
94#	define atomic_test_and_set	atomic_test_and_set_inline
95#endif
96#ifndef atomic_add
97#	define atomic_add			atomic_add_inline
98#endif
99#define atomic_get				atomic_get_inline
100
101
102#endif	// _KERNEL_ARCH_PPC_ATOMIC_H
103
104