1.0.41.13: gc: Fix interrupt context scavenging of interior pointers.
authorAlastair Bridgewater <lisphacker@users.sourceforge.net>
Fri, 6 Aug 2010 18:48:53 +0000 (18:48 +0000)
committerAlastair Bridgewater <lisphacker@users.sourceforge.net>
Fri, 6 Aug 2010 18:48:53 +0000 (18:48 +0000)
commit68508f10fb9c235d1f29a55b05f5158e90b8e0b6
tree142389ae538490506fa18564940ab1616ccf70f5
parentab9c6bbaaa409e815a1c9696885c9621b429aed6
1.0.41.13: gc: Fix interrupt context scavenging of interior pointers.

  * Some registers, such as reg_LIP and the program counter, posess
the "interior pointer" nature, meaning that they are unboxed
registers that contain untagged pointers into heap space, relative
to some actual boxed ("pair") register.

  * The program counter is advertised as always being relative to
reg_CODE, but this is easily disproven.  The "npc" register on
platforms with branch-delay slots is the same, as is the link
register on PPC.

  * Rather than coming up with clever rules for which interior
pointer registers can refer to which pairs at which times, doing
object length tests for validity, and so on, just deal with all of
the interior pointer registers (plausibly up to five on any given
platform, though in practice three or four) as general interior
pointers.

  * Rather than dealing with massive code duplication for the
various interior pointer registers, come up with a clever macro
system to paper over the worst of the repetition.

  * Only pair interior-pointers to pointer values, never fixnums
or other-immediates.

  * Use the untagged "native pointer" value of a pair register
when computing the interior-pointer offset, preventing failure
to pair when the interior-pointer is to within the first two
words of the object.
src/runtime/gc-common.c
version.lisp-expr