| 10924 | } |
| 10925 | |
| 10926 | static bool |
| 10927 | pmap_pkru_same(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) |
| 10928 | { |
| 10929 | struct pmap_pkru_range *ppr, *prev_ppr; |
| 10930 | vm_offset_t va; |
| 10931 | |
| 10932 | PMAP_LOCK_ASSERT(pmap, MA_OWNED); |
| 10933 | if (pmap->pm_type != PT_X86 || |
| 10934 | (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) == 0 || |
| 10935 | sva >= VM_MAXUSER_ADDRESS) |
| 10936 | return (true); |
| 10937 | MPASS(eva <= VM_MAXUSER_ADDRESS); |
| 10938 | for (va = sva; va < eva; prev_ppr = ppr) { |
| 10939 | ppr = rangeset_lookup(&pmap->pm_pkru, va); |
| 10940 | if (va == sva) |
| 10941 | prev_ppr = ppr; |
| 10942 | else if ((ppr == NULL) ^ (prev_ppr == NULL)) |
| 10943 | return (false); |
| 10944 | if (ppr == NULL) { |
| 10945 | va += PAGE_SIZE; |
| 10946 | continue; |
| 10947 | } |
| 10948 | if (prev_ppr->pkru_keyidx != ppr->pkru_keyidx) |
| 10949 | return (false); |
| 10950 | va = ppr->pkru_rs_el.re_end; |
| 10951 | } |
| 10952 | return (true); |
| 10953 | } |
| 10954 | |
| 10955 | static pt_entry_t |
| 10956 | pmap_pkru_get(pmap_t pmap, vm_offset_t va) |
no test coverage detected