- //step 2 setup the stack context.
-
- int alreadySwapped = 0;
- getcontext( &savedSnapshotContext );
- if( !alreadySwapped ){
- alreadySwapped = 1;
- ucontext_t currentContext, swappedContext, newContext;
- getcontext( &newContext );
- newContext.uc_stack.ss_sp = sTheRecord->mStackBase;
- newContext.uc_stack.ss_size = STACK_SIZE_DEFAULT;
- newContext.uc_link = ¤tContext;
- makecontext( &newContext, entryPoint, 0 );
- swapcontext( &swappedContext, &newContext );
- }
-
- //add the code to take a snapshot here...
+ if( sigaction( SIGSEGV, &sa, NULL ) == -1 ){
+ printf("SIGACTION CANNOT BE INSTALLED\n");
+ exit(EXIT_FAILURE);
+ }
+
+ initSnapShotRecord(numbackingpages, numsnapshots, nummemoryregions);
+
+ // EVIL HACK: We need to make sure that calls into the HandlePF method don't cause dynamic links
+ // The problem is that we end up protecting state in the dynamic linker...
+ // Solution is to call our signal handler before we start protecting stuff...
+
+ siginfo_t si;
+ si.si_addr=ss.ss_sp;
+ si.si_code = 0;
+ HandlePF(SIGSEGV, &si, NULL);
+ snapshotrecord->lastBackingPage--; //remove the fake page we copied
+
+ basemySpace=MYMALLOC((numheappages+1)*PAGESIZE);
+ void * pagealignedbase=PageAlignAddressUpward(basemySpace);
+ mySpace = create_mspace_with_base(pagealignedbase, numheappages*PAGESIZE, 1 );
+ addMemoryRegionToSnapShot(pagealignedbase, numheappages);
+ entryPoint();
+#else
+
+ basemySpace=system_malloc((numheappages+1)*PAGESIZE);
+ void * pagealignedbase=PageAlignAddressUpward(basemySpace);
+ mySpace = create_mspace_with_base(pagealignedbase, numheappages*PAGESIZE, 1 );
+ createSharedLibrary();
+
+ //step 2 setup the stack context.
+
+ int alreadySwapped = 0;
+ getcontext( &savedSnapshotContext );
+ if( !alreadySwapped ){
+ alreadySwapped = 1;
+ ucontext_t currentContext, swappedContext, newContext;
+ getcontext( &newContext );
+ newContext.uc_stack.ss_sp = sTheRecord->mStackBase;
+ newContext.uc_stack.ss_size = STACK_SIZE_DEFAULT;
+ newContext.uc_link = ¤tContext;
+ makecontext( &newContext, entryPoint, 0 );
+ swapcontext( &swappedContext, &newContext );
+ }
+
+ //add the code to take a snapshot here...