Changeset View
Changeset View
Standalone View
Standalone View
sys/sys/systm.h
Show First 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | |||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
#include <machine/atomic.h> | #include <machine/atomic.h> | ||||
#include <machine/cpufunc.h> | #include <machine/cpufunc.h> | ||||
#include <sys/callout.h> | #include <sys/callout.h> | ||||
#include <sys/queue.h> | #include <sys/queue.h> | ||||
#include <sys/stdint.h> /* for people using printf mainly */ | #include <sys/stdint.h> /* for people using printf mainly */ | ||||
#ifdef _KERNEL | |||||
__NULLABILITY_PRAGMA_PUSH | __NULLABILITY_PRAGMA_PUSH | ||||
extern int cold; /* nonzero if we are doing a cold boot */ | extern int cold; /* nonzero if we are doing a cold boot */ | ||||
extern int suspend_blocked; /* block suspend due to pending shutdown */ | extern int suspend_blocked; /* block suspend due to pending shutdown */ | ||||
extern int rebooting; /* kern_reboot() has been called. */ | extern int rebooting; /* kern_reboot() has been called. */ | ||||
extern const char *panicstr; /* panic message */ | extern const char *panicstr; /* panic message */ | ||||
extern bool panicked; | extern bool panicked; | ||||
#define KERNEL_PANICKED() __predict_false(panicked) | #define KERNEL_PANICKED() __predict_false(panicked) | ||||
Show All 36 Lines | |||||
#if defined(WITNESS) || defined(INVARIANT_SUPPORT) | #if defined(WITNESS) || defined(INVARIANT_SUPPORT) | ||||
#ifdef KASSERT_PANIC_OPTIONAL | #ifdef KASSERT_PANIC_OPTIONAL | ||||
void kassert_panic(const char *fmt, ...) __printflike(1, 2); | void kassert_panic(const char *fmt, ...) __printflike(1, 2); | ||||
#else | #else | ||||
#define kassert_panic panic | #define kassert_panic panic | ||||
#endif | #endif | ||||
#endif | #endif | ||||
#endif /* KERNEL */ | |||||
#ifdef INVARIANTS /* The option is always available */ | #ifdef INVARIANTS /* The option is always available */ | ||||
#define KASSERT(exp,msg) do { \ | #define KASSERT(exp,msg) do { \ | ||||
if (__predict_false(!(exp))) \ | if (__predict_false(!(exp))) \ | ||||
kassert_panic msg; \ | kassert_panic msg; \ | ||||
} while (0) | } while (0) | ||||
#define VNASSERT(exp, vp, msg) do { \ | #define VNASSERT(exp, vp, msg) do { \ | ||||
if (__predict_false(!(exp))) { \ | if (__predict_false(!(exp))) { \ | ||||
Show All 20 Lines | |||||
} while (0) | } while (0) | ||||
#define __assert_unreachable() __unreachable() | #define __assert_unreachable() __unreachable() | ||||
#endif | #endif | ||||
#ifndef CTASSERT /* Allow lint to override */ | #ifndef CTASSERT /* Allow lint to override */ | ||||
#define CTASSERT(x) _Static_assert(x, "compile-time assertion failed") | #define CTASSERT(x) _Static_assert(x, "compile-time assertion failed") | ||||
#endif | #endif | ||||
#if defined(_KERNEL) | |||||
#include <sys/param.h> /* MAXCPU */ | |||||
#include <sys/pcpu.h> /* curthread */ | |||||
#include <sys/kpilite.h> | |||||
#endif | |||||
/* | /* | ||||
* Helpful macros for quickly coming up with assertions with informative | * Helpful macros for quickly coming up with assertions with informative | ||||
* panic messages. | * panic messages. | ||||
*/ | */ | ||||
#define MPASS(ex) MPASS4(ex, #ex, __FILE__, __LINE__) | #define MPASS(ex) MPASS4(ex, #ex, __FILE__, __LINE__) | ||||
#define MPASS2(ex, what) MPASS4(ex, what, __FILE__, __LINE__) | #define MPASS2(ex, what) MPASS4(ex, what, __FILE__, __LINE__) | ||||
#define MPASS3(ex, file, line) MPASS4(ex, #ex, file, line) | #define MPASS3(ex, file, line) MPASS4(ex, #ex, file, line) | ||||
#define MPASS4(ex, what, file, line) \ | #define MPASS4(ex, what, file, line) \ | ||||
KASSERT((ex), ("Assertion %s failed at %s:%d", what, file, line)) | KASSERT((ex), ("Assertion %s failed at %s:%d", what, file, line)) | ||||
/* | /* | ||||
* Align variables. | |||||
*/ | |||||
#define __read_mostly __section(".data.read_mostly") | |||||
#define __read_frequently __section(".data.read_frequently") | |||||
#define __exclusive_cache_line __aligned(CACHE_LINE_SIZE) \ | |||||
__section(".data.exclusive_cache_line") | |||||
#ifdef _KERNEL | |||||
#include <sys/param.h> /* MAXCPU */ | |||||
#include <sys/pcpu.h> /* curthread */ | |||||
#include <sys/kpilite.h> | |||||
/* | |||||
* Assert that a pointer can be loaded from memory atomically. | * Assert that a pointer can be loaded from memory atomically. | ||||
* | * | ||||
* This assertion enforces stronger alignment than necessary. For example, | * This assertion enforces stronger alignment than necessary. For example, | ||||
* on some architectures, atomicity for unaligned loads will depend on | * on some architectures, atomicity for unaligned loads will depend on | ||||
* whether or not the load spans multiple cache lines. | * whether or not the load spans multiple cache lines. | ||||
*/ | */ | ||||
#define ASSERT_ATOMIC_LOAD_PTR(var, msg) \ | #define ASSERT_ATOMIC_LOAD_PTR(var, msg) \ | ||||
KASSERT(sizeof(var) == sizeof(void *) && \ | KASSERT(sizeof(var) == sizeof(void *) && \ | ||||
Show All 13 Lines | |||||
*/ | */ | ||||
#define SCHEDULER_STOPPED_TD(td) ({ \ | #define SCHEDULER_STOPPED_TD(td) ({ \ | ||||
MPASS((td) == curthread); \ | MPASS((td) == curthread); \ | ||||
__predict_false((td)->td_stopsched); \ | __predict_false((td)->td_stopsched); \ | ||||
}) | }) | ||||
#define SCHEDULER_STOPPED() SCHEDULER_STOPPED_TD(curthread) | #define SCHEDULER_STOPPED() SCHEDULER_STOPPED_TD(curthread) | ||||
/* | /* | ||||
* Align variables. | |||||
*/ | |||||
#define __read_mostly __section(".data.read_mostly") | |||||
#define __read_frequently __section(".data.read_frequently") | |||||
#define __exclusive_cache_line __aligned(CACHE_LINE_SIZE) \ | |||||
__section(".data.exclusive_cache_line") | |||||
/* | |||||
* XXX the hints declarations are even more misplaced than most declarations | * XXX the hints declarations are even more misplaced than most declarations | ||||
* in this file, since they are needed in one file (per arch) and only used | * in this file, since they are needed in one file (per arch) and only used | ||||
* in two files. | * in two files. | ||||
* XXX most of these variables should be const. | * XXX most of these variables should be const. | ||||
*/ | */ | ||||
extern int osreldate; | extern int osreldate; | ||||
extern bool dynamic_kenv; | extern bool dynamic_kenv; | ||||
extern struct mtx kenv_lock; | extern struct mtx kenv_lock; | ||||
▲ Show 20 Lines • Show All 425 Lines • ▼ Show 20 Lines | |||||
#else | #else | ||||
#define __gone_ok(m, msg) | #define __gone_ok(m, msg) | ||||
#endif | #endif | ||||
#define gone_in(major, msg) __gone_ok(major, msg) _gone_in(major, msg) | #define gone_in(major, msg) __gone_ok(major, msg) _gone_in(major, msg) | ||||
#define gone_in_dev(dev, major, msg) __gone_ok(major, msg) _gone_in_dev(dev, major, msg) | #define gone_in_dev(dev, major, msg) __gone_ok(major, msg) _gone_in_dev(dev, major, msg) | ||||
__NULLABILITY_PRAGMA_POP | __NULLABILITY_PRAGMA_POP | ||||
#endif | |||||
#endif /* !_SYS_SYSTM_H_ */ | #endif /* !_SYS_SYSTM_H_ */ |