void sigaction_sigbusy(int signum, siginfo_t *info, void *ctxt)
{
	char *ptr;
	int ret;
	char x;
	long len;
	if (signum != SIGBUS)
		return;

	ptr = info->si_addr;

	mnovolatile(ptr, CHUNK, &ret);
	printf("Fixing up data\n");
	len = (ptr - vaddr)/CHUNK;
	x = 'A' + len; 
	memset(ptr, x, CHUNK);
	printf("%c\n", x);
	
}
Beispiel #2
0
int main(int argc, char *argv[])
{
    int i, purged;
    char* file = NULL;
    int fd;
    int pressure = 0;
    int opt;

    /* Process arguments */
    while ((opt = getopt(argc, argv, "p:f:"))!=-1) {
        switch(opt) {
        case 'p':
            pressure = atoi(optarg);
            break;
        case 'f':
            file = optarg;
            break;
        default:
            printf("Usage: %s [-p <mempressure in megs>] [-f <filename>]\n", argv[0]);
            printf("        -p: Amount of memory pressure to generate\n");
            printf("        -f: Use a file\n");
            exit(-1);
        }
    }

    if (file) {
        printf("Using file %s\n", file);
        fd = open(file, O_RDWR);
        vaddr = mmap(0, FULLSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    } else {
        vaddr = malloc(FULLSIZE);
    }

    purged = 0;
    vaddr += PAGE_SIZE-1;
    vaddr -= (long)vaddr % PAGE_SIZE;

    for(i=0; i < CHUNKNUM; i++)
        memset(vaddr + (i*CHUNK), 'A'+i, CHUNK);


    for(i=0; i < CHUNKNUM; ) {
        mvolatile(vaddr + (i*CHUNK), CHUNK);
        i+=2;
    }

    printf("Generating %i megs of pressure\n", pressure);
    generate_pressure(pressure);

    for(i=0; i < CHUNKNUM; ) {
        mnovolatile(vaddr + (i*CHUNK), CHUNK, &purged);
        i+=2;
    }

    if (purged)
        printf("Data purged!\n");

    for(i=0; i < CHUNKNUM; i++)
        printf("%c\n", vaddr[i*CHUNK]);



    return 0;
}