[PATCH 3/4] altstack: Declare memory clobbers
David Gibson <[email protected]> Tue, 16 Feb 2016 17:09:24 +1100
| Newsgroups | org.ozlabs.lists.ccan |
|---|---|
| Message-ID | <[email protected]> |
altstack includes a couple of inline asm blocks with x86 push and pop instructions. These instructions will access memory (the stack), but that's not declared in inline asm statement. We seem to be getting away with it, but in theory that could allow the compiler to re-order accesses to local variables across the asm block. Since those blocks change the location of the stack, that could be very bad. Adding a "memory" clobber should prevent this (effectively making the asm blocks a compiler memory barrier). Signed-off-by: David Gibson <[email protected]> --- ccan/altstack/altstack.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ccan/altstack/altstack.c b/ccan/altstack/altstack.c index 640344d..6351293 100644 --- a/ccan/altstack/altstack.c +++ b/ccan/altstack/altstack.c @@ -108,9 +108,10 @@ int altstack(rlim_t max, void *(*fn)(void *), void *arg, void **out) "mov %1, %%rsp\n\t" "sub $8, %%rsp\n\t" "push %%r10" - : "=r" (rsp_save_[0]) : "0" (m + max) : "r10"); + : "=r" (rsp_save_[0]) : "0" (m + max) : "r10", "memory"); out_ = fn_(arg_); - asm volatile ("pop %rsp"); + asm volatile ("pop %%rsp" + : : : "memory"); ret = 0; if (out) *out = out_; } -- 2.5.0 _______________________________________________ ccan mailing list [email protected] https://lists.ozlabs.org/listinfo/ccan