- BSD-licensed Code gratefully taken from the project at http://en.sourceforge.jp/projects/sfnet_vassertlinuxsdk/ - For more information on vmware VAssert, a powerful debugging facility usable under vmware, see: www.vmware.com/pdf/ws65_vassert_programming.pdf
		
			
				
	
	
		
			139 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef _VASSERT_H_
 | 
						|
#define _VASSERT_H_
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C"
 | 
						|
{
 | 
						|
#endif /*__cplusplus*/
 | 
						|
 | 
						|
#define ALIGNED(n) __attribute__((__aligned__(n)))
 | 
						|
#define VASSERT_TRIGGER_OFFSET 1221
 | 
						|
#define VASSERT_PAGE_SIZE      4096
 | 
						|
 | 
						|
/* Need to align at 4K. */
 | 
						|
/* Ensure the inReplay flag is on its own page. */
 | 
						|
#pragma pack(1)
 | 
						|
typedef struct VAssert_StateWrapper {
 | 
						|
   char space1[VASSERT_TRIGGER_OFFSET];
 | 
						|
   volatile char inReplay;
 | 
						|
   char space[VASSERT_PAGE_SIZE - VASSERT_TRIGGER_OFFSET - sizeof(char)];
 | 
						|
} VAssert_StateWrapper;
 | 
						|
#pragma pack()
 | 
						|
 | 
						|
extern VAssert_StateWrapper vassert_state;
 | 
						|
 | 
						|
/*
 | 
						|
 * User-selectable standard functions.
 | 
						|
 * XXX: Document these, in coordination with the SDK docs.
 | 
						|
 */
 | 
						|
 | 
						|
#if defined(__KERNEL__)
 | 
						|
#  define KERNEL_VASSERT
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef KERNEL_VASSERT
 | 
						|
 | 
						|
#  ifndef VASSERT_CUSTOM_ASSERT
 | 
						|
#     define VASSERT_CUSTOM_ASSERT(expr)
 | 
						|
#  endif
 | 
						|
 | 
						|
#  ifndef VASSERT_CUSTOM_ABORT
 | 
						|
#     include <linux/kernel.h>
 | 
						|
#     define VASSERT_CUSTOM_ABORT() ((void)0) // printk(KERN_ALERT"VAssert abort at %s: %d", __FILE__, __LINE__)
 | 
						|
#  endif
 | 
						|
 | 
						|
#  ifndef VASSERT_CUSTOM_LOG
 | 
						|
#     include <linux/kernel.h>
 | 
						|
#     define VASSERT_CUSTOM_LOG printk
 | 
						|
#  endif
 | 
						|
 | 
						|
#else
 | 
						|
#  ifndef VASSERT_CUSTOM_ASSERT
 | 
						|
#     include <assert.h>
 | 
						|
#     define VASSERT_CUSTOM_ASSERT assert
 | 
						|
#  endif
 | 
						|
 | 
						|
#  ifndef VASSERT_CUSTOM_ABORT
 | 
						|
#     include <stdlib.h>
 | 
						|
#     define VASSERT_CUSTOM_ABORT abort
 | 
						|
#  endif
 | 
						|
 | 
						|
#  ifndef VASSERT_CUSTOM_LOG
 | 
						|
#     include <stdio.h>
 | 
						|
#     define VASSERT_CUSTOM_LOG printf
 | 
						|
#  endif
 | 
						|
#endif
 | 
						|
 | 
						|
/* Results: 0 if successful, -1 if not. */
 | 
						|
// XXX need to automatic de-register trigger page when the program quits
 | 
						|
extern char VAssert_Init(void);
 | 
						|
extern char VAssert_Uninit(void);
 | 
						|
 | 
						|
/*
 | 
						|
 * These functions should not be called directly; they need to be wrapped.
 | 
						|
 */
 | 
						|
extern void VAssert_LogMain(const char *format, ...);
 | 
						|
extern void VAssert_GoLiveMain(void);
 | 
						|
extern void VAssert_ReturnToReplayMain(void);
 | 
						|
extern char VAssert_Trace(size_t max_size);
 | 
						|
 | 
						|
#ifdef VASSERT_ALWAYS_EXECUTE
 | 
						|
 | 
						|
#define VAssert_Assert(expr)              \
 | 
						|
do {                                      \
 | 
						|
   VASSERT_CUSTOM_ASSERT(expr);           \
 | 
						|
} while (0)
 | 
						|
 | 
						|
#define VAssert_Log(args)                 \
 | 
						|
do {                                      \
 | 
						|
   VASSERT_CUSTOM_LOG args;               \
 | 
						|
} while (0)
 | 
						|
 | 
						|
#define VAssert_BeginBlock
 | 
						|
#define VAssert_EndBlock
 | 
						|
 | 
						|
#else /* VASSERT_ALWAYS_EXECUTE */
 | 
						|
 | 
						|
#define VAssert_Assert(expr)              \
 | 
						|
do {                                      \
 | 
						|
   if (vassert_state.inReplay) {          \
 | 
						|
      if (!(expr)) {                      \
 | 
						|
         VAssert_GoLiveMain();            \
 | 
						|
         VASSERT_CUSTOM_ABORT();          \
 | 
						|
      } else {                            \
 | 
						|
         VAssert_ReturnToReplayMain();    \
 | 
						|
      }                                   \
 | 
						|
   }                                      \
 | 
						|
} while (0)
 | 
						|
 | 
						|
#define VAssert_Log(args)                 \
 | 
						|
do {                                      \
 | 
						|
   if (vassert_state.inReplay) {          \
 | 
						|
      VAssert_LogMain args;               \
 | 
						|
      VAssert_ReturnToReplayMain();       \
 | 
						|
   }                                      \
 | 
						|
} while (0)
 | 
						|
 | 
						|
#define VAssert_BeginBlock if (vassert_state.inReplay)
 | 
						|
#define VAssert_EndBlock VAssert_ReturnToReplayMain()
 | 
						|
 | 
						|
#endif /* VASSERT_ALWAYS_EXECUTE */
 | 
						|
 | 
						|
/* 
 | 
						|
 * Record/Replay functionality
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * Results: True if successful, false if not.
 | 
						|
 * Input: True to start recording, false to stop.
 | 
						|
 */
 | 
						|
extern char VAssert_SetRecordingMain(char start);
 | 
						|
 | 
						|
#define VAssert_StartRecording() VAssert_SetRecordingMain(1)
 | 
						|
#define VAssert_StopRecording() VAssert_SetRecordingMain(0)
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif /*__cplusplus*/
 | 
						|
 | 
						|
#endif /*_VASSERT_H_*/
 |