Code: Select all
...
pusha
call handler
popa
...
iret
Code: Select all
void handler(isr_stack_frame_t stack)
{
/* possibly do something to the stack */
}
I wonder if there is a way to beat the compiler into submission by explaining that the stack is going to be valid after the call. For example, adding a call to an empty function (defined in another compilation unit!) that takes a pointer to the stack as argument does the trick, but I don't think it's guaranteed to. I guess the calling convention makes no guarantees about the validity of the arguments on the stack after the call, so I should probably give up and pass the stack frame by reference, shouldn't I?