The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/cddl/contrib/opensolaris/uts/common/sys/debug.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * CDDL HEADER START
    3  *
    4  * The contents of this file are subject to the terms of the
    5  * Common Development and Distribution License (the "License").
    6  * You may not use this file except in compliance with the License.
    7  *
    8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
    9  * or http://www.opensolaris.org/os/licensing.
   10  * See the License for the specific language governing permissions
   11  * and limitations under the License.
   12  *
   13  * When distributing Covered Code, include this CDDL HEADER in each
   14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   15  * If applicable, add the following below this CDDL HEADER, with the
   16  * fields enclosed by brackets "[]" replaced with your own identifying
   17  * information: Portions Copyright [yyyy] [name of copyright owner]
   18  *
   19  * CDDL HEADER END
   20  */
   21 /*
   22  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
   23  *
   24  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
   25  * Use is subject to license terms.
   26  */
   27 
   28 /*
   29  * Copyright (c) 2012, 2017 by Delphix. All rights reserved.
   30  * Copyright 2013 Saso Kiselkov. All rights reserved.
   31  */
   32 
   33 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
   34 /*        All Rights Reserved   */
   35 
   36 #ifndef _SYS_DEBUG_H
   37 #define _SYS_DEBUG_H
   38 
   39 #include <sys/types.h>
   40 #include <sys/note.h>
   41 
   42 #ifdef  __cplusplus
   43 extern "C" {
   44 #endif
   45 
   46 /*
   47  * ASSERT(ex) causes a panic or debugger entry if expression ex is not
   48  * true.  ASSERT() is included only for debugging, and is a no-op in
   49  * production kernels.  VERIFY(ex), on the other hand, behaves like
   50  * ASSERT and is evaluated on both debug and non-debug kernels.
   51  */
   52 
   53 extern int assfail(const char *, const char *, int);
   54 #define VERIFY(EX) ((void)((EX) || assfail(#EX, __FILE__, __LINE__)))
   55 #ifdef DEBUG
   56 #define ASSERT(EX) ((void)((EX) || assfail(#EX, __FILE__, __LINE__)))
   57 #else
   58 #define ASSERT(x)  ((void)0)
   59 #endif
   60 
   61 /*
   62  * Assertion variants sensitive to the compilation data model
   63  */
   64 #if defined(_LP64)
   65 #define ASSERT64(x)     ASSERT(x)
   66 #define ASSERT32(x)
   67 #else
   68 #define ASSERT64(x)
   69 #define ASSERT32(x)     ASSERT(x)
   70 #endif
   71 
   72 /*
   73  * IMPLY and EQUIV are assertions of the form:
   74  *
   75  *      if (a) then (b)
   76  * and
   77  *      if (a) then (b) *AND* if (b) then (a)
   78  */
   79 #ifdef DEBUG
   80 #define IMPLY(A, B) \
   81         ((void)(((!(A)) || (B)) || \
   82             assfail("(" #A ") implies (" #B ")", __FILE__, __LINE__)))
   83 #define EQUIV(A, B) \
   84         ((void)((!!(A) == !!(B)) || \
   85             assfail("(" #A ") is equivalent to (" #B ")", __FILE__, __LINE__)))
   86 #else
   87 #define IMPLY(A, B) ((void)0)
   88 #define EQUIV(A, B) ((void)0)
   89 #endif
   90 
   91 /*
   92  * ASSERT3() behaves like ASSERT() except that it is an explicit conditional,
   93  * and prints out the values of the left and right hand expressions as part of
   94  * the panic message to ease debugging.  The three variants imply the type
   95  * of their arguments.  ASSERT3S() is for signed data types, ASSERT3U() is
   96  * for unsigned, and ASSERT3P() is for pointers.  The VERIFY3*() macros
   97  * have the same relationship as above.
   98  */
   99 extern void assfail3(const char *, uintmax_t, const char *, uintmax_t,
  100     const char *, int);
  101 #define VERIFY3_IMPL(LEFT, OP, RIGHT, TYPE) do { \
  102         const TYPE __left = (TYPE)(LEFT); \
  103         const TYPE __right = (TYPE)(RIGHT); \
  104         if (!(__left OP __right)) \
  105                 assfail3(#LEFT " " #OP " " #RIGHT, \
  106                         (uintmax_t)__left, #OP, (uintmax_t)__right, \
  107                         __FILE__, __LINE__); \
  108 _NOTE(CONSTCOND) } while (0)
  109 
  110 #define VERIFY3B(x, y, z)       VERIFY3_IMPL(x, y, z, boolean_t)
  111 #define VERIFY3S(x, y, z)       VERIFY3_IMPL(x, y, z, int64_t)
  112 #define VERIFY3U(x, y, z)       VERIFY3_IMPL(x, y, z, uint64_t)
  113 #define VERIFY3P(x, y, z)       VERIFY3_IMPL(x, y, z, uintptr_t)
  114 #define VERIFY0(x)              VERIFY3_IMPL(x, ==, 0, uintmax_t)
  115 
  116 #ifdef DEBUG
  117 #define ASSERT3B(x, y, z)       VERIFY3_IMPL(x, y, z, boolean_t)
  118 #define ASSERT3S(x, y, z)       VERIFY3_IMPL(x, y, z, int64_t)
  119 #define ASSERT3U(x, y, z)       VERIFY3_IMPL(x, y, z, uint64_t)
  120 #define ASSERT3P(x, y, z)       VERIFY3_IMPL(x, y, z, uintptr_t)
  121 #define ASSERT0(x)              VERIFY3_IMPL(x, ==, 0, uintmax_t)
  122 #else
  123 #define ASSERT3B(x, y, z)       ((void)0)
  124 #define ASSERT3S(x, y, z)       ((void)0)
  125 #define ASSERT3U(x, y, z)       ((void)0)
  126 #define ASSERT3P(x, y, z)       ((void)0)
  127 #define ASSERT0(x)              ((void)0)
  128 #endif
  129 
  130 /*
  131  * Compile-time assertion. The condition 'x' must be constant.
  132  */
  133 #ifndef CTASSERT
  134 #define CTASSERT(x)             _CTASSERT(x, __LINE__)
  135 #define _CTASSERT(x, y)         __CTASSERT(x, y)
  136 #define __CTASSERT(x, y)        \
  137         _Static_assert((x), "Static assert failed at " #y)
  138 #endif
  139 
  140 #ifdef  _KERNEL
  141 
  142 extern void abort_sequence_enter(char *);
  143 extern void debug_enter(char *);
  144 
  145 #endif  /* _KERNEL */
  146 
  147 #if defined(DEBUG) && !defined(__sun)
  148 /* CSTYLED */
  149 #define STATIC
  150 #else
  151 /* CSTYLED */
  152 #define STATIC static
  153 #endif
  154 
  155 #ifdef  __cplusplus
  156 }
  157 #endif
  158 
  159 #endif  /* _SYS_DEBUG_H */

Cache object: b7ce91ecfd7e0a8eb1f3adb7e11595d8


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.