Is register value corruption a possibility on reentrant functions in ARM C?

141 Views Asked by At

Maybe I'm overthinking this since I've been researching for a couple of hours. I have the concept and rules of reentrancy pretty clear now but since I'm doing this for ARM (Cortex-M4), another question came to mind that is not touched on the reentrancy resources I've found, nor in its rules.

I understand that the following function is reentrant from the rules of reentrancy:

void foo(int x, int y)
{
    printf("x = %d - y = %d", x, y);
}

The thing here is that, at least on ARM where I've verified this, x and y are passed on registers r2 and r3 and not in foo's stack. If they were passed in the stack then there would not be any confusion for me because I know that is preserved across function calls, however, since x and y are passed in registers, what would happen if a second call to foo is made from another RTOS task context right after the first call has been made?

void foo(int x, int y)
{ <-------------------------------------------- Second call made here
    printf("x = %d - y = %d\n", x, y);
}

Wouldn't that corrupt r2 and r3 values?

I haven't been able to test this because I have no idea how to make it happen.

1

There are 1 best solutions below

1
user253751 On BEST ANSWER

Whenever the operating system switches to another thread it has to save all the register values from the old thread and load the register values for the new thread.