Messages in this thread | | | From | "Fabien Klein" <> | Subject | HELP!! polling driver through ioctl | Date | Fri, 16 Apr 1999 03:30:10 PDT |
| |
Hi
In order to monitor a device driver, i ve written a little TCL app with a C interface wich performs ioctl to the driver (background loop with a 1 s period)
after several hours of monitoring my system goes mad , emacs gcc... recive signal 11 ... so I thinj the ioctl mecanism must be wrong
here is the implementation
user call ( get a info buffer filled by the driver each sec)
// background process // int updateLed(clientData) ClientData clientData; {
int temp,i,j,k; struct interface *pIod;(it's only some unsigned long parameters (ulong Param1, ulong Param2 ...)
unsigned long *ThisCommonArea,*p; int state [NUM_CHANNELS_PER_GROUP]; int CommonAreaSize,protocol; int mLy1State,mLy2State,m_SignallingProtocol; int numdevice,number_of_pump;
pIod= (struct interface* )malloc(sizeof(struct interface)); CommonAreaSize= NEEDED_BUFFER_SIZE ;(40 bytes) // common area between kernel and user space (filled by driver) ThisCommonArea=(unsigned long*)malloc(CommonAreaSize); //param1 is group //param 2 is common memory area pIod->Param1 = group; pIod->Param2 = (unsigned long)ThisCommonArea; pIod->Param3 = CommonAreaSize; temp=ioctl(fd, READ_INFO_FOR_MONITOR_PANEL ,pIod); // now the buffer must be filled...
p=ThisCommonArea; // // first elt is protocol // protocol=*p; m_SignallingProtocol=*p; p++; mLy1State=*p; // // update ly1 led // UpdateLy1(mLy1State); p++; mLy2State=*p; // // update ly2 led // UpdateLy2(mLy2State); p++; .........
and then
free(ThisCommonArea); free(pIod);
// // retrig timer // Tcl_CreateTimerHandler(1000,(Tcl_TimerProc*)updateLed,NULL); return TCL_OK; }
OK and now the kernel side
int ioctl.. ( ) { .. case READ_INFO_FOR_MONITOR_PANEL: // // param 1 is group id // param 2 is common memory area // Param 3 is CommonAreaSize;
pbd= (struct interface* )kmalloc(sizeof(struct interface),GFP_KERNEL); memcpy_fromfs(pbd,(void*)arg,sizeof(struct interface));
if ( (pbd->Param1 >= ThisAdapter->NumberOfGroups) ) { pbd->Error=BACKDOOR_FAIL_SIZETOOSMALL; break; }
p = (DWORD *)(pbd->Param2);
//err= verify_area(VERIFY_WRITE, (void *)p, pbd- >Param3);
put_user(ThisAdapter->SignallingProtocol[ pbd->Param1 ],p++);
// Layer1 Status put_user((DWORD)ThisAdapter->Bt8370Block[pbd- >Param1].Status,p++);
... kfree(pbd); return OK; ..
does anyone see something wrong ??? Why is emacs or gcc crashing after this ??
thanks
______________________________________________________ Get Your Private, Free Email at http://www.hotmail.com
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |