cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

err.h (2028B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef __TOOLS_LINUX_ERR_H
      3#define __TOOLS_LINUX_ERR_H
      4
      5#include <linux/compiler.h>
      6#include <linux/types.h>
      7
      8#include <asm/errno.h>
      9
     10/*
     11 * Original kernel header comment:
     12 *
     13 * Kernel pointers have redundant information, so we can use a
     14 * scheme where we can return either an error code or a normal
     15 * pointer with the same return value.
     16 *
     17 * This should be a per-architecture thing, to allow different
     18 * error and pointer decisions.
     19 *
     20 * Userspace note:
     21 * The same principle works for userspace, because 'error' pointers
     22 * fall down to the unused hole far from user space, as described
     23 * in Documentation/x86/x86_64/mm.rst for x86_64 arch:
     24 *
     25 * 0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm hole caused by [48:63] sign extension
     26 * ffffffffffe00000 - ffffffffffffffff (=2 MB) unused hole
     27 *
     28 * It should be the same case for other architectures, because
     29 * this code is used in generic kernel code.
     30 */
     31#define MAX_ERRNO	4095
     32
     33#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
     34
     35static inline void * __must_check ERR_PTR(long error_)
     36{
     37	return (void *) error_;
     38}
     39
     40static inline long __must_check PTR_ERR(__force const void *ptr)
     41{
     42	return (long) ptr;
     43}
     44
     45static inline bool __must_check IS_ERR(__force const void *ptr)
     46{
     47	return IS_ERR_VALUE((unsigned long)ptr);
     48}
     49
     50static inline bool __must_check IS_ERR_OR_NULL(__force const void *ptr)
     51{
     52	return unlikely(!ptr) || IS_ERR_VALUE((unsigned long)ptr);
     53}
     54
     55static inline int __must_check PTR_ERR_OR_ZERO(__force const void *ptr)
     56{
     57	if (IS_ERR(ptr))
     58		return PTR_ERR(ptr);
     59	else
     60		return 0;
     61}
     62
     63/**
     64 * ERR_CAST - Explicitly cast an error-valued pointer to another pointer type
     65 * @ptr: The pointer to cast.
     66 *
     67 * Explicitly cast an error-valued pointer to another pointer type in such a
     68 * way as to make it clear that's what's going on.
     69 */
     70static inline void * __must_check ERR_CAST(__force const void *ptr)
     71{
     72	/* cast away the const */
     73	return (void *) ptr;
     74}
     75#endif /* _LINUX_ERR_H */