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_*/ |