On Aug 22, 2006, at 9:41 AM, Ralph Lange wrote: Hi Jeff, hi Eric,
a colleage of mine is trying to get EPICS running on RTEMS running on an ARM v4t.
The system crashes with a alignment fault in in BSD network stack function in_control() which gets a struct ifreq pointer. This pointer is created in osiSockDiscoverBroadcastAddresses(), where you create an array of such structures by calloc()ing 100 times the size of an struct ifreq (line 87). Then you step through the array. When you call socket_ioctl() to get the broadcast address (line 177), that call causes the crash down in the BSD stack, because at that point the pointer pifreq is not word-aligned.
We think that somehow within the array the single struct ifreq entries are not word-aligned - which sounds not very likely looking at the ifreq definition, or that your stepping algorithm in ifreqNext() (line 38 ff.) returns a wrong address which is odd.
Any ideas?
What was the reason for using the ifreqNext() function instead of just stepping with sizeof (struct ifreq)?
The folks that wrote the original socket code didn't think about the possibility of really big addresses. Nowadays it is possible for ifreqNext to have a stride greater than sizeof(struct ifreq). The code in osdNetIntf.c has to deal with this. As the comment in src/libCom/os/default/osdNetIntf.c says: /* * Move to the next ifreq structure * Made difficult by the fact that addresses larger than the structure * size may be returned from the kernel. */
To illustrate this, I added the following line to ifreqNext: printf("ifreq_size (pifreq):%d sizeof (*pifreq):%d\n", ifreq_size (pifreq), sizeof (*pifreq));
On OS X I get: ifreq_size (pifreq):36 sizeof (*pifreq):32 ifreq_size (pifreq):32 sizeof (*pifreq):32 ifreq_size (pifreq):44 sizeof (*pifreq):32 ifreq_size (pifreq):44 sizeof (*pifreq):32 ifreq_size (pifreq):36 sizeof (*pifreq):32 ifreq_size (pifreq):36 sizeof (*pifreq):32 ifreq_size (pifreq):36 sizeof (*pifreq):32 ifreq_size (pifreq):44 sizeof (*pifreq):32 ifreq_size (pifreq):32 sizeof (*pifreq):32 ifreq_size (pifreq):36 sizeof (*pifreq):32 ifreq_size (pifreq):36 sizeof (*pifreq):32 ifreq_size (pifreq):36 sizeof (*pifreq):32
Now, getting back to your problem -- check to see what ifreq_size is returning on that machine. Could be that you've uncovered a problem between the RTEMS (BSD) network stack and GCC for the ARM.
-- Advanced Photon Source Argonne National Laboratory (630) 252-4793
|