mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-18 10:21:01 +03:00
006e9a4088
Move platform specific Linux headers under include/os/linux/. Update the build system accordingly to detect the platform. This lays some of the initial groundwork to supporting building for other platforms. As part of this change it was necessary to create both a user and kernel space sys/simd.h header which can be included in either context. No functional change, the source has been refactored and the relevant #include's updated. Reviewed-by: Jorgen Lundman <lundman@lundman.net> Reviewed-by: Igor Kozhukhov <igor@dilos.org> Signed-off-by: Matthew Macy <mmacy@FreeBSD.org> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #9198
167 lines
5.8 KiB
C
167 lines
5.8 KiB
C
/*
|
|
* Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC.
|
|
* Copyright (C) 2007 The Regents of the University of California.
|
|
* Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
|
|
* Written by Brian Behlendorf <behlendorf1@llnl.gov>.
|
|
* UCRL-CODE-235197
|
|
*
|
|
* This file is part of the SPL, Solaris Porting Layer.
|
|
* For details, see <http://zfsonlinux.org/>.
|
|
*
|
|
* The SPL is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* The SPL is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with the SPL. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/*
|
|
* Available Solaris debug functions. All of the ASSERT() macros will be
|
|
* compiled out when NDEBUG is defined, this is the default behavior for
|
|
* the SPL. To enable assertions use the --enable-debug with configure.
|
|
* The VERIFY() functions are never compiled out and cannot be disabled.
|
|
*
|
|
* PANIC() - Panic the node and print message.
|
|
* ASSERT() - Assert X is true, if not panic.
|
|
* ASSERTV() - Wraps a variable declaration which is only used by ASSERT().
|
|
* ASSERT3B() - Assert boolean X OP Y is true, if not panic.
|
|
* ASSERT3S() - Assert signed X OP Y is true, if not panic.
|
|
* ASSERT3U() - Assert unsigned X OP Y is true, if not panic.
|
|
* ASSERT3P() - Assert pointer X OP Y is true, if not panic.
|
|
* ASSERT0() - Assert value is zero, if not panic.
|
|
* VERIFY() - Verify X is true, if not panic.
|
|
* VERIFY3B() - Verify boolean X OP Y is true, if not panic.
|
|
* VERIFY3S() - Verify signed X OP Y is true, if not panic.
|
|
* VERIFY3U() - Verify unsigned X OP Y is true, if not panic.
|
|
* VERIFY3P() - Verify pointer X OP Y is true, if not panic.
|
|
* VERIFY0() - Verify value is zero, if not panic.
|
|
*/
|
|
|
|
#ifndef _SPL_DEBUG_H
|
|
#define _SPL_DEBUG_H
|
|
|
|
/*
|
|
* Common DEBUG functionality.
|
|
*/
|
|
int spl_panic(const char *file, const char *func, int line,
|
|
const char *fmt, ...);
|
|
void spl_dumpstack(void);
|
|
|
|
/* BEGIN CSTYLED */
|
|
#define PANIC(fmt, a...) \
|
|
spl_panic(__FILE__, __FUNCTION__, __LINE__, fmt, ## a)
|
|
|
|
#define VERIFY(cond) \
|
|
(void) (unlikely(!(cond)) && \
|
|
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
|
"%s", "VERIFY(" #cond ") failed\n"))
|
|
|
|
#define VERIFY3B(LEFT, OP, RIGHT) do { \
|
|
boolean_t _verify3_left = (boolean_t)(LEFT); \
|
|
boolean_t _verify3_right = (boolean_t)(RIGHT); \
|
|
if (!(_verify3_left OP _verify3_right)) \
|
|
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
|
"VERIFY3(" #LEFT " " #OP " " #RIGHT ") " \
|
|
"failed (%d " #OP " %d)\n", \
|
|
(boolean_t) (_verify3_left), \
|
|
(boolean_t) (_verify3_right)); \
|
|
} while (0)
|
|
|
|
#define VERIFY3S(LEFT, OP, RIGHT) do { \
|
|
int64_t _verify3_left = (int64_t)(LEFT); \
|
|
int64_t _verify3_right = (int64_t)(RIGHT); \
|
|
if (!(_verify3_left OP _verify3_right)) \
|
|
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
|
"VERIFY3(" #LEFT " " #OP " " #RIGHT ") " \
|
|
"failed (%lld " #OP " %lld)\n", \
|
|
(long long) (_verify3_left), \
|
|
(long long) (_verify3_right)); \
|
|
} while (0)
|
|
|
|
#define VERIFY3U(LEFT, OP, RIGHT) do { \
|
|
uint64_t _verify3_left = (uint64_t)(LEFT); \
|
|
uint64_t _verify3_right = (uint64_t)(RIGHT); \
|
|
if (!(_verify3_left OP _verify3_right)) \
|
|
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
|
"VERIFY3(" #LEFT " " #OP " " #RIGHT ") " \
|
|
"failed (%llu " #OP " %llu)\n", \
|
|
(unsigned long long) (_verify3_left), \
|
|
(unsigned long long) (_verify3_right)); \
|
|
} while (0)
|
|
|
|
#define VERIFY3P(LEFT, OP, RIGHT) do { \
|
|
uintptr_t _verify3_left = (uintptr_t)(LEFT); \
|
|
uintptr_t _verify3_right = (uintptr_t)(RIGHT); \
|
|
if (!(_verify3_left OP _verify3_right)) \
|
|
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
|
"VERIFY3(" #LEFT " " #OP " " #RIGHT ") " \
|
|
"failed (%px " #OP " %px)\n", \
|
|
(void *) (_verify3_left), \
|
|
(void *) (_verify3_right)); \
|
|
} while (0)
|
|
|
|
#define VERIFY0(RIGHT) do { \
|
|
int64_t _verify3_left = (int64_t)(0); \
|
|
int64_t _verify3_right = (int64_t)(RIGHT); \
|
|
if (!(_verify3_left == _verify3_right)) \
|
|
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
|
"VERIFY3(0 == " #RIGHT ") " \
|
|
"failed (0 == %lld)\n", \
|
|
(long long) (_verify3_right)); \
|
|
} while (0)
|
|
|
|
#define CTASSERT_GLOBAL(x) _CTASSERT(x, __LINE__)
|
|
#define CTASSERT(x) { _CTASSERT(x, __LINE__); }
|
|
#define _CTASSERT(x, y) __CTASSERT(x, y)
|
|
#define __CTASSERT(x, y) \
|
|
typedef char __attribute__ ((unused)) \
|
|
__compile_time_assertion__ ## y[(x) ? 1 : -1]
|
|
|
|
/*
|
|
* Debugging disabled (--disable-debug)
|
|
*/
|
|
#ifdef NDEBUG
|
|
|
|
#define ASSERT(x) ((void)0)
|
|
#define ASSERTV(x)
|
|
#define ASSERT3B(x,y,z) ((void)0)
|
|
#define ASSERT3S(x,y,z) ((void)0)
|
|
#define ASSERT3U(x,y,z) ((void)0)
|
|
#define ASSERT3P(x,y,z) ((void)0)
|
|
#define ASSERT0(x) ((void)0)
|
|
#define IMPLY(A, B) ((void)0)
|
|
#define EQUIV(A, B) ((void)0)
|
|
|
|
/*
|
|
* Debugging enabled (--enable-debug)
|
|
*/
|
|
#else
|
|
|
|
#define ASSERT3B VERIFY3B
|
|
#define ASSERT3S VERIFY3S
|
|
#define ASSERT3U VERIFY3U
|
|
#define ASSERT3P VERIFY3P
|
|
#define ASSERT0 VERIFY0
|
|
#define ASSERT VERIFY
|
|
#define ASSERTV(x) x
|
|
#define IMPLY(A, B) \
|
|
((void)(((!(A)) || (B)) || \
|
|
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
|
"(" #A ") implies (" #B ")")))
|
|
#define EQUIV(A, B) \
|
|
((void)((!!(A) == !!(B)) || \
|
|
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
|
"(" #A ") is equivalent to (" #B ")")))
|
|
/* END CSTYLED */
|
|
|
|
#endif /* NDEBUG */
|
|
|
|
#endif /* SPL_DEBUG_H */
|