After digging through the assembler files it seems that for some reason a function called __old_snd_pcm_hw_params_get_period_size that uses another procedure calling standard is used.
Here is the code in libasound:
.symver __snd_pcm_hw_params_get_period_size,snd_pcm_hw_params_get_period_size@@ALSA_0.9.0rc4 .symver __old_snd_pcm_hw_params_get_period_size,snd_pcm_hw_params_get_period_size@ALSA_0.9
.align 2 .global __snd_pcm_hw_params_get_period_size .type __snd_pcm_hw_params_get_period_size, %function __snd_pcm_hw_params_get_period_size: @ args = 0, pretend = 0, frame = 4 @ frame_needed = 0, uses_anonymous_args = 0 stmfd sp!, {r4, lr} sub sp, sp, #4 mov r3, r2 mov r4, r1 mov r2, sp mov r1, #13 bl snd_pcm_hw_param_get(PLT) cmp r0, #0 ldrge r3, [sp, #0] strge r3, [r4, #0] add sp, sp, #4 ldmfd sp!, {r4, pc} .size __snd_pcm_hw_params_get_period_size, .-__snd_pcm_hw_params_get_period_size .align 2 .global __old_snd_pcm_hw_params_get_period_size .type __old_snd_pcm_hw_params_get_period_size, %function __old_snd_pcm_hw_params_get_period_size: @ args = 0, pretend = 0, frame = 4 @ frame_needed = 0, uses_anonymous_args = 0 str lr, [sp, #-4]! sub sp, sp, #4 mov r2, r1 mov r1, sp bl __snd_pcm_hw_params_get_period_size(PLT) mov r3, #0 cmp r0, r3 ldrge r3, [sp, #0] mov r0, r3 add sp, sp, #4 ldmfd sp!, {pc} .size __old_snd_pcm_hw_params_get_period_size, .-__old_snd_pcm_hw_params_get_period_size
And here is the code that calls the lib function:
sub r3, fp, #28 sub r2, fp, #32 ldr r0, [fp, #-40] mov r1, r3 bl snd_pcm_hw_params_get_period_size mov r3, r0 str r3, [fp, #-20]
Clearly if __old_snd_pwm_hw_params_get_period_size() is called then 'dir' gets 'val's address and the 'val' is some irrelevant data from the stack. Calling __snd_pwm_hw_params_get_period_size() directly should work.
What is __old_snd_pwm_hw_params_get_period_size() and how do I get rid of it? What does @ALSA_0.9 mean?
Michel