On Mon, Dec 18, 2017 at 1:58 PM, Josh Poimboeuf <jpoimboe@xxxxxxxxxx> wrote: > On Fri, Dec 15, 2017 at 07:40:09PM +1000, Nicholas Piggin wrote: >> On Tue, 12 Dec 2017 08:05:01 -0600 >> Josh Poimboeuf <jpoimboe@xxxxxxxxxx> wrote: >> >> > On Tue, Dec 12, 2017 at 12:39:12PM +0100, Torsten Duwe wrote: >> > > Hi all, >> > > >> > > The "Power Architecture 64-Bit ELF V2 ABI" says in section 2.3.2.3: >> > > >> > > [...] There are several rules that must be adhered to in order to ensure >> > > reliable and consistent call chain backtracing: >> > > >> > > * Before a function calls any other function, it shall establish its >> > > own stack frame, whose size shall be a multiple of 16 bytes. >> > >> > What about leaf functions? If a leaf function doesn't establish a stack >> > frame, and it has inline asm which contains a blr to another function, >> > this ABI is broken. > > Oops, I meant to say "bl" instead of "blr". I was wondering why "blr" mattered, but I guess we should speak of the consistency model. By walking a stack trace we expect to find whether a function is in use or not and can/cannot be live-patched at this point in time. Right? > >> > Also, even for non-leaf functions, is it possible for GCC to insert the >> > inline asm before it sets up the stack frame? (This is an occasional >> > problem on x86.) >> >> Inline asm must not have control transfer out of the statement unless >> it is asm goto. > > Can inline asm have calls to other functions? > >> > Also, what about hand-coded asm? >> >> Should follow the same rules if it uses the stack. > > How is that enforced? > >> > > To me this sounds like the equivalent of HAVE_RELIABLE_STACKTRACE. >> > > This patch may be unneccessarily limited to ppc64le, but OTOH the only >> > > user of this flag so far is livepatching, which is only implemented on >> > > PPCs with 64-LE, a.k.a. ELF ABI v2. >> > >> > In addition to fixing the above issues, the unwinder also needs to >> > detect interrupts (i.e., preemption) and page faults on the stack of a >> > blocked task. If a function were preempted before it created a stack >> > frame, or if a leaf function blocked on a page fault, the stack trace >> > will skip the function's caller, so such a trace will need to be >> > reported to livepatch as unreliable. >> >> I don't think there is much problem there for powerpc. Stack frame >> creation and function call with return pointer are each atomic. > > What if the function is interrupted before it creates the stack frame? > If it is interrupted, the exception handler will establish a new stack frame. >From a consistency viewpoint, I guess the question is -- has the function been entered or considered to be entered when a stack frame has not yet been established Balbir Singh. -- To unsubscribe from this list: send the line "unsubscribe live-patching" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html