[Freeswitch-dev] Freeswitch on ARM, Memory alignment issues

Michael Jerris mike at jerris.com
Tue Jan 18 23:40:40 MSK 2011

On Jan 18, 2011, at 2:42 PM, M D wrote:

> On Tue, 18 Jan 2011 12:54:53 -0500
> Michael Jerris <mike at jerris.com> wrote:
> In general, should I conclude that this issue has not been encountered
> before?

This has certainly been encountered before, on different platforms, including arm.  I suspect this is a toolchain issue more than anything in this case as we have worked on arm for quite some time.

>> take a look at swith_types.h 645-710.  This is what you would need to
>> do cross platform to align stuff.
> If I understood you correctly, you mean to point out a general cross
> platform issue and how it is dealt with withing freeswitch code. Right?
> Just to complete the info, the ARM processor is running Little-Endian.
> The code/settings/dialplan worked fine on a x86 linux machine, also
> little endian. Probably nothing new, but I thought I should fill in the
> details.

the trick is to fix it in the way that fixes it for the most things all at once.

>> I am surprised the first way isn't
>> aligned already, the first proposed change wont be cross platform,
>> the second, if that works, should be fine (as long as you free it
>> later of course) but I am unsure if that will actually work cross
>> platform.  The trick here is to figure out how to fix it once for all
>> platforms.
>> Mike
> I expected that the original code would be aligned too. It just wasn't,
> atleast with gcc 4.3.3 + Code Sourcery enhancements. In gcc 4.4.5 ( I
> think, I don't have access to my development machine at the moment.)
> using the switch -falign-functions did align the buffer buf at a 32-bit
> boundary. Of course align-functions does not ensure that all uint8_t
> buffers would be aligned. 

Is there a gcc arg that will make this work?  If so we can test for that being available and use it when it is.

> Perhaps a conditional define would be more suitable fix, considering
> all platforms. As far as I can tell, the memory alignment requirement
> is ARM specific, which restricts this issue to gcc/linux. So in pseudo
> code
> #define ALIGN_ON_ARM
> ifdef GCC
> ifdef arm
> #undef ALIGN_ON_ARM
> #define ALIGN_ON_ARM __attribute__ (aligned(4))
> #endif
> #endif
> and then in the source code
> uint8_t buf[260] ALIGN_ON_ARM = {0};
> Would something along these lines work? The only issue is that it would
> touch a lot of the code. The use of structures with a uint8 buffer
> is likely widely used within freeswitch. 

I would much rather not litter the code with a ton of garbage like this, there should be a way to tell the compiler how we want alignment to work either with a single ifdef in a header, or with a compiler arg.

> -m
>> On Jan 18, 2011, at 12:35 PM, M D wrote:
>>> Summary:
>>> Has anyone looked at/actively looking at the 32-bit boundary memory
>>> alignment requirement for the ARM architecture?

More information about the FreeSWITCH-dev mailing list