Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / minix / vassert.h @ 13

History | View | Annotate | Download (3.55 KB)

1
#ifndef _VASSERT_H_
2
#define _VASSERT_H_
3

    
4
#ifdef __cplusplus
5
extern "C"
6
{
7
#endif /*__cplusplus*/
8

    
9
#define ALIGNED(n) __attribute__((__aligned__(n)))
10
#define VASSERT_TRIGGER_OFFSET 1221
11
#define VASSERT_PAGE_SIZE      4096
12

    
13
/* Need to align at 4K. */
14
/* Ensure the inReplay flag is on its own page. */
15
#pragma pack(1)
16
typedef struct VAssert_StateWrapper {
17
   char space1[VASSERT_TRIGGER_OFFSET];
18
   volatile char inReplay;
19
   char space[VASSERT_PAGE_SIZE - VASSERT_TRIGGER_OFFSET - sizeof(char)];
20
} VAssert_StateWrapper;
21
#pragma pack()
22

    
23
extern VAssert_StateWrapper vassert_state;
24

    
25
/*
26
 * User-selectable standard functions.
27
 * XXX: Document these, in coordination with the SDK docs.
28
 */
29

    
30
#if defined(__KERNEL__)
31
#  define KERNEL_VASSERT
32
#endif
33

    
34
#ifdef KERNEL_VASSERT
35

    
36
#  ifndef VASSERT_CUSTOM_ASSERT
37
#     define VASSERT_CUSTOM_ASSERT(expr)
38
#  endif
39

    
40
#  ifndef VASSERT_CUSTOM_ABORT
41
#     include <linux/kernel.h>
42
#     define VASSERT_CUSTOM_ABORT() ((void)0) // printk(KERN_ALERT"VAssert abort at %s: %d", __FILE__, __LINE__)
43
#  endif
44

    
45
#  ifndef VASSERT_CUSTOM_LOG
46
#     include <linux/kernel.h>
47
#     define VASSERT_CUSTOM_LOG printk
48
#  endif
49

    
50
#else
51
#  ifndef VASSERT_CUSTOM_ASSERT
52
#     include <assert.h>
53
#     define VASSERT_CUSTOM_ASSERT assert
54
#  endif
55

    
56
#  ifndef VASSERT_CUSTOM_ABORT
57
#     include <stdlib.h>
58
#     define VASSERT_CUSTOM_ABORT abort
59
#  endif
60

    
61
#  ifndef VASSERT_CUSTOM_LOG
62
#     include <stdio.h>
63
#     define VASSERT_CUSTOM_LOG printf
64
#  endif
65
#endif
66

    
67
/* Results: 0 if successful, -1 if not. */
68
// XXX need to automatic de-register trigger page when the program quits
69
extern char VAssert_Init(void);
70
extern char VAssert_Uninit(void);
71

    
72
/*
73
 * These functions should not be called directly; they need to be wrapped.
74
 */
75
extern void VAssert_LogMain(const char *format, ...)
76
        __attribute__((__format__(__printf__, 1, 2)));
77
extern void VAssert_GoLiveMain(void);
78
extern void VAssert_ReturnToReplayMain(void);
79
extern char VAssert_Trace(size_t max_size);
80

    
81
#ifdef VASSERT_ALWAYS_EXECUTE
82

    
83
#define VAssert_Assert(expr)              \
84
do {                                      \
85
   VASSERT_CUSTOM_ASSERT(expr);           \
86
} while (0)
87

    
88
#define VAssert_Log(args)                 \
89
do {                                      \
90
   VASSERT_CUSTOM_LOG args;               \
91
} while (0)
92

    
93
#define VAssert_BeginBlock
94
#define VAssert_EndBlock
95

    
96
#else /* VASSERT_ALWAYS_EXECUTE */
97

    
98
#define VAssert_Assert(expr)              \
99
do {                                      \
100
   if (vassert_state.inReplay) {          \
101
      if (!(expr)) {                      \
102
         VAssert_GoLiveMain();            \
103
         VASSERT_CUSTOM_ABORT();          \
104
      } else {                            \
105
         VAssert_ReturnToReplayMain();    \
106
      }                                   \
107
   }                                      \
108
} while (0)
109

    
110
#define VAssert_Log(args)                 \
111
do {                                      \
112
   if (vassert_state.inReplay) {          \
113
      VAssert_LogMain args;               \
114
      VAssert_ReturnToReplayMain();       \
115
   }                                      \
116
} while (0)
117

    
118
#define VAssert_BeginBlock if (vassert_state.inReplay)
119
#define VAssert_EndBlock VAssert_ReturnToReplayMain()
120

    
121
#endif /* VASSERT_ALWAYS_EXECUTE */
122

    
123
/* 
124
 * Record/Replay functionality
125
 */
126
/*
127
 * Results: True if successful, false if not.
128
 * Input: True to start recording, false to stop.
129
 */
130
extern char VAssert_SetRecordingMain(char start);
131

    
132
#define VAssert_StartRecording() VAssert_SetRecordingMain(1)
133
#define VAssert_StopRecording() VAssert_SetRecordingMain(0)
134

    
135
#ifdef __cplusplus
136
}
137
#endif /*__cplusplus*/
138

    
139
#endif /*_VASSERT_H_*/