| 10880 | } |
| 10881 | |
| 10882 | static int |
| 10883 | pmap_pkru_assign(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, u_int keyidx, |
| 10884 | int flags) |
| 10885 | { |
| 10886 | struct pmap_pkru_range *ppr; |
| 10887 | int error; |
| 10888 | |
| 10889 | PMAP_LOCK_ASSERT(pmap, MA_OWNED); |
| 10890 | MPASS(pmap->pm_type == PT_X86); |
| 10891 | MPASS((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0); |
| 10892 | if ((flags & AMD64_PKRU_EXCL) != 0 && |
| 10893 | !rangeset_check_empty(&pmap->pm_pkru, sva, eva)) |
| 10894 | return (EBUSY); |
| 10895 | ppr = uma_zalloc(pmap_pkru_ranges_zone, M_NOWAIT); |
| 10896 | if (ppr == NULL) |
| 10897 | return (ENOMEM); |
| 10898 | ppr->pkru_keyidx = keyidx; |
| 10899 | ppr->pkru_flags = flags & AMD64_PKRU_PERSIST; |
| 10900 | error = rangeset_insert(&pmap->pm_pkru, sva, eva, ppr); |
| 10901 | if (error != 0) |
| 10902 | uma_zfree(pmap_pkru_ranges_zone, ppr); |
| 10903 | return (error); |
| 10904 | } |
| 10905 | |
| 10906 | static int |
| 10907 | pmap_pkru_deassign(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) |
no test coverage detected