/************************************************************************** * * Copyright © 2000-2008 Alacritech, Inc. All rights reserved. * * $Id: sxgdbg.h,v 1.1 2008/06/27 12:49:28 mook Exp $ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * THIS SOFTWARE IS PROVIDED BY ALACRITECH, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALACRITECH, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The views and conclusions contained in the software and documentation * are those of the authors and should not be interpreted as representing * official policies, either expressed or implied, of Alacritech, Inc. * **************************************************************************/ /* * FILENAME: sxgdbg.h * * All debug and assertion-based definitions and macros are included * in this file for the SXGOSS driver. */ #ifndef _SXG_DEBUG_H_ #define _SXG_DEBUG_H_ #define ATKDBG 1 #define ATK_TRACE_ENABLED 1 #define DBG_ERROR(n, args...) printk(KERN_EMERG n, ##args) #ifdef ASSERT #undef ASSERT #endif #ifdef SXG_ASSERT_ENABLED #ifndef ASSERT #define ASSERT(a) \ { \ if (!(a)) { \ DBG_ERROR("ASSERT() Failure: file %s, function %s line %d\n",\ __FILE__, __func__, __LINE__); \ } \ } #endif #else #ifndef ASSERT #define ASSERT(a) #endif #endif /* SXG_ASSERT_ENABLED */ #ifdef ATKDBG /* * Global for timer granularity; every driver must have an instance * of this initialized to 0 */ extern ulong ATKTimerDiv; /* * trace_entry_t - * * This structure defines an entry in the trace buffer. The * first few fields mean the same from entry to entry, while * the meaning of last several fields change to suit the * needs of the trace entry. Typically they are function call * parameters. */ struct trace_entry_t { char name[8]; /* 8 character name - like 's'i'm'b'a'r'c'v' */ u32 time; /* Current clock tic */ unsigned char cpu; /* Current CPU */ unsigned char irql; /* Current IRQL */ unsigned char driver; /* The driver which added the trace call */ unsigned char pad2; /* pad to 4 byte boundary - will probably get used */ u32 arg1; /* Caller arg1 */ u32 arg2; /* Caller arg2 */ u32 arg3; /* Caller arg3 */ u32 arg4; /* Caller arg4 */ }; /* * Driver types for driver field in trace_entry_t */ #define TRACE_SXG 1 #define TRACE_VPCI 2 #define TRACE_SLIC 3 #define TRACE_ENTRIES 1024 struct sxg_trace_buffer_t { unsigned int size; /* aid for windbg extension */ unsigned int in; /* Where to add */ unsigned int level; /* Current Trace level */ spinlock_t lock; /* For MP tracing */ struct trace_entry_t entries[TRACE_ENTRIES];/* The circular buffer */ }; /* * The trace levels * * XXX At the moment I am only defining critical, important, and noisy. * I am leaving room for more if anyone wants them. */ #define TRACE_NONE 0 /* For trace level - if no tracing wanted */ #define TRACE_CRITICAL 1 /* minimal tracing - only critical stuff */ #define TRACE_IMPORTANT 5 /* more tracing - anything important */ #define TRACE_NOISY 10 /* Everything in the world */ /********************************************************************** * * The macros themselves - * *********************************************************************/ #if ATK_TRACE_ENABLED #define SXG_TRACE_INIT(buffer, tlevel) \ { \ memset((buffer), 0, sizeof(struct sxg_trace_buffer_t)); \ (buffer)->level = (tlevel); \ (buffer)->size = TRACE_ENTRIES; \ spin_lock_init(&(buffer)->lock); \ } #else #define SXG_TRACE_INIT(buffer, tlevel) #endif /* * The trace macro. This is active only if ATK_TRACE_ENABLED is set. */ #if ATK_TRACE_ENABLED #define SXG_TRACE(tdriver, buffer, tlevel, tname, a1, a2, a3, a4) { \ if ((buffer) && ((buffer)->level >= (tlevel))) { \ unsigned int trace_irql = 0; /* ?????? FIX THIS */ \ unsigned int trace_len; \ struct trace_entry_t *trace_entry; \ struct timeval timev; \ \ spin_lock(&(buffer)->lock); \ trace_entry = &(buffer)->entries[(buffer)->in]; \ do_gettimeofday(&timev); \ \ memset(trace_entry->name, 0, 8); \ trace_len = strlen(tname); \ trace_len = trace_len > 8 ? 8 : trace_len; \ memcpy(trace_entry->name, (tname), trace_len); \ trace_entry->time = timev.tv_usec; \ trace_entry->cpu = (unsigned char)(smp_processor_id() & 0xFF); \ trace_entry->driver = (tdriver); \ trace_entry->irql = trace_irql; \ trace_entry->arg1 = (ulong)(a1); \ trace_entry->arg2 = (ulong)(a2); \ trace_entry->arg3 = (ulong)(a3); \ trace_entry->arg4 = (ulong)(a4); \ \ (buffer)->in++; \ if ((buffer)->in == TRACE_ENTRIES) \ (buffer)->in = 0; \ \ spin_unlock(&(buffer)->lock); \ } \ } #else #define SXG_TRACE(tdriver, buffer, tlevel, tname, a1, a2, a3, a4) #endif #endif #endif /* _SXG_DEBUG_H_ */