Exposed SPARC iobus to userspace
[akaros.git] / kern / arch / sparc / bitmask.h
1 #ifndef ROS_ARCH_BITMASK_H
2 #define ROS_ARCH_BITMASK_H
3
4 #ifndef __IVY__
5 #include <ros/noivy.h>
6 #endif
7
8 #include <string.h>
9 #include <sys/types.h>
10 #include <atomic.h>
11 #include <stdio.h>
12
13 #define BYTES_FOR_BITMASK(size) (size)
14 #define BYTES_FOR_BITMASK_WITH_CHECK(size) (size)
15 #define DECL_BITMASK(name, size) uint8_t (name)[BYTES_FOR_BITMASK((size))]
16
17 #define GET_BITMASK_BIT(name, bit) ((name)[(bit)])
18 #define SET_BITMASK_BIT(name, bit) ((name)[(bit)] = 1)
19 #define CLR_BITMASK_BIT(name, bit) ((name)[(bit)] = 0)
20 #define SET_BITMASK_BIT_ATOMIC SET_BITMASK_BIT
21 #define CLR_BITMASK_BIT_ATOMIC CLR_BITMASK_BIT
22
23 #define CLR_BITMASK(name, size) \
24 ({ \
25         {TRUSTEDBLOCK \
26         memset((void*)((uintptr_t)(name)), 0, BYTES_FOR_BITMASK((size))); \
27         } \
28 })
29
30 #define FILL_BITMASK(name, size) \
31 ({ \
32         {TRUSTEDBLOCK \
33         memset((void*)((uintptr_t)(name)), 1, BYTES_FOR_BITMASK((size))); \
34         } \
35 }) 
36
37 #define COPY_BITMASK(newmask, oldmask, size) \
38 ({ \
39         {TRUSTEDBLOCK \
40         memcpy((void*)((uintptr_t)(newmask)), \
41            (void*)((uintptr_t)(oldmask)), \
42            BYTES_FOR_BITMASK((size))); \
43         } \
44 })
45
46 // this checks the entire last byte, so keep it 0 in the other macros
47 #define BITMASK_IS_CLEAR(name, size) ({ \
48         uint32_t __n = BYTES_FOR_BITMASK((size)); \
49         bool clear = 1; \
50         while (__n-- > 0) { \
51                 if ((name)[__n]) { \
52                         clear = 0; \
53                         break;\
54                 }\
55         } \
56         clear; })
57
58 static inline bool BITMASK_IS_FULL(uint8_t* map, size_t size)
59 {
60         int _size = size;
61         for (int i = 0; i < BYTES_FOR_BITMASK(size); i++) {
62                 for (int j = 0; j < MIN(8,_size); j++)
63                         if(!GET_BITMASK_BIT(map, i))
64                                 return FALSE;
65                         _size--;
66         }
67         return TRUE;
68 }
69
70 #define PRINT_BITMASK(name, size) { \
71         int i;  \
72         for (i = 0; i < BYTES_FOR_BITMASK(size); i++) { \
73                 printk("%x", (name)[i] );       \
74         } \
75         printk("\n"); \
76 }
77
78 static inline bool BITMASK_IS_SET_IN_RANGE(uint8_t* m, size_t beg, size_t end)
79 {
80         for(size_t i=beg; i<end; i++) {
81                 if(!GET_BITMASK_BIT(m, i))
82                         return FALSE;
83         }
84         return TRUE;
85 }
86
87 static inline bool BITMASK_IS_CLR_IN_RANGE(uint8_t* m, size_t beg, size_t end)
88 {
89         for(size_t i=beg; i<end; i++) {
90                 if(GET_BITMASK_BIT(m, i))
91                         return FALSE;
92         }
93         return TRUE;
94 }
95
96 static inline void SET_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
97 {
98         for(size_t i=beg; i<end; i++) {
99                 SET_BITMASK_BIT(m, i);
100         }
101 }
102
103 static inline void CLR_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
104 {
105         for(size_t i=beg; i<end; i++) {
106                 CLR_BITMASK_BIT(m, i);
107         }
108 }
109 #endif /* ROS_ARCH_BITMASK_H */
110