18 #include "comedi_test.h"
20 /* XXX this should come from elsewhere */
21 #define PAGE_SIZE 4096
23 #define N_SAMPLES 10000
27 void segv_handler(int num)
29 siglongjmp(jump_env,1);
32 int test_segfault(void *memptr)
37 struct sigaction oldact;
39 memset(&act,0,sizeof(act));
40 act.sa_handler=&segv_handler;
41 ret = sigaction(SIGSEGV,&act,&oldact);
44 fprintf(stderr, "sigaction failed\n");
47 ret=sigsetjmp(jump_env, 1);
48 if(!ret) tmp = *((char *)(memptr));
49 sigaction(SIGSEGV,&oldact,NULL);
57 unsigned int chanlist[1];
70 flags = comedi_get_subdevice_flags(device,subdevice);
72 if(!(flags&SDF_CMD) || (comedi_get_read_subdevice(device)!=subdevice)){
73 printf("not applicable\n");
76 if(flags & SDF_LSAMPL) sample_size = sizeof(lsampl_t);
77 else sample_size = sizeof(sampl_t);
78 map_len = sample_size * N_SAMPLES;
80 if(comedi_get_cmd_generic_timed(device, subdevice, &cmd, 1, 1)<0){
81 printf("E: comedi_get_cmd_generic_timed failed\n");
85 buf=malloc(sample_size * N_SAMPLES);
87 map = mmap(NULL, map_len,PROT_READ, MAP_SHARED, comedi_fileno(device),0);
89 printf("E: mmap() failed\n");
93 /* test readability */
94 for(adr = map; adr < map + map_len; adr += PAGE_SIZE){
95 ret=test_segfault(adr);
97 printf("E: %p failed\n",adr);
99 printf("%p ok\n",adr);
103 if(realtime)cmd.flags |= TRIG_RT;
105 cmd.chanlist = chanlist;
106 cmd.scan_end_arg = 1;
107 cmd.stop_arg = N_SAMPLES;
108 cmd.chanlist_len = 1;
109 chanlist[0] = CR_PACK(0,0,0);
111 comedi_command(device,&cmd);
116 ret = read(comedi_fileno(device), b,
117 (N_SAMPLES * sample_size) - total);
130 if(verbose) printf("read %d %d\n",ret,total);
131 if(total >= (N_SAMPLES * sample_size)){
138 for(i=0;i<total;i++){
140 if(fails==0)printf("E: mmap compare failed\n");
141 printf("offset %d (read=%02x mmap=%02x)\n",i,
147 if(fails==0) printf("compare ok\n");
149 munmap(map, map_len);
151 /* test if area is really unmapped */
152 for(adr = map; adr < map + map_len; adr += PAGE_SIZE){
153 ret=test_segfault(adr);
155 printf("%p segfaulted (ok)\n",adr);
157 printf("E: %p still mapped\n",adr);