diff options
Diffstat (limited to 'gcell/ibm/sync/ppu_source/trace_libsync.h')
-rw-r--r-- | gcell/ibm/sync/ppu_source/trace_libsync.h | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/gcell/ibm/sync/ppu_source/trace_libsync.h b/gcell/ibm/sync/ppu_source/trace_libsync.h new file mode 100644 index 000000000..6d6f036e5 --- /dev/null +++ b/gcell/ibm/sync/ppu_source/trace_libsync.h @@ -0,0 +1,117 @@ +/* -------------------------------------------------------------- */ +/* (C)Copyright 2007 */ +/* International Business Machines Corporation */ +/* All Rights Reserved. */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the */ +/* following conditions are met: */ +/* */ +/* - Redistributions of source code must retain the above copyright*/ +/* notice, this list of conditions and the following disclaimer. */ +/* */ +/* - 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. */ +/* */ +/* - Neither the name of IBM Corporation nor the names of its */ +/* contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written */ +/* permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND */ +/* CONTRIBUTORS "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 THE COPYRIGHT OWNER 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. */ +/* -------------------------------------------------------------- */ +/* PROLOG END TAG zYx */ +#ifndef __LIBSYNC_PPU_TRACEHOOKS_H__ +#define __LIBSYNC_PPU_TRACEHOOKS_H__ + +#ifdef LIBSYNC_TRACE + +#include <trace_events.h> + +/* + * last parameter in the trace_even and trace_interval_entry call is + * the stack level to report the PC in the trace record. so 0 means + * the PC of the current frame, 1 means the PC of the caller, etc. + * there's a dilemma here - these macros are included in the inline + * _mutex calls which get called from the (created during build) + * mutex functions in the mutex .c files. in that case, the level + * should be 1 - we don't want the PC of where in the mutex function + * the trace call is happening, we want the PC of whomever is calling + * the mutex function. + * + * but.. an app can call the inline functions - it can #include the + * appropriate libsync mutex .h files, and call the inlined _mutex + * function in their code. in that case, the appropriate level for the + * trace calls would be 0 - the user would want to know where in their + * code the call to the _mutex function is. + * + * so, we'll assume _LEVEL of 0 which is what the inline funtions need. + * when we build the files for libsync, we'll do a -D_LEVEL=1 + */ +#ifndef _LEVEL +#define _LEVEL 0 +#endif + + +#define TRACE_EVENT_MUTEX_INIT 0x0003 + +#define TRACE_MUTEX_INIT(lock) { \ + trace_payload_t payload; \ + payload.dword[0]=(uint64_t)lock; \ + trace_event(TRACE_EVENT_MUTEX_INIT, 1, &payload, "Event=%d, lock=0x%x",_LEVEL); \ +} + +#define TRACE_EVENT_MUTEX_LOCK 0x0103 + +#define TRACE_MUTEX_LOCK_ENTRY(_INTERVAL) \ +trace_interval_p _INTERVAL = trace_interval_entry(TRACE_EVENT_MUTEX_LOCK, _LEVEL) + +#define TRACE_MUTEX_LOCK_EXIT(_INTERVAL,lock,miss) { \ + trace_payload_t payload; \ + payload.dword[0]=(uint64_t)lock; \ + payload.word[2]=(uint32_t)miss; \ + trace_interval_exit(_INTERVAL, 2, &payload, "Event=%d, lock=0x%x, miss=0x%x"); \ +} + +#define TRACE_EVENT_MUTEX_TRYLOCK 0x0203 + +#define TRACE_MUTEX_TRYLOCK(lock,ret) { \ + trace_payload_t payload; \ + payload.dword[0]=(uint64_t)lock; \ + payload.word[2]=(uint32_t)ret; \ + trace_event(TRACE_EVENT_MUTEX_TRYLOCK, 2, &payload, "Event=%d, lock=0x%x, ret=0x%x", _LEVEL); \ +} + +#define TRACE_EVENT_MUTEX_UNLOCK 0x0303 + +#define TRACE_MUTEX_UNLOCK(lock) { \ + trace_payload_t payload; \ + payload.dword[0]=(uint64_t)lock; \ + trace_event(TRACE_EVENT_MUTEX_UNLOCK, 1, &payload, "Event=%d, lock=0x%x", _LEVEL); \ +} + +#else /* LIBSYNC_TRACE */ + +#define TRACE_MUTEX_INIT(lock) +#define TRACE_MUTEX_LOCK_ENTRY(_INTERVAL) +#define TRACE_MUTEX_LOCK_EXIT(_INTERVAL,lock,miss) +#define TRACE_MUTEX_TRYLOCK(lock,ret_val) +#define TRACE_MUTEX_UNLOCK(lock) + +#endif /* LIBSYNC_TRACE */ + +#endif /* __LIBSYNC_PPU_TRACEHOOKS_H__ */ |