Context-saving functions are attrib'd return_twice
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 5 Aug 2013 23:22:44 +0000 (16:22 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 6 Aug 2013 21:58:09 +0000 (14:58 -0700)
commit2be3789a779a6a3fb709fb9b5faf0212821d3ced
tree68a8ae68b463f031916c759a2a362d4351ecd465
parent0297da50278fa94c575ac43c68f58e0cfc04e157
Context-saving functions are attrib'd return_twice

The compiler should warn us if it was unable to generate the code that doesn't
rely on registers across the function call.

The places we used it didn't do much on the return, so this probably wasn't a
problem.  Still, it may be in the future, and this beats inspecting the
assembly.

One thing that isn't clear is whether or not returns_twice causes the compiler
to mark all registers as dead, or just the caller-saved registers.  Probably
the former.

The motivation for this is a stack clobber problem, where the compiler may save
the caller-saved registers (before calling save_user_ctx()) by pushing them on
the stack.  If this happens, when save_ returns the first time, it'll restore
the registers properly, but then could clobber that space so that the second
time it returns, the values it pops are garbage.  Hopefully the compiler will
avoid saving registers in this manner, or otherwise do anything that could be
harmed by returning twice.
kern/include/trap.h
user/parlib/include/riscv/vcore.h
user/parlib/include/x86/vcore32.h
user/parlib/include/x86/vcore64.h