#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "comedi_test.h" /* XXX this should come from elsewhere */ #define PAGE_SIZE 4096 #define N_SAMPLES 10000 #define BUFSZ N_SAMPLES*sizeof(sampl_t) #define MAPLEN 20480 jmp_buf jump_env; void segv_handler(int num) { longjmp(jump_env,1); } int test_segfault(void *memptr) { volatile char tmp; int ret; ret=setjmp(jump_env); if(!ret) tmp = *((char *)(memptr)); return ret; } void setup_segfaulter(void) { struct sigaction act; memset(&act,0,sizeof(act)); act.sa_handler=&segv_handler; sigaction(SIGSEGV,&act,NULL); } int test_mmap(void) { comedi_cmd cmd; unsigned char *buf; unsigned int chanlist[1]; int go; int fails; int total=0; int ret; void *b; unsigned char *adr; unsigned char *map; unsigned int flags; int i; flags = comedi_get_subdevice_flags(device,subdevice); if(!(flags&SDF_CMD) || flags&SDF_WRITEABLE){ printf("not applicable\n"); return 0; } if(comedi_get_cmd_generic_timed(device,subdevice,&cmd,1)<0){ printf("E: comedi_get_cmd_generic_timed failed\n"); return 0; } setup_segfaulter(); buf=malloc(BUFSZ); map=mmap(NULL,MAPLEN,PROT_READ,MAP_SHARED,comedi_fileno(device),0); if(!map){ printf("E: mmap() failed\n"); return 0; } /* test readability */ for(adr=map;adr10)break; } } if(fails==0) printf("compare ok\n"); munmap(map,MAPLEN); /* test if area is really unmapped */ for(adr=map;adr