OSDev.org https://forum.osdev.org/ |
|
Passing a stack frame by value https://forum.osdev.org/viewtopic.php?f=13&t=34660 |
Page 1 of 1 |
Author: | unablegrid [ Fri Sep 20, 2019 1:57 am ] |
Post subject: | Passing a stack frame by value |
I spent about three hours yesterday debugging an issue triggered by a gcc optimisation. I'm posting it in the hope that it may save someone some time. Basically, my ISR look like this: Code: ... pusha call handler popa ... iret where handler is the following C function: Code: void handler(isr_stack_frame_t stack) { /* possibly do something to the stack */ } Obviously (in retrospect), this is wrong, because the compiler is free to elide any modifications to stack that the function makes (and indeed it did so when compiling with -O2). 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? |
Author: | Octocontrabass [ Fri Sep 20, 2019 2:08 am ] |
Post subject: | Re: Passing a stack frame by value |
You should. Were you perhaps following a tutorial known to have this bug? |
Author: | unablegrid [ Fri Sep 20, 2019 2:11 am ] |
Post subject: | Re: Passing a stack frame by value |
Quote: Were you perhaps following a tutorial known to have this bug? Ahah, no, I take all the blame. |
Author: | unablegrid [ Fri Sep 20, 2019 2:44 am ] |
Post subject: | Re: Passing a stack frame by value |
Note that the Little Book about OS Development makes the same mistake. Here's the github issue about it. |
Page 1 of 1 | All times are UTC - 6 hours |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |