MCPcopy Create free account
hub / github.com/F-Stack/f-stack / pmap_invalidate_range_pcid_cb

Function pmap_invalidate_range_pcid_cb

freebsd/amd64/amd64/pmap.c:3046–3075  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3044#define PMAP_INVLPG_THRESHOLD (4 * 1024 * PAGE_SIZE)
3045
3046static void
3047pmap_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
3077static void
3078pmap_invalidate_range_pcid_invpcid_cb(pmap_t pmap, vm_offset_t sva,

Calls 1

invpcidFunction · 0.85

Tested by

no test coverage detected