mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-04 10:21:20 +00:00
I tried using 'svn merge' to do the merge but it did a terrible job and there were bazillions of conflicts. So instead I just took the diff between the branch and trunk at r10155, applied the diff to the trunk, 'svn add'ed the added files (no files needed to be 'svn remove'd) and committed. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10156
76 lines
1.6 KiB
C
76 lines
1.6 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <ucontext.h>
|
|
#include "tests/sys_mman.h"
|
|
|
|
#include "valgrind.h"
|
|
|
|
#define STACK_SIZE (10 * 4096)
|
|
|
|
// This test is checking the libc context calls (setcontext, etc.) and
|
|
// checks that Valgrind notices their stack changes properly.
|
|
|
|
#if defined(_AIX) || defined(__APPLE__)
|
|
typedef ucontext_t mycontext;
|
|
#else /* linux */
|
|
typedef struct ucontext mycontext;
|
|
#endif
|
|
|
|
mycontext ctx1, ctx2, oldc;
|
|
int count;
|
|
|
|
void hello(mycontext *newc)
|
|
{
|
|
printf("hello, world: %d\n", count);
|
|
if (count++ == 2)
|
|
newc = &oldc;
|
|
setcontext(newc);
|
|
}
|
|
|
|
int init_context(mycontext *uc)
|
|
{
|
|
void *stack;
|
|
int ret;
|
|
|
|
if (getcontext(uc) == -1) {
|
|
//perror("getcontext");
|
|
printf("getcontext() doesn't seem to work\n");
|
|
exit(1);
|
|
}
|
|
|
|
stack = (void *)mmap(0, STACK_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC,
|
|
MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
|
|
|
|
if (stack == (void*)-1) {
|
|
perror("mmap");
|
|
exit(1);
|
|
}
|
|
|
|
ret = VALGRIND_STACK_REGISTER(stack, stack + STACK_SIZE);
|
|
|
|
uc->uc_link = NULL;
|
|
uc->uc_stack.ss_sp = stack;
|
|
uc->uc_stack.ss_size = STACK_SIZE;
|
|
uc->uc_stack.ss_flags = 0;
|
|
|
|
return ret;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int c1 = init_context(&ctx1);
|
|
int c2 = init_context(&ctx2);
|
|
|
|
makecontext(&ctx1, (void (*)()) hello, 1, &ctx2);
|
|
makecontext(&ctx2, (void (*)()) hello, 1, &ctx1);
|
|
|
|
swapcontext(&oldc, &ctx1);
|
|
|
|
VALGRIND_STACK_DEREGISTER(c1);
|
|
//free(ctx1.uc_stack.ss_sp);
|
|
VALGRIND_STACK_DEREGISTER(c2);
|
|
//free(ctx2.uc_stack.ss_sp);
|
|
|
|
return 0;
|
|
}
|