| 3044 | #define PMAP_INVLPG_THRESHOLD (4 * 1024 * PAGE_SIZE) |
| 3045 | |
| 3046 | static void |
| 3047 | pmap_invalidate_range_pcid_cb(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, |
| 3048 | const bool invpcid_works1) |
| 3049 | { |
| 3050 | struct invpcid_descr d; |
| 3051 | uint64_t kcr3, ucr3; |
| 3052 | uint32_t pcid; |
| 3053 | u_int cpuid; |
| 3054 | |
| 3055 | CRITICAL_ASSERT(curthread); |
| 3056 | |
| 3057 | if (pmap != PCPU_GET(curpmap) || |
| 3058 | pmap->pm_ucr3 == PMAP_NO_CR3 || |
| 3059 | PCPU_GET(ucr3_load_mask) != PMAP_UCR3_NOMASK) |
| 3060 | return; |
| 3061 | |
| 3062 | cpuid = PCPU_GET(cpuid); |
| 3063 | |
| 3064 | pcid = pmap->pm_pcids[cpuid].pm_pcid; |
| 3065 | if (invpcid_works1) { |
| 3066 | d.pcid = pcid | PMAP_PCID_USER_PT; |
| 3067 | d.pad = 0; |
| 3068 | for (d.addr = sva; d.addr < eva; d.addr += PAGE_SIZE) |
| 3069 | invpcid(&d, INVPCID_ADDR); |
| 3070 | } else { |
| 3071 | kcr3 = pmap->pm_cr3 | pcid | CR3_PCID_SAVE; |
| 3072 | ucr3 = pmap->pm_ucr3 | pcid | PMAP_PCID_USER_PT | CR3_PCID_SAVE; |
| 3073 | pmap_pti_pcid_invlrng(ucr3, kcr3, sva, eva); |
| 3074 | } |
| 3075 | } |
| 3076 | |
| 3077 | static void |
| 3078 | pmap_invalidate_range_pcid_invpcid_cb(pmap_t pmap, vm_offset_t sva, |
no test coverage detected