This can be helpful in cases where old modules for some reason
had not been cleaned when the location was still /boot/modules
and have ended up getting objcopy'd to /boot/kernel after the
location was changed.

* Record the expected kernel stack pointer along with the pcb_onfault
action. Adjust the trap code to only take the action if the frame's
stack pointer matches the recorded expected stack pointer.

Otherwise this might be a recursive trap and we definitely do NOT want
to execute the on-fault stuff in that situation.

* Prior to these changes recursive traps during uiomove()s could result
in a kernel stack so corrupt that finding the actual cause of the panic
becomes impossible. This is believed to be making life difficult for us
trying to track down a particular i386 panic.

* On x86-64 we had to increase the size of the pcb structure. kgdb on
kernel cores and live kernels will be effected (needs recompile).

* The info structure for the pmap_inval*() API is only initialized
conditionally as an optimization.

* There was a case where the info structure was being used without
first being initialized which matches reported panics (essentially
a pipe buffer page in kernel memory is swapped out and the faulted back
in during a uiomove).

Other than C++ code, the GCC offsetof builtin was never getting used.
The version that did get expanded could not be used for array
declarations on GCC 4.5 and later because it wasn't considered a
constant expression by those later GCC compilers.

The first symptom was seen when building world with GCC 4.6, but the
the offsetof expansion was finally identified as the cause of the
problem while discussion PostgreSQL 9.1 build failures on DragonFly.
Since DragonFly was the only platform exibiting the behavior, the
problem was narrowed down to the offsetof macro or the compiler itself.
Fixing the macro allowed the unpatched pgsql to compile.

In rare cases, the PROG target is intentionally redefined before
including bsd.prog.mk, but when that happens a target redefinition
warning is emitting. This adds a check for a pre-existing $PROG
target before attempting to define it.

It stops warnings from being emitted when loader and loader_tftp
are built.

The internal specs of gcc47 featured an hardcoded standard include
directory which prevented cross-target builds. The same mistake also
caused the "crosstools" compiler in a native build to look at the host
system includes instead of the world_{TARGET}/usr/includes directory.
As a result, the cross-build would break as soon as GCC47 was used to
build its own libraries.

A stage-specific prefix was added to the internal specs directory
definition that restored cross-target building capability.

There was a bootstrap problem with gcc47.
For systems without gcc47 (which is almost all of them), the buildworld
failed on the first gcc47 libraries which require gcc47 to build. The
gnu/lib/gcc47/csu target was duplicated and the makefile was attempting
to build it before gcc47 was installed.