Messages in this thread | | | Subject | Re: [PATCH V3 5/9] objtool: Add return address unwind hints | From | Alexandre Chartre <> | Date | Tue, 14 Apr 2020 21:27:27 +0200 |
| |
On 4/14/20 8:42 PM, Peter Zijlstra wrote: > On Tue, Apr 14, 2020 at 08:31:23PM +0200, Alexandre Chartre wrote: >> On 4/14/20 7:56 PM, Peter Zijlstra wrote: > >>> So what actual problem is it solving? >>> >> >> The return stack stuff is here to correctly handle intra-function call so that >> we can figure out where the ret of an intra-function call should return. We >> don't have this challenge with regular functions because we know that a ret >> inside such function just indicates the end of the function. >> >> But when there's an intra-function call, a ret instruction can either: >> - continue after the intra-function call (if the stack was unchanged) >> - jump somewhere else (if the return address was changed) and eventually >> return to the next return address >> - indicate the end of the function (if the return address was removed). >> >> So, all this is needed to correctly follow the flow of the code and properly >> record stack changes. > > But which intra-function calls are you worried about here? The RSB > stuffing ones we have to explicitly forget and the retpoline ones we > can't follow because they're indirect calls. > > So again, who cares about that stack? >
This provides a generic code to handle any intra-function call. Currently we have the RSB stuffing ones which are forgotten with the UNWIND_HINT_TYPE_RADDR_DELETE directive. And for retpoline, they will not return if we have an indirect jump (JMP_NOSPEC) but they will return if we have an indirect call (CALL_NOSPEC). The code can handle both cases. For example, if we were to have a CALL_NOSPEC invocation which is not in an alternative then objtool can now correctly handle it.
alex.
| |