Beispiel #1
0
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;
}
Beispiel #2
0
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");
}
Beispiel #3
0
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");
}