Implement nearly all the remaining items required to allow the virtual kernel
to actually execute code on behalf of a virtualized user process. The
virtual kernel is now able to execute the init binary through to the point
where it sets up a TLS segment.
* Create a pseudo tf_trapno called T_SYSCALL80 to indicate system call traps.
* Add MD shims when creating or destroying a struct vmspace, allowing the
virtual kernel to create and destroy real-kernel vmspaces along with.
Add appropriate calls to vmspace_mmap() and vmspace_mcontrol() to map
memory inside the user process vmspace. The memory is mapped VPAGETABLE
and the page table directory is set to point to the pmap page directory.
* Clean up user_trap, handle T_PAGEFLT properly.
* Implement go_user(). It calls vmspace_ctl(... VMSPACE_CTL_RUN) and
user_trap() in a loop, allowing the virtual kernel to 'run' a user
mode context under its control.
* Reduce VM_MAX_USER_ADDRESS to 0xb8000000 for now, until I figure out the
best way to have the virtual kernel query the actual max user address from
the real kernel.
* Correct a pm_pdirpte assignment. We can't look up the PTE until after
we have entered it into the kernel pmap.