18 #include "comedi_test.h"
20 /* XXX this should come from elsewhere */
21 #define PAGE_SIZE 4096
23 #define N_SAMPLES 10000
25 #define BUFSZ N_SAMPLES*sizeof(sampl_t)
31 void segv_handler(int num,siginfo_t *si,void *x)
36 int test_segfault(void *memptr)
42 if(!ret) tmp = *((char *)(memptr));
46 void setup_segfaulter(void)
50 memset(&act,0,sizeof(act));
51 act.sa_sigaction=&segv_handler;
52 act.sa_flags = SA_SIGINFO;
53 sigaction(SIGSEGV,&act,NULL);
60 unsigned int chanlist[1];
67 if(!(comedi_get_subdevice_flags(device,subdevice)&SDF_CMD)){
68 printf("not applicable\n");
72 if(comedi_get_cmd_generic_timed(device,subdevice,&cmd)<0){
73 printf("E: comedi_get_cmd_generic_timed failed\n");
81 map=mmap(NULL,MAPLEN,PROT_READ,MAP_SHARED,comedi_fileno(device),0);
83 printf("E: mmap() failed\n");
87 /* test readability */
88 for(adr=map;adr<(void *)map+MAPLEN;adr+=PAGE_SIZE){
89 ret=test_segfault(adr);
91 printf("E: %p failed\n",adr);
93 printf("%p ok\n",adr);
97 cmd.chanlist = chanlist;
99 cmd.stop_arg = N_SAMPLES;
100 cmd.chanlist_len = 1;
101 chanlist[0] = CR_PACK(0,0,0);
103 comedi_command(device,&cmd);
108 ret = read(comedi_fileno(device),b,BUFSZ);
121 printf("read %d %d\n",ret,total);
124 if(memcmp(buf,map,total)){
125 printf("E: mmap compare failed\n");
127 printf("compare ok\n");
131 /* test if area is really unmapped */
132 for(adr=map;adr<(void *)map+MAPLEN;adr+=PAGE_SIZE){
133 ret=test_segfault(adr);
135 printf("%p segfaulted (ok)\n",adr);
137 printf("E: %p still mapped\n",adr);