parlib: Don't run ctors in "fake parlib"
authorBarret Rhoden <brho@cs.berkeley.edu>
Sun, 29 Jan 2017 22:36:41 +0000 (17:36 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 9 Feb 2017 17:31:09 +0000 (12:31 -0500)
commit2d0747b5a1f47074d70b9d51cba5c6c040566519
tree7f910fbd789fdb94060e2804fc00c1d24a3d76e8
parentfd800e94260188123e4811b8f38fe3cf1f2c1044
parlib: Don't run ctors in "fake parlib"

Due to how we force gcc to link parlib with every binary, our shared
objects (e.g. libelf.so) have a copy of parlib and its ctors.  These
ctors run when the shared obj is loaded.  Additionally, the ctors run
again when the binary is loaded.  This means we've been running the
ctors multiple times (for perf and vmrunkernel), and haven't been
noticing it.  Yikes!

We can check the _start symbol to see if we're in the actual program or a
shared library (the fake parlib).  We need to run only one of them, and it
must be the programs.  Briefly, I tried letting the library's version run.
That registers the fake parlib's vcore_entry with the kernel.  So the
kernel would call into fake parlib, with its copy of data structures like
2LS ops and __in_vcore_context.  And the program would call into its copy.
Those structures would differ, and madness ensued.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/include/parlib/vcore.h
user/parlib/uthread.c
user/parlib/vcore.c