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)
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_handler=&segv_handler;
52 sigaction(SIGSEGV,&act,NULL);
59 unsigned int chanlist[1];
70 flags = comedi_get_subdevice_flags(device,subdevice);
72 if(!(flags&SDF_CMD) || flags&SDF_WRITEABLE){
73 printf("not applicable\n");
77 if(comedi_get_cmd_generic_timed(device,subdevice,&cmd,1)<0){
78 printf("E: comedi_get_cmd_generic_timed failed\n");
86 map=mmap(NULL,MAPLEN,PROT_READ,MAP_SHARED,comedi_fileno(device),0);
88 printf("E: mmap() failed\n");
92 /* test readability */
93 for(adr=map;adr<map+MAPLEN;adr+=PAGE_SIZE){
94 ret=test_segfault(adr);
96 printf("E: %p failed\n",adr);
98 printf("%p ok\n",adr);
102 if(realtime)cmd.flags |= TRIG_RT;
104 cmd.chanlist = chanlist;
105 cmd.scan_end_arg = 1;
106 cmd.stop_arg = N_SAMPLES;
107 cmd.chanlist_len = 1;
108 chanlist[0] = CR_PACK(0,0,0);
110 comedi_command(device,&cmd);
115 ret = read(comedi_fileno(device),b,BUFSZ);
128 if(verbose) printf("read %d %d\n",ret,total);
133 for(i=0;i<total;i++){
135 if(fails==0)printf("E: mmap compare failed\n");
136 printf("offset %d (read=%02x mmap=%02x)\n",i,
143 if(fails==0) printf("compare ok\n");
147 /* test if area is really unmapped */
148 for(adr=map;adr<map+MAPLEN;adr+=PAGE_SIZE){
149 ret=test_segfault(adr);
151 printf("%p segfaulted (ok)\n",adr);
153 printf("E: %p still mapped\n",adr);