| 7736 | } |
| 7737 | |
| 7738 | int |
| 7739 | pmap_vmspace_copy(pmap_t dst_pmap, pmap_t src_pmap) |
| 7740 | { |
| 7741 | int error; |
| 7742 | |
| 7743 | if (dst_pmap->pm_type != src_pmap->pm_type || |
| 7744 | dst_pmap->pm_type != PT_X86 || |
| 7745 | (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) == 0) |
| 7746 | return (0); |
| 7747 | for (;;) { |
| 7748 | if (dst_pmap < src_pmap) { |
| 7749 | PMAP_LOCK(dst_pmap); |
| 7750 | PMAP_LOCK(src_pmap); |
| 7751 | } else { |
| 7752 | PMAP_LOCK(src_pmap); |
| 7753 | PMAP_LOCK(dst_pmap); |
| 7754 | } |
| 7755 | error = pmap_pkru_copy(dst_pmap, src_pmap); |
| 7756 | /* Clean up partial copy on failure due to no memory. */ |
| 7757 | if (error == ENOMEM) |
| 7758 | pmap_pkru_deassign_all(dst_pmap); |
| 7759 | PMAP_UNLOCK(src_pmap); |
| 7760 | PMAP_UNLOCK(dst_pmap); |
| 7761 | if (error != ENOMEM) |
| 7762 | break; |
| 7763 | vm_wait(NULL); |
| 7764 | } |
| 7765 | return (error); |
| 7766 | } |
| 7767 | |
| 7768 | /* |
| 7769 | * Zero the specified hardware page. |
no test coverage detected