comes from.
*/
- /* post_syscall expects us to be "waiting" even if we don't
- block */
tst->syscallno = syscallno;
- tst->status = VgTs_WaitSys;
+ vg_assert(tst->status == VgTs_Runnable);
if (syscallno < MAX_SPECIAL_SYS && special_sys[syscallno].before != NULL) {
sys = &special_sys[syscallno];
VGP_POPCC(VgpCoreSysWrap);
+ /* If we're waiting on the syscall because it's in the hands of the
+ ProxyLWP, then set the thread state to WaitSys. */
+ if (!syscall_done)
+ tst->status = VgTs_WaitSys;
+
return syscall_done;
}
pre_res = tst->sys_pre_res;
vg_assert(syscallno != -1); /* must be a current syscall */
- vg_assert(tst->status == VgTs_WaitSys); /* should be blocked waiting */
if (syscallno < MAX_SPECIAL_SYS && special_sys[syscallno].before != NULL) {
sys = &special_sys[syscallno];
sys = &bad_sys;
special = True;
}
-
+
if (!VG_(is_kerror)(tst->m_eax) && sys->after != NULL)
(sys->after)(tst->tid, tst);
#include <stdio.h>
#include <malloc.h>
#include <signal.h>
+#include <sys/mman.h>
void sig_handler(int sig){
int var;
fprintf(stderr, "caught signal, local var is on %p\n", &var);
}
-
int main(int argv, char** argc) {
int res, i;
stack_t sigstk;
struct sigaction act;
- sigstk.ss_sp = (char *)malloc(SIGSTKSZ);
+ static const int size = SIGSTKSZ;
+ char *stk = (char *)mmap(0, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
+ sigstk.ss_sp = stk;
- sigstk.ss_size = SIGSTKSZ;
+ sigstk.ss_size = size;
sigstk.ss_flags = 0;
fprintf(stderr, "calling sigaltstack, stack base is %p\n", sigstk.ss_sp);
if (sigaltstack(&sigstk,0)<0) perror("sigaltstack");