X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=snapshot.cc;h=0362994daf50354d6a34991ab07294fed4fc19ce;hb=34e232a12096c3fce512ec06d921329edf8fcb3a;hp=83d22b4f5939b31ec7689177aed381b057966697;hpb=d88196987e572dcb561e8b1eabb3409c4491d460;p=model-checker.git diff --git a/snapshot.cc b/snapshot.cc index 83d22b4..0362994 100644 --- a/snapshot.cc +++ b/snapshot.cc @@ -61,7 +61,7 @@ void initSnapShotRecord(unsigned int numbackingpages, unsigned int numsnapshots, snapshotrecord->regionsToSnapShot=( struct MemoryRegion * )MYMALLOC(sizeof(struct MemoryRegion)*nummemoryregions); snapshotrecord->backingStoreBasePtr= ( struct SnapShotPage * )MYMALLOC( sizeof( struct SnapShotPage ) * (numbackingpages + 1) ); //Page align the backingstorepages - snapshotrecord->backingStore=( struct SnapShotPage * )ReturnPageAlignedAddress((void*) ((uintptr_t)(snapshotrecord->backingStoreBasePtr)+sizeof(struct SnapShotPage)-1)); + snapshotrecord->backingStore=( struct SnapShotPage * )PageAlignAddressUpward(snapshotrecord->backingStoreBasePtr); snapshotrecord->backingRecords=( struct BackingPageRecord * )MYMALLOC(sizeof(struct BackingPageRecord)*numbackingpages); snapshotrecord->snapShots= ( struct SnapShotRecord * )MYMALLOC(sizeof(struct SnapShotRecord)*numsnapshots); snapshotrecord->lastSnapShot=0; @@ -77,13 +77,13 @@ void HandlePF( int sig, siginfo_t *si, void * unused){ #if USE_CHECKPOINTING if( si->si_code == SEGV_MAPERR ){ printf("Real Fault at %llx\n", ( long long )si->si_addr); - exit( EXIT_FAILURE ); + exit( EXIT_FAILURE ); } void* addr = ReturnPageAlignedAddress(si->si_addr); unsigned int backingpage=snapshotrecord->lastBackingPage++; //Could run out of pages... if (backingpage==snapshotrecord->maxBackingPages) { printf("Out of backing pages at %llx\n", ( long long )si->si_addr); - exit( EXIT_FAILURE ); + exit( EXIT_FAILURE ); } //copy page @@ -103,6 +103,12 @@ void HandlePF( int sig, siginfo_t *si, void * unused){ void * ReturnPageAlignedAddress(void * addr) { return (void *)(((uintptr_t)addr)&~(PAGESIZE-1)); } + +//Return a page aligned address for the address being added +//as a side effect the numBytes are also changed. +void * PageAlignAddressUpward(void * addr) { + return (void *)((((uintptr_t)addr)+PAGESIZE-1)&~(PAGESIZE-1)); +} #ifdef __cplusplus extern "C" { #endif @@ -128,8 +134,15 @@ extern "C" { #endif void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots, unsigned int nummemoryregions, unsigned int numheappages, MyFuncPtr entryPoint){ #if USE_CHECKPOINTING + /* Setup a stack for our signal handler.... */ + stack_t ss; + ss.ss_sp = MYMALLOC(SIGSTACKSIZE); + ss.ss_size = SIGSTACKSIZE; + ss.ss_flags = 0; + sigaltstack(&ss, NULL); + struct sigaction sa; - sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART; + sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART | SA_ONSTACK; sigemptyset( &sa.sa_mask ); sa.sa_sigaction = HandlePF; if( sigaction( SIGSEGV, &sa, NULL ) == -1 ){ @@ -137,9 +150,9 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots exit(-1); } initSnapShotRecord(numbackingpages, numsnapshots, nummemoryregions); - + basemySpace=MYMALLOC((numheappages+1)*PAGESIZE); - void * pagealignedbase=(void *)((((uintptr_t)basemySpace)+PAGESIZE-1)&~(PAGESIZE-1)); + void * pagealignedbase=PageAlignAddressUpward(basemySpace); mySpace = create_mspace_with_base(pagealignedbase, numheappages*PAGESIZE, 1 ); addMemoryRegionToSnapShot(pagealignedbase, numheappages); entryPoint(); @@ -159,7 +172,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots gettimeofday( starttime, NULL ); #endif //step 2 setup the stack context. - + int alreadySwapped = 0; getcontext( &savedSnapshotContext ); if( !alreadySwapped ){ @@ -172,7 +185,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots makecontext( &newContext, entryPoint, 0 ); swapcontext( &swappedContext, &newContext ); } - + //add the code to take a snapshot here... //to return to user process, do a second swapcontext... pid_t forkedID = 0; @@ -181,7 +194,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots while( !sTheRecord->mbFinalize ){ sTheRecord->currSnapShotID=snapshotid+1; forkedID = fork(); - if( 0 == forkedID ){ + if( 0 == forkedID ){ ucontext_t currentContext; #if 0 int dbg = 0; @@ -190,7 +203,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots if( swapContext ) swapcontext( ¤tContext, &( sTheRecord->mContextToRollback ) ); else{ - swapcontext( ¤tContext, &savedUserSnapshotContext ); + swapcontext( ¤tContext, &savedUserSnapshotContext ); } } else { int status; @@ -200,7 +213,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots sprintf( mesg, "The process id of child is %d and the process id of this process is %d and snapshot id is %d", forkedID, getpid(), snapshotid ); DumpIntoLog( "ModelSnapshot", mesg ); #endif - do { + do { retVal=waitpid( forkedID, &status, 0 ); } while( -1 == retVal && errno == EINTR ); @@ -211,7 +224,7 @@ void initSnapShotLibrary(unsigned int numbackingpages, unsigned int numsnapshots } } } - + #endif } /* This function assumes that addr is page aligned */ @@ -222,7 +235,7 @@ void addMemoryRegionToSnapShot( void * addr, unsigned int numPages) { printf("Exceeded supported number of memory regions!\n"); exit(-1); } - + snapshotrecord->regionsToSnapShot[ memoryregion ].basePtr=addr; snapshotrecord->regionsToSnapShot[ memoryregion ].sizeInPages=numPages; #endif //NOT REQUIRED IN THE CASE OF FORK BASED SNAPSHOTS. @@ -235,7 +248,7 @@ snapshot_id takeSnapshot( ){ perror("mprotect"); printf("Failed to mprotect inside of takeSnapShot\n"); exit(-1); - } + } } unsigned int snapshot=snapshotrecord->lastSnapShot++; if (snapshot==snapshotrecord->maxSnapShots) { @@ -243,7 +256,7 @@ snapshot_id takeSnapshot( ){ exit(-1); } snapshotrecord->snapShots[snapshot].firstBackingPage=snapshotrecord->lastBackingPage; - + return snapshot; #else swapcontext( &savedUserSnapshotContext, &savedSnapshotContext ); @@ -258,15 +271,15 @@ void rollBack( snapshot_id theID ){ perror("mprotect"); printf("Failed to mprotect inside of takeSnapShot\n"); exit(-1); - } + } } for(unsigned int page=snapshotrecord->snapShots[theID].firstBackingPage; pagelastBackingPage; page++) { bool oldVal = false; if( duplicateMap.find( snapshotrecord->backingRecords[page].basePtrOfPage ) != duplicateMap.end() ){ - oldVal = true; + oldVal = true; } else{ - duplicateMap[ snapshotrecord->backingRecords[page].basePtrOfPage ] = true; + duplicateMap[ snapshotrecord->backingRecords[page].basePtrOfPage ] = true; } if( !oldVal ){ memcpy(snapshotrecord->backingRecords[page].basePtrOfPage, &snapshotrecord->backingStore[page], sizeof(struct SnapShotPage)); @@ -282,7 +295,7 @@ void rollBack( snapshot_id theID ){ if( !sTemp ){ sTemp = 1; #if SSDEBUG - DumpIntoLog( "ModelSnapshot", "Invoked rollback" ); + DumpIntoLog( "ModelSnapshot", "Invoked rollback" ); #endif exit( 0 ); }