5 #include <minix/config.h>
6 #include <minix/const.h>
9 #include <minix/syslib.h>
12 VAssert_StateWrapper vassert_state
ALIGNED(VASSERT_PAGE_SIZE
);
17 #define MAGIC_CMD 0x564d5868
18 #define MAGIC_PORT 0x5658
19 #define HIGH_BAND_PORT 0x5659
21 #define BACKDOOR_PORT 51
22 #define BACKDOOR_HB_PORT 1
23 #define CMD_SET_ADDRESS BACKDOOR_PORT|(1<<16)
24 #define CMD_RETURN_REPLAY BACKDOOR_PORT|(2<<16)
25 #define CMD_GO_LIVE BACKDOOR_PORT|(3<<16)
26 #define CMD_LOG BACKDOOR_HB_PORT|(4<<16)
27 #define CMD_SET_RECORD 47
32 typedef unsigned int uint32
;
33 typedef unsigned long long uint64
;
41 static sigjmp_buf segv_jmp
;
43 void libvassert_process_backdoor(uint32
, uint32
, uint32
, reg_t
*, reg_t
*,
47 *---------------------------------------------------------------------
51 * Customed SEGV signal handler for VAssert_IsInVM.
60 *---------------------------------------------------------------------
66 /* jumping to error handling in VAssert_IsInVM. */
67 siglongjmp(segv_jmp
, 1);
72 *---------------------------------------------------------------------
76 * Check if we are in virtual world.
80 * Return TRUE on success, or FALSE on failure.
85 *---------------------------------------------------------------------
91 uint32 eax
, ebx
, ecx
, edx
;
92 static Bool inVM
= FALSE
;
93 static Bool tested
= FALSE
;
96 if (sigsetjmp(segv_jmp
, 0) != 0) {
97 signal(SIGSEGV
, SIG_DFL
);
102 /* Install custom handler. */
103 signal(SIGSEGV
, sig_segv
);
104 /* Test if we are in a VM. */
105 libvassert_process_backdoor(0x0a, 0, MAGIC_PORT
, &eax
, &ebx
, &ecx
, &edx
);
106 signal(SIGSEGV
, SIG_DFL
);
114 *---------------------------------------------------------------------
118 * Tell vmx that vassert is inited.
122 * Return 0 on success, or -1 on failure.
127 *---------------------------------------------------------------------
133 uint32 eax
, ebx
, ecx
, edx
;
134 VA page_address
= (VA
) &vassert_state
.inReplay
;
135 if (!VAssert_IsInVM()) {
138 bzero((char*) &vassert_state
, sizeof vassert_state
);
141 if (mlock(&vassert_state
, sizeof vassert_state
)) {
146 libvassert_process_backdoor(CMD_SET_ADDRESS
, page_address
,
147 MAGIC_PORT
|(1<<16), &eax
, &ebx
, &ecx
, &edx
);
149 return (eax
!= -1) ? 0 : -1;
154 *---------------------------------------------------------------------
158 * Tell vmx that vassert is finalized.
162 * Return 0 on success, or -1 on failure.
167 *---------------------------------------------------------------------
173 unsigned int eax
, ebx
, ecx
, edx
;
174 if (!VAssert_IsInVM()) {
177 libvassert_process_backdoor(CMD_SET_ADDRESS
, 0, MAGIC_PORT
|(0<<16), &eax
, &ebx
, &ecx
, &edx
);
178 return (eax
!= -1) ? 0 : 1;
183 *---------------------------------------------------------------------
187 * Print message to a text file on host side.
193 * Write to a text file with fixed name.
194 * If the file exists, host UI will ask for append/replace/ignore
196 *---------------------------------------------------------------------
200 VAssert_LogMain(const char *format
, ...)
202 unsigned int eax
, ebx
, ecx
, edx
;
204 unsigned int len
= 0;
206 va_start(ap
, format
);
207 len
= vsnprintf(buf
, LOG_MAX
, format
, ap
);
209 __asm__
__volatile__("cld; rep outsb;"
210 : "=a"(eax
), "=b"(ebx
), "=c"(ecx
), "=d"(edx
)
211 : "0"(MAGIC_CMD
), "1"(CMD_LOG
), "2"(len
), "d"(HIGH_BAND_PORT
), "S"(buf
)
218 *---------------------------------------------------------------------
220 * VAssert_GoLiveMain --
222 * Make the vm which is in replay exit replay.
230 *---------------------------------------------------------------------
236 unsigned int eax
, ebx
, ecx
, edx
;
237 vassert_state
.inReplay
= 0;
238 libvassert_process_backdoor(CMD_GO_LIVE
, 0, MAGIC_PORT
, &eax
, &ebx
, &ecx
, &edx
);
243 *---------------------------------------------------------------------
245 * VAssert_ReturnToReplayMain --
247 * Called after the custom work is done, and replay is to continue.
253 * Replay is continued from pause.
255 *---------------------------------------------------------------------
259 VAssert_ReturnToReplayMain()
261 unsigned int eax
, ebx
, ecx
, edx
;
262 libvassert_process_backdoor(CMD_RETURN_REPLAY
, 0, MAGIC_PORT
, &eax
, &ebx
, &ecx
, &edx
);
267 *---------------------------------------------------------------------
269 * VAssert_SetRecordingMain --
271 * Ask vmx for starting or stopping recording.
275 * Return TRUE on success, or FALSE on failure.
278 * Recording is started or stopped.
280 *---------------------------------------------------------------------
284 VAssert_SetRecordingMain(char start
)
286 uint32 eax
, ebx
, ecx
, edx
;
287 if (!VAssert_IsInVM()) {
290 libvassert_process_backdoor(CMD_SET_RECORD
, start
? 1 : 2, MAGIC_PORT
, &eax
, &ebx
, &ecx
, &edx
);
291 return (eax
== 1) ? TRUE
: FALSE
;