1#ifndef __TOOLS_LINUX_ERR_H 2#define __TOOLS_LINUX_ERR_H 3 4#include <linux/compiler.h> 5#include <linux/types.h> 6 7#include <asm/errno.h> 8 9/* 10 * Original kernel header comment: 11 * 12 * Kernel pointers have redundant information, so we can use a 13 * scheme where we can return either an error code or a normal 14 * pointer with the same return value. 15 * 16 * This should be a per-architecture thing, to allow different 17 * error and pointer decisions. 18 * 19 * Userspace note: 20 * The same principle works for userspace, because 'error' pointers 21 * fall down to the unused hole far from user space, as described 22 * in Documentation/x86/x86_64/mm.txt for x86_64 arch: 23 * 24 * 0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm hole caused by [48:63] sign extension 25 * ffffffffffe00000 - ffffffffffffffff (=2 MB) unused hole 26 * 27 * It should be the same case for other architectures, because 28 * this code is used in generic kernel code. 29 */ 30#define MAX_ERRNO 4095 31 32#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) 33 34static inline void * __must_check ERR_PTR(long error_) 35{ 36 return (void *) error_; 37} 38 39static inline long __must_check PTR_ERR(__force const void *ptr) 40{ 41 return (long) ptr; 42} 43 44static inline bool __must_check IS_ERR(__force const void *ptr) 45{ 46 return IS_ERR_VALUE((unsigned long)ptr); 47} 48 49#endif /* _LINUX_ERR_H */ 50