void mmap_random_event(int type) { int which; switch(rand()%6) { case 0: /* mmap random */ which=find_random_active_event(); setup_mmap(which); break; case 1: /* aux random */ break; case 2: /* munmap random */ which=find_random_active_mmap(); if (which>=0) unmap_mmap(which,0); break; case 3: /* mmap read */ which=find_random_active_mmap(); if (which>=0) perf_mmap_read(which); break; case 4: /* trash mmap */ if (type & TYPE_TRASH_MMAP) { trash_random_mmap(); } break; default: break; } return; }
void trash_random_mmap(void) { int i,value; stats.mmap_trash_attempts++; i=find_random_active_mmap(); /* Exit if no events */ if (i<0) return; value=rand(); if (ignore_but_dont_skip.trash_mmap) return; /* can't write high pages? */ //event_data[i].mmap_size); // *(event_data[i].mmap)=0xff; // printf("Attempting to trash %p: ",mmaps[i].addr); // mmap_print_prot(mmaps[i].prot); // mmap_print_flags(mmaps[i].flags); // printf("\n"); /* If not writable then we segfault */ if (!(mmaps[i].prot & PROT_WRITE)) { // printf("trash: Not writable, skipping\n"); return; } if ( (mmaps[i].aux) && (mmaps[i].prot&PROT_WRITE)) { // printf("trash: writable aux, skipping\n"); return; } memset(mmaps[i].addr,value, 1);//getpagesize()); if (logging&TYPE_TRASH_MMAP) { sprintf(log_buffer,"Q %d %d %d\n", value, getpagesize(), mmaps[i].fd); write(log_fd,log_buffer,strlen(log_buffer)); } stats.mmap_trash_successful++; // printf("Done trashing\n"); }
void trash_random_mmap(void) { int i,value; stats.mmap_trash_attempts++; i=find_random_active_mmap(); /* Exit if no events */ if (i<0) return; // printf("Found %d %p\n",i,mmaps[i].addr); value=rand(); if (ignore_but_dont_skip.trash_mmap) return; /* can't write high pages? */ //event_data[i].mmap_size); // *(event_data[i].mmap)=0xff; // printf("Attempting to trash %p: ",mmaps[i].addr); // mmap_print_prot(mmaps[i].prot); // mmap_print_flags(mmaps[i].flags); // printf("\n"); /* If not writable then we segfault */ if (!(mmaps[i].prot & PROT_WRITE)) { // printf("trash: Not writable, skipping\n"); return; } if ( (mmaps[i].aux) && (mmaps[i].prot&PROT_WRITE)) { // printf("trash: writable aux, skipping\n"); return; } /* Before we attempt to write the mmap, setup a signal handler */ signal(SIGSEGV, sigsegv_handler); /* Save state before the memset */ /* If the memset segfaults then we will skip it */ if (!sigsetjmp(j_buf, 1)) { memset(mmaps[i].addr,value, 1);//getpagesize()); } else { printf("Memset of mmap#%d at %p caused segfault!\n",i,mmaps[i].addr); perf_pretty_print_mmap_flags(mmaps[i].flags); perf_pretty_print_mmap_prot(mmaps[i].prot); printf("size %d fd %d\n",mmaps[i].size,mmaps[i].fd); printf("event: cpu=%d pid=%d group_fd=%d flags=%ld ", event_data[mmaps[i].which_event].cpu, event_data[mmaps[i].which_event].pid, event_data[mmaps[i].which_event].group_fd, event_data[mmaps[i].which_event].flags ); perf_pretty_print_attr(stdout, &event_data[mmaps[i].which_event].attr, mmaps[i].fd); } /* Disable the seigsegv handler */ signal(SIGSEGV, SIG_DFL); if (logging&TYPE_TRASH_MMAP) { sprintf(log_buffer,"Q %d %d %d\n", value, getpagesize(), mmaps[i].fd); write(log_fd,log_buffer,strlen(log_buffer)); } stats.mmap_trash_successful++; // printf("Done trashing\n"); }