| /* | 
 |  * Copyright (c) 2016 Google Inc. | 
 |  * Author: Kanoj Sarcar <kanoj@google.com> | 
 |  * See LICENSE for details. | 
 |  * | 
 |  * A majority of macros in this file should migrate to compat_todo.h, | 
 |  * which should hold source copied from Linux. Some part of macros | 
 |  * will also move into linux_compat.h to translate from Linux to | 
 |  * Akaros. A tiny portion should remain here, since those are stub | 
 |  * or hack definitions whose scope should be restricted only to mlx4u/ | 
 |  * and udrvr/ | 
 |  */ | 
 | #include <linux_compat.h> | 
 |  | 
 | #include <arch/uaccess.h>	/* copy_from_user(), copy_to_user() */ | 
 |  | 
 | #define access_ok(type, addr, size)     1 | 
 |  | 
 | /* | 
 |  * Device file /dev/XXXX has a dentry and inode that is associated | 
 |  * with the "struct file" for each user process opening the device file. | 
 |  * Thus, we can stash private data into file->f_dentry->d_fs_info or | 
 |  * into file->f_dentry->d_inode->i_fs_info. | 
 |  */ | 
 | #define set_fs_info(_p_, _v_)		\ | 
 | 	do { (_p_)->f_dentry->d_fs_info = (_v_); } while(0) | 
 | #define	get_fs_info(_p_)	((_p_)->f_dentry->d_fs_info) | 
 | #define	private_data			f_privdata | 
 |  | 
 | typedef uint8_t u8; | 
 | typedef uint8_t __u8; | 
 | typedef uint16_t u16; | 
 | typedef uint16_t __u16; | 
 | typedef uint32_t u32; | 
 | typedef uint32_t __u32; | 
 | typedef uint64_t u64; | 
 | typedef uint64_t __u64; | 
 |  | 
 | typedef int32_t	__s32; | 
 |  | 
 | typedef off64_t	loff_t; | 
 |  | 
 | typedef atomic_t			atomic64_t; | 
 |  | 
 | #define	atomic64_set			atomic_set | 
 | #define	atomic64_read			atomic_read | 
 | #define	atomic_dec_and_test(e)		atomic_sub_and_test(e, 1) | 
 | #define	atomic_inc_not_zero(p)		atomic_add_not_zero(p, 1) | 
 |  | 
 | #define	mutex_init(a)			qlock_init(a) | 
 | #define	mutex_lock(a)			qlock(a) | 
 | #define	mutex_unlock(a)			qunlock(a) | 
 |  | 
 | extern unsigned long pgprot_noncached(int vmprot); | 
 | extern unsigned long pgprot_writecombine(int vmprot); | 
 |  | 
 | #define is_vm_hugetlb_page(vma)	0 | 
 |  | 
 | extern int map_upage_at_addr(struct proc *p, physaddr_t paddr, uintptr_t addr, | 
 |                              int pteprot, int dolock); | 
 | extern int get_user_page(struct proc *p, unsigned long uvastart, int write, | 
 |                          int force, struct page **plist); | 
 | extern void put_page(struct page *pagep); | 
 | extern void set_page_dirty_lock(struct page *pagep); | 
 |  | 
 | #define	io_remap_pfn_range(vma, vmstart, pfn, rangesz, pteprot)	\ | 
 | 	(rangesz == PAGE_SIZE ? map_upage_at_addr(current,	\ | 
 | 	((pfn) << PAGE_SHIFT), vmstart, pteprot, 1) : -1) | 
 |  | 
 | #define	get_user_pages(task, mm, uvastart, numpages, write, force,	\ | 
 | 	plist, vlist)							\ | 
 | 		get_user_page(task, uvastart, write, force, plist) | 
 |  | 
 | /* The foll is only true for mlx4/ code */ | 
 | #define	read_lock(p) | 
 | #define	read_unlock(p) | 
 |  | 
 | #define	GFP_KERNEL			MEM_WAIT | 
 | #define	GFP_ATOMIC			0 | 
 | #define	GFP_NOIO			MEM_WAIT | 
 | #define	GFP_NOWAIT			0 | 
 |  | 
 | #define	__get_free_page(f)		kpage_alloc_addr() | 
 |  | 
 | static inline void free_page(unsigned long addr) | 
 | { | 
 | 	if (addr != 0) | 
 | 		kpages_free((void*)addr, PGSIZE); | 
 | } | 
 |  | 
 | #define	get_zeroed_page(f)		kpage_zalloc_addr() | 
 |  | 
 | #define	kzalloc(SZ, FL)			kzmalloc(SZ, FL) | 
 | #define	kcalloc(CNT, SZ, FL)		kzmalloc((CNT) * (SZ), FL) | 
 |  | 
 | #define	roundup_pow_of_two(E)		ROUNDUPPWR2(E) | 
 | #define	roundup(VAL, UP)		ROUNDUP(VAL, UP) | 
 | #define	min(A0, A1)			MIN(A0, A1) | 
 | #define	max(A0, A1)			MAX(A0, A1) | 
 |  | 
 | #define	LIST_HEAD(l)			LINUX_LIST_HEAD(l) | 
 |  | 
 | /* | 
 |  * Careful: these will replace "struct mutex" to "struct semaphore" but | 
 |  * also replace ptr->mutex to ptr->semaphore aka structure field rename. | 
 |  */ | 
 | #define	mutex		semaphore | 
 | #define	rw_semaphore	semaphore | 
 |  | 
 | /* From include/linux/netdevice.h */ | 
 | #define	dev_hold(p) | 
 | #define	dev_put(p) | 
 |  | 
 | #define	pr_info_once	printk | 
 |  | 
 | /* From Linux include/linux/scatterlist.h: move to compat_todo.h */ | 
 | struct sg_table { | 
 | 	struct scatterlist *sgl; | 
 | 	unsigned int nents; | 
 | 	unsigned int orig_nents; | 
 | }; | 
 |  | 
 | extern int sg_alloc_table(struct sg_table *ptr, unsigned int npages, gfp_t mask); | 
 | void sg_free_table(struct sg_table *ptr); | 
 |  | 
 |  | 
 | /* From include/linux/compiler.h: move to compat_todo.h */ | 
 | #define	__acquires(x) | 
 | #define	__releases(x) | 
 | #define	__acquire(x)			(void)0 | 
 | #define	__release(x)			(void)0 | 
 |  | 
 | /* From include/asm-generic/bug.h: move to compat_todo.h */ | 
 | #define WARN_ON(condition) ({                                           \ | 
 |         int __ret_warn_on = !!(condition);                              \ | 
 |         if (unlikely(__ret_warn_on))                                    \ | 
 | 		printk("BUG: %s:%d/%s()!\n", __FILE__, __LINE__, __func__);\ | 
 |         unlikely(__ret_warn_on);                                        \ | 
 | }) | 
 |  | 
 | #define	BUG_ON(condition)	\ | 
 | 	do {								\ | 
 | 		if (unlikely(condition))				\ | 
 | 			panic("BADBUG");				\ | 
 | 	} while(0) | 
 |  | 
 | #define	BUG()		BUG_ON(1) | 
 |  | 
 | /* Akaros cpu_to_be32() does not handle constants */ | 
 | #undef cpu_to_be32 | 
 | #define	___constant_swab32(x) ((__u32)(					\ | 
 | 	(((__u32)(x) & (__u32)0x000000ffUL) << 24) |			\ | 
 | 	(((__u32)(x) & (__u32)0x0000ff00UL) <<  8) |			\ | 
 | 	(((__u32)(x) & (__u32)0x00ff0000UL) >>  8) |			\ | 
 | 	(((__u32)(x) & (__u32)0xff000000UL) >> 24))) | 
 |  | 
 | #define	cpu_to_be32(x)							\ | 
 | 	(__builtin_constant_p((__u32)(x)) ?				\ | 
 | 	___constant_swab32(x) :						\ | 
 | 	byte_swap32(x)) | 
 |  | 
 | #define	MAXITEMS	128 | 
 |  | 
 | struct idr { | 
 | 	spinlock_t	lock; | 
 | 	void		*values[MAXITEMS]; | 
 | }; | 
 |  | 
 | #define	idr_destroy(p) | 
 | #define	idr_preload(f) | 
 | #define	idr_preload_end() | 
 |  | 
 | #define	DEFINE_IDR(name)			\ | 
 | 		struct idr name = { .lock = SPINLOCK_INITIALIZER } | 
 |  | 
 | void idr_remove(struct idr *idp, int id); | 
 | void *idr_find(struct idr *idr, int id); | 
 | int idr_alloc(struct idr *idp, void *ptr, int start, int end, gfp_t gfp_mask); | 
 |  | 
 | struct net_device { | 
 | 	unsigned char dev_addr[MAX_ADDR_LEN]; | 
 | }; | 
 |  | 
 | /* Conflicting definitions in compat_todo.h */ | 
 | #define	netif_carrier_ok(p)	1 | 
 | #define	vm_area_struct		vm_region | 
 |  | 
 | #define	vm_start		vm_base | 
 | #define	vm_pgoff		vm_foff >> PAGE_SHIFT | 
 |  | 
 | #undef __init | 
 | #undef __exit | 
 | #define	__init	__attribute__((used)) | 
 | #define	__exit	__attribute__((used)) | 
 |  | 
 | struct cdev { | 
 | }; | 
 |  | 
 | struct kobject { | 
 | }; | 
 |  | 
 | typedef struct  wait_queue_head { | 
 | } wait_queue_head_t; | 
 |  | 
 | struct lock_class_key { | 
 | }; | 
 |  | 
 | struct attribute { | 
 | }; | 
 |  | 
 | struct ib_ud_header { | 
 | }; | 
 |  | 
 | extern void sysfs_init(void); | 
 | struct file_operations; | 
 | extern void sysfs_create(int devnum, const struct file_operations *verb_fops, | 
 |                          void *ptr); | 
 |  | 
 | extern ssize_t check_old_abi(struct file *filp, const char __user *buf, | 
 |                              size_t count); |