1153323Srodrigc#ifndef __XFS_COMPAT_H__ 2153323Srodrigc#define __XFS_COMPAT_H__ 3153323Srodrigc 4153323Srodrigc#include <sys/param.h> 5153323Srodrigc#include <sys/libkern.h> 6153323Srodrigc#include <sys/limits.h> 7153323Srodrigc#include <sys/uuid.h> 8153323Srodrigc#include <sys/conf.h> 9153323Srodrigc#include <sys/sbuf.h> 10153323Srodrigc#include <sys/stat.h> 11153323Srodrigc#include <sys/ioccom.h> 12153323Srodrigc#include <sys/fcntl.h> 13153323Srodrigc#include <sys/dirent.h> 14153323Srodrigc#include <sys/ktr.h> 15153323Srodrigc#include <sys/kdb.h> 16153323Srodrigc 17153323Srodrigc#ifdef _KERNEL 18153323Srodrigc#define __KERNEL__ 19153323Srodrigc#endif 20153323Srodrigc 21153323Srodrigc#define printk printf 22153323Srodrigc 23153323Srodrigc#define MAJOR(x) major(x) 24153323Srodrigc#define MINOR(x) minor(x) 25153323Srodrigc 26153323Srodrigc/* 27153323Srodrigc * SYSV compatibility types missing in FreeBSD. 28153323Srodrigc */ 29153323Srodrigctypedef unsigned long ulong; 30153323Srodrigctypedef unsigned int uint; 31153323Srodrigctypedef unsigned short ushort; 32153323Srodrigc 33153323Srodrigc/* 34153323Srodrigc * Additional type declarations for XFS. 35153323Srodrigc */ 36153323Srodrigctypedef signed char __s8; 37153323Srodrigctypedef unsigned char __u8; 38153323Srodrigctypedef signed short int __s16; 39153323Srodrigctypedef unsigned short int __u16; 40153323Srodrigctypedef signed int __s32; 41153323Srodrigctypedef unsigned int __u32; 42153323Srodrigctypedef signed long long int __s64; 43153323Srodrigctypedef unsigned long long int __u64; 44153323Srodrigc 45159451Srodrigc/* linus now has sparse which expects big endian or little endian */ 46159451Srodrigctypedef __u16 __be16; 47159451Srodrigctypedef __u32 __be32; 48159451Srodrigctypedef __u64 __be64; 49159451Srodrigc 50153323Srodrigc/* 51153323Srodrigc * Linux types with direct FreeBSD conterparts 52153323Srodrigc */ 53153323Srodrigctypedef off_t loff_t; 54153323Srodrigctypedef struct timespec timespec_t; 55153323Srodrigctypedef struct uuid uuid_t; 56153323Srodrigctypedef struct fid fid_t; 57153323Srodrigctypedef dev_t os_dev_t; 58153323Srodrigc 59153323Srodrigc/* 60153323Srodrigc * Linux block devices are device vnodes in FreeBSD. 61153323Srodrigc */ 62153323Srodrigc#define block_device vnode 63153323Srodrigc 64153323Srodrigc/* 65153323Srodrigc * Get the current CPU ID. 66153323Srodrigc */ 67153323Srodrigc#define smp_processor_id() PCPU_GET(cpuid) 68153323Srodrigc 69153323Srodrigc/* 70153323Srodrigc * FreeBSD does not have BITS_PER_LONG defined. 71153323Srodrigc */ 72153323Srodrigc#if defined(LONG_BIT) 73153323Srodrigc#define BITS_PER_LONG LONG_BIT 74153323Srodrigc#elif defined(__i386__) 75153323Srodrigc#define BITS_PER_LONG 32 76153323Srodrigc#endif 77153323Srodrigc 78159451Srodrigc#define rol32(x, y) (((x)<<(y))|((x)>>(32-(y)))) 79153323Srodrigc/* 80153323Srodrigc * boolean_t is enum on Linux, int on FreeBSD. 81153323Srodrigc * Provide value defines. 82153323Srodrigc */ 83153323Srodrigc#define B_FALSE 0 84153323Srodrigc#define B_TRUE 1 85153323Srodrigc 86153323Srodrigc/* 87153323Srodrigc * GCC 3.x static branch prediction hints 88153323Srodrigc */ 89153323Srodrigc#if __GNUC__ < 3 90153323Srodrigc#define __builtin_expect(x, expected_value) (x) 91153323Srodrigc#endif 92153323Srodrigc 93153323Srodrigc#ifndef likely 94153323Srodrigc#define likely(x) __builtin_expect((x), 1) 95153323Srodrigc#endif 96153323Srodrigc 97153323Srodrigc#ifndef unlikely 98153323Srodrigc#define unlikely(x) __builtin_expect((x), 0) 99153323Srodrigc#endif 100153323Srodrigc 101153323Srodrigc/* 102153323Srodrigc * ANSI and GCC extension keywords compatibity 103153323Srodrigc */ 104153323Srodrigc#ifndef inline 105153323Srodrigc#define inline __inline__ 106153323Srodrigc#endif 107153323Srodrigc 108153323Srodrigc#ifndef asm 109153323Srodrigc#define asm __asm 110153323Srodrigc#endif 111153323Srodrigc 112153323Srodrigc#ifndef typeof 113153323Srodrigc#define typeof __typeof 114153323Srodrigc#endif 115153323Srodrigc 116153323Srodrigc/* 117153323Srodrigc * Miscellaneous limit constants 118153323Srodrigc */ 119153323Srodrigc#define MAX_LFS_FILESIZE 0x7fffffffffffffffLL 120153323Srodrigc 121153323Srodrigc/* 122153323Srodrigc * Map simple functions to their FreeBSD kernel equivalents 123153323Srodrigc */ 124153323Srodrigc#ifndef copy_to_user 125153323Srodrigc#define copy_to_user(dst, src, len) copyout((src), (dst), (len)) 126153323Srodrigc#endif 127153323Srodrigc 128153323Srodrigc#ifndef copy_from_user 129153323Srodrigc#define copy_from_user(dst, src, len) copyin((src), (dst), (len)) 130153323Srodrigc#endif 131153323Srodrigc 132153323Srodrigc/* 133153323Srodrigc * Map simple global vairables to FreeBSD kernel equivalents 134153323Srodrigc */ 135153323Srodrigc#if !defined(xfs_physmem) 136153323Srodrigc#define xfs_physmem physmem 137153323Srodrigc#endif 138153323Srodrigc 139153323Srodrigc#ifndef HZ 140153323Srodrigc#define HZ hz 141153323Srodrigc#endif 142153323Srodrigc 143153323Srodrigc/* 144153323Srodrigc * These should be implemented properly for all architectures 145153323Srodrigc * we want to support. 146153323Srodrigc */ 147153323Srodrigc#define get_unaligned(ptr) (*(ptr)) 148153323Srodrigc#define put_unaligned(val, ptr) ((void)( *(ptr) = (val) )) 149153323Srodrigc 150153323Srodrigc/* 151153323Srodrigc * Linux type-safe min/max macros. 152153323Srodrigc */ 153153323Srodrigc#define min_t(type,x,y) MIN((x),(y)) 154153323Srodrigc#define max_t(type,x,y) MAX((x),(y)) 155153323Srodrigc 156153323Srodrigc 157159451Srodrigctypedef struct mtx xfs_mutex_t; 158153323Srodrigc/* 159153323Srodrigc * Cedentials manipulation. 160153323Srodrigc */ 161153323Srodrigc#define current_fsuid(credp) (credp)->cr_uid 162153323Srodrigc#define current_fsgid(credp) (credp)->cr_groups[0] 163153323Srodrigc 164159451Srodrigc#define PAGE_CACHE_SIZE PAGE_SIZE 165159451Srodrigc 166159451Srodrigc#define IS_ERR(err) (err) 167159451Srodrigc 168159451Srodrigcstatic inline unsigned long ffz(unsigned long val) 169159451Srodrigc{ 170159451Srodrigc return ffsl(~val); 171159451Srodrigc} 172159451Srodrigc 173153323Srodrigc#endif /* __XFS_COMPAT_H__ */ 174