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); }
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; }