17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5a574db85Sraf * Common Development and Distribution License (the "License"). 6a574db85Sraf * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 21a574db85Sraf 227c478bd9Sstevel@tonic-gate /* 23a574db85Sraf * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate #ifndef _MISC_H 287c478bd9Sstevel@tonic-gate #define _MISC_H 297c478bd9Sstevel@tonic-gate 307c478bd9Sstevel@tonic-gate #include <sys/types.h> 317c478bd9Sstevel@tonic-gate #include <sys/time.h> 327c478bd9Sstevel@tonic-gate #include <thread.h> 33a574db85Sraf #include <pthread.h> 347c478bd9Sstevel@tonic-gate #include <stdarg.h> 35*c5d54b67SRichard Lowe #include <stddef.h> 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate #ifdef __cplusplus 387c478bd9Sstevel@tonic-gate extern "C" { 397c478bd9Sstevel@tonic-gate #endif 407c478bd9Sstevel@tonic-gate 417c478bd9Sstevel@tonic-gate extern uint_t umem_abort; /* abort when errors occur */ 427c478bd9Sstevel@tonic-gate extern uint_t umem_output; /* output error messages to stderr */ 437c478bd9Sstevel@tonic-gate extern caddr_t umem_min_stack; /* max stack address for audit log */ 447c478bd9Sstevel@tonic-gate extern caddr_t umem_max_stack; /* min stack address for audit log */ 457c478bd9Sstevel@tonic-gate 467c478bd9Sstevel@tonic-gate /* 477c478bd9Sstevel@tonic-gate * a safe printf -- do not use for error messages. 487c478bd9Sstevel@tonic-gate */ 497c478bd9Sstevel@tonic-gate void debug_printf(const char *format, ...); 507c478bd9Sstevel@tonic-gate 517c478bd9Sstevel@tonic-gate /* 527c478bd9Sstevel@tonic-gate * adds a message to the log without writing it out. 537c478bd9Sstevel@tonic-gate */ 547c478bd9Sstevel@tonic-gate void log_message(const char *format, ...); 557c478bd9Sstevel@tonic-gate 567c478bd9Sstevel@tonic-gate /* 577c478bd9Sstevel@tonic-gate * returns the index of the (high/low) bit + 1 587c478bd9Sstevel@tonic-gate */ 597c478bd9Sstevel@tonic-gate int highbit(ulong_t); 607c478bd9Sstevel@tonic-gate int lowbit(ulong_t); 617c478bd9Sstevel@tonic-gate #pragma no_side_effect(highbit, lowbit) 627c478bd9Sstevel@tonic-gate 637c478bd9Sstevel@tonic-gate /* 647c478bd9Sstevel@tonic-gate * Converts a hrtime_t to a timestruc_t 657c478bd9Sstevel@tonic-gate */ 667c478bd9Sstevel@tonic-gate void hrt2ts(hrtime_t hrt, timestruc_t *tsp); 677c478bd9Sstevel@tonic-gate 687c478bd9Sstevel@tonic-gate /* 697c478bd9Sstevel@tonic-gate * tries to print out the symbol and offset of a pointer using umem_error_info 707c478bd9Sstevel@tonic-gate */ 717c478bd9Sstevel@tonic-gate int print_sym(void *pointer); 727c478bd9Sstevel@tonic-gate 737c478bd9Sstevel@tonic-gate /* 747c478bd9Sstevel@tonic-gate * Information about the current error. Can be called multiple times, should 757c478bd9Sstevel@tonic-gate * be followed eventually with a call to umem_err or umem_err_recoverable. 767c478bd9Sstevel@tonic-gate */ 777c478bd9Sstevel@tonic-gate void umem_printf(const char *format, ...); 787c478bd9Sstevel@tonic-gate void umem_vprintf(const char *format, va_list); 797c478bd9Sstevel@tonic-gate 807c478bd9Sstevel@tonic-gate void umem_printf_warn(void *ignored, const char *format, ...); 817c478bd9Sstevel@tonic-gate 827c478bd9Sstevel@tonic-gate void umem_error_enter(const char *); 837c478bd9Sstevel@tonic-gate 847c478bd9Sstevel@tonic-gate /* 857c478bd9Sstevel@tonic-gate * prints error message and stack trace, then aborts. Cannot return. 867c478bd9Sstevel@tonic-gate */ 877c478bd9Sstevel@tonic-gate void umem_panic(const char *format, ...) __NORETURN; 887c478bd9Sstevel@tonic-gate #pragma does_not_return(umem_panic) 897c478bd9Sstevel@tonic-gate #pragma rarely_called(umem_panic) 907c478bd9Sstevel@tonic-gate 917c478bd9Sstevel@tonic-gate /* 927c478bd9Sstevel@tonic-gate * like umem_err, but only aborts if umem_abort > 0 937c478bd9Sstevel@tonic-gate */ 947c478bd9Sstevel@tonic-gate void umem_err_recoverable(const char *format, ...); 957c478bd9Sstevel@tonic-gate 967c478bd9Sstevel@tonic-gate /* 977c478bd9Sstevel@tonic-gate * We define our own assertion handling since libc's assert() calls malloc() 987c478bd9Sstevel@tonic-gate */ 997c478bd9Sstevel@tonic-gate #ifdef NDEBUG 1007c478bd9Sstevel@tonic-gate #define ASSERT(assertion) (void)0 1017c478bd9Sstevel@tonic-gate #else 1027c478bd9Sstevel@tonic-gate #define ASSERT(assertion) (void)((assertion) || \ 1037c478bd9Sstevel@tonic-gate __umem_assert_failed(#assertion, __FILE__, __LINE__)) 1047c478bd9Sstevel@tonic-gate #endif 1057c478bd9Sstevel@tonic-gate 1067c478bd9Sstevel@tonic-gate int __umem_assert_failed(const char *assertion, const char *file, int line); 1077c478bd9Sstevel@tonic-gate #pragma does_not_return(__umem_assert_failed) 1087c478bd9Sstevel@tonic-gate #pragma rarely_called(__umem_assert_failed) 1097c478bd9Sstevel@tonic-gate /* 1107c478bd9Sstevel@tonic-gate * These have architecture-specific implementations. 1117c478bd9Sstevel@tonic-gate */ 1127c478bd9Sstevel@tonic-gate 1137c478bd9Sstevel@tonic-gate /* 1147c478bd9Sstevel@tonic-gate * Returns the current function's frame pointer. 1157c478bd9Sstevel@tonic-gate */ 1167c478bd9Sstevel@tonic-gate extern void *getfp(void); 1177c478bd9Sstevel@tonic-gate 1187c478bd9Sstevel@tonic-gate /* 1197c478bd9Sstevel@tonic-gate * puts a pc-only stack trace of up to pcstack_limit frames into pcstack. 1207c478bd9Sstevel@tonic-gate * Returns the number of stacks written. 1217c478bd9Sstevel@tonic-gate * 1227c478bd9Sstevel@tonic-gate * if check_sighandler != 0, and we are in a signal context, calls 1237c478bd9Sstevel@tonic-gate * umem_err_recoverable. 1247c478bd9Sstevel@tonic-gate */ 1257c478bd9Sstevel@tonic-gate extern int getpcstack(uintptr_t *pcstack, int pcstack_limit, 1267c478bd9Sstevel@tonic-gate int check_sighandler); 1277c478bd9Sstevel@tonic-gate 1287c478bd9Sstevel@tonic-gate #ifdef __cplusplus 1297c478bd9Sstevel@tonic-gate } 1307c478bd9Sstevel@tonic-gate #endif 1317c478bd9Sstevel@tonic-gate 1327c478bd9Sstevel@tonic-gate #endif /* _MISC_H */ 133