On the 4/4 i386, copyout(9) may need to call pmap_extract_and_hold() on arbitrary userspace mapping. If the mapping is backed by the non-managed cdev pager or by the sg pager, on dense configs we might access arbitrary element of vm_page_array[], in particular, not corresponding to a page from the memory segment. Initialize such pages as fictitious with the corresponding physical address.
Also, if the address falls out of the vm_page_array[] boundaries, PHYS_TO_VM_PAGE() returns NULL, which should be handled by pmap_extract_and_hold().
N.B. More elegant and probably reasonable patch would only touch uninitialized gaps in the vm_page_array[], then i386 ifdef can be removed, but I do not see an easy way to enumerate gaps.