b61dfc1459059924a3246d2e700d4daddef11b69
[akaros.git] / kern / drivers / net / udrvr / compat.h
1 /*
2  * Copyright (c) 2016 Google Inc.
3  * Author: Kanoj Sarcar <kanoj@google.com>
4  * See LICENSE for details.
5  *
6  * A majority of macros in this file should migrate to compat_todo.h,
7  * which should hold source copied from Linux. Some part of macros
8  * will also move into linux_compat.h to translate from Linux to
9  * Akaros. A tiny portion should remain here, since those are stub
10  * or hack definitions whose scope should be restricted only to mlx4u/
11  * and udrvr/
12  */
13 #include <linux_compat.h>
14
15 #include <arch/uaccess.h>       /* copy_from_user(), copy_to_user() */
16
17 #define access_ok(type, addr, size)     1
18
19 /*
20  * Device file /dev/XXXX has a dentry and inode that is associated
21  * with the "struct file" for each user process opening the device file.
22  * Thus, we can stash private data into file->f_dentry->d_fs_info or
23  * into file->f_dentry->d_inode->i_fs_info.
24  */
25 #define set_fs_info(_p_, _v_)           \
26         do { (_p_)->f_dentry->d_fs_info = (_v_); } while(0)
27 #define get_fs_info(_p_)        ((_p_)->f_dentry->d_fs_info)
28 #define private_data                    f_privdata
29
30 typedef uint8_t u8;
31 typedef uint8_t __u8;
32 typedef uint16_t u16;
33 typedef uint16_t __u16;
34 typedef uint32_t u32;
35 typedef uint32_t __u32;
36 typedef uint64_t u64;
37 typedef uint64_t __u64;
38
39 typedef int32_t __s32;
40
41 typedef off64_t loff_t;
42
43 typedef atomic_t                        atomic64_t;
44
45 #define atomic64_set                    atomic_set
46 #define atomic64_read                   atomic_read
47 #define atomic_dec_and_test(e)          atomic_sub_and_test(e, 1)
48 #define atomic_inc_not_zero(p)          atomic_add_not_zero(p, 1)
49
50 #define mutex_init(a)                   qlock_init(a)
51 #define mutex_lock(a)                   qlock(a)
52 #define mutex_unlock(a)                 qunlock(a)
53
54 #define spin_lock_init(E)               spinlock_init_irqsave(E)
55 #define spin_lock_irq(a)                spin_lock_irqsave(a, 0)
56 #define spin_unlock_irq(a)              spin_unlock_irqsave(a)
57 #define spin_lock_irqsave(l, f)         spin_lock_irqsave(l)
58 #define spin_unlock_irqrestore(l, f)    spin_unlock_irqsave(l)
59 #define spin_lock_nested(l, d)          spin_lock(l)
60 #define spin_lock_bh(E)                 spin_lock(E)
61 #define spin_unlock_bh(E)               spin_unlock(E)
62 #define DEFINE_SPINLOCK(x)              spinlock_t x = SPINLOCK_INITIALIZER
63
64 extern unsigned long pgprot_noncached(int vmprot);
65 extern unsigned long pgprot_writecombine(int vmprot);
66
67 #define is_vm_hugetlb_page(vma) 0
68
69 extern int map_upage_at_addr(struct proc *p, physaddr_t paddr, uintptr_t addr,
70                              int pteprot, int dolock);
71 extern int get_user_page(struct proc *p, unsigned long uvastart, int write,
72                          int force, struct page **plist);
73 extern void put_page(struct page *pagep);
74 extern void set_page_dirty_lock(struct page *pagep);
75
76 #define io_remap_pfn_range(vma, vmstart, pfn, rangesz, pteprot) \
77         (rangesz == PAGE_SIZE ? map_upage_at_addr(current,      \
78         ((pfn) << PAGE_SHIFT), vmstart, pteprot, 1) : -1)
79
80 #define get_user_pages(task, mm, uvastart, numpages, write, force,      \
81         plist, vlist)                                                   \
82                 get_user_page(task, uvastart, write, force, plist)
83
84 /* The foll is only true for mlx4/ code */
85 #define read_lock(p)
86 #define read_unlock(p)
87
88 #define GFP_KERNEL                      MEM_WAIT
89 #define GFP_ATOMIC                      0
90 #define GFP_NOIO                        MEM_WAIT
91 #define GFP_NOWAIT                      0
92
93 #define __get_free_page(f)              kpage_alloc_addr()
94
95 static inline void free_page(unsigned long addr)
96 {
97         if (addr != 0)
98                 free_cont_pages((void *)addr, 0);
99 }
100
101 #define get_zeroed_page(f)              kpage_zalloc_addr()
102
103 #define kzalloc(SZ, FL)                 kzmalloc(SZ, FL)
104 #define kcalloc(CNT, SZ, FL)            kzmalloc((CNT) * (SZ), FL)
105
106 #define roundup_pow_of_two(E)           ROUNDUPPWR2(E)
107 #define roundup(VAL, UP)                ROUNDUP(VAL, UP)
108 #define min(A0, A1)                     MIN(A0, A1)
109 #define max(A0, A1)                     MAX(A0, A1)
110
111 #define LIST_HEAD(l)                    LINUX_LIST_HEAD(l)
112
113 /*
114  * Careful: these will replace "struct mutex" to "struct semaphore" but
115  * also replace ptr->mutex to ptr->semaphore aka structure field rename.
116  */
117 #define mutex           semaphore
118 #define rw_semaphore    semaphore
119
120 /* From include/linux/netdevice.h */
121 #define dev_hold(p)
122 #define dev_put(p)
123
124 #define pr_info_once    printk
125
126 /* From Linux include/linux/scatterlist.h: move to compat_todo.h */
127 struct sg_table {
128         struct scatterlist *sgl;
129         unsigned int nents;
130         unsigned int orig_nents;
131 };
132
133 extern int sg_alloc_table(struct sg_table *ptr, unsigned int npages, gfp_t mask);
134 void sg_free_table(struct sg_table *ptr);
135
136
137 /* From include/linux/compiler.h: move to compat_todo.h */
138 #define __acquires(x)
139 #define __releases(x)
140 #define __acquire(x)                    (void)0
141 #define __release(x)                    (void)0
142 #define uninitialized_var(x)            x = *(&(x))
143
144 /* From include/asm-generic/bug.h: move to compat_todo.h */
145 #define WARN_ON(condition) ({                                           \
146         int __ret_warn_on = !!(condition);                              \
147         if (unlikely(__ret_warn_on))                                    \
148                 printk("BUG: %s:%d/%s()!\n", __FILE__, __LINE__, __func__);\
149         unlikely(__ret_warn_on);                                        \
150 })
151
152 #define BUG_ON(condition)       \
153         do {                                                            \
154                 if (unlikely(condition))                                \
155                         panic("BADBUG");                                \
156         } while(0)
157
158 #define BUG()           BUG_ON(1)
159
160 /* Akaros cpu_to_be32() does not handle constants */
161 #undef cpu_to_be32
162 #define ___constant_swab32(x) ((__u32)(                                 \
163         (((__u32)(x) & (__u32)0x000000ffUL) << 24) |                    \
164         (((__u32)(x) & (__u32)0x0000ff00UL) <<  8) |                    \
165         (((__u32)(x) & (__u32)0x00ff0000UL) >>  8) |                    \
166         (((__u32)(x) & (__u32)0xff000000UL) >> 24)))
167
168 #define cpu_to_be32(x)                                                  \
169         (__builtin_constant_p((__u32)(x)) ?                             \
170         ___constant_swab32(x) :                                         \
171         byte_swap32(x))
172
173 #define MAXITEMS        128
174
175 struct idr {
176         spinlock_t      lock;
177         void            *values[MAXITEMS];
178 };
179
180 #define idr_destroy(p)
181 #define idr_preload(f)
182 #define idr_preload_end()
183
184 #define DEFINE_IDR(name)                        \
185                 struct idr name = { .lock = SPINLOCK_INITIALIZER }
186
187 void idr_remove(struct idr *idp, int id);
188 void *idr_find(struct idr *idr, int id);
189 int idr_alloc(struct idr *idp, void *ptr, int start, int end, gfp_t gfp_mask);
190
191 struct net_device {
192         unsigned char dev_addr[MAX_ADDR_LEN];
193 };
194
195 /* Conflicting definitions in compat_todo.h */
196 #define netif_carrier_ok(p)     1
197 #define vm_area_struct          vm_region
198
199 #define vm_start                vm_base
200 #define vm_pgoff                vm_foff >> PAGE_SHIFT
201
202 #undef __init
203 #undef __exit
204 #define __init  __attribute__((used))
205 #define __exit  __attribute__((used))
206
207 struct cdev {
208 };
209
210 struct kobject {
211 };
212
213 typedef struct  wait_queue_head {
214 } wait_queue_head_t;
215
216 struct lock_class_key {
217 };
218
219 struct attribute {
220 };
221
222 struct ib_ud_header {
223 };
224
225 extern void sysfs_init(void);
226 extern void sysfs_create(int devnum, const struct file_operations *verb_fops,
227                          void *ptr);
228
229 extern ssize_t check_old_abi(struct file *filp, const char __user *buf,
230                              size_t count);