Changeset View
Changeset View
Standalone View
Standalone View
head/sys/arm64/arm64/pmap.c
Show First 20 Lines • Show All 5,804 Lines • ▼ Show 20 Lines | if (ptep != NULL && | ||||
rv = KERN_SUCCESS; | rv = KERN_SUCCESS; | ||||
} | } | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
break; | break; | ||||
case ISS_DATA_DFSC_TF_L0: | case ISS_DATA_DFSC_TF_L0: | ||||
case ISS_DATA_DFSC_TF_L1: | case ISS_DATA_DFSC_TF_L1: | ||||
case ISS_DATA_DFSC_TF_L2: | case ISS_DATA_DFSC_TF_L2: | ||||
case ISS_DATA_DFSC_TF_L3: | case ISS_DATA_DFSC_TF_L3: | ||||
/* | |||||
* Retry the translation. A break-before-make sequence can | |||||
* produce a transient fault. | |||||
*/ | |||||
if (pmap == kernel_pmap) { | |||||
/* | |||||
* The translation fault may have occurred within a | |||||
* critical section. Therefore, we must check the | |||||
* address without acquiring the kernel pmap's lock. | |||||
*/ | |||||
if (pmap_kextract(far) != 0) | |||||
rv = KERN_SUCCESS; | |||||
} else { | |||||
PMAP_LOCK(pmap); | PMAP_LOCK(pmap); | ||||
/* Ask the MMU to check the address */ | /* Ask the MMU to check the address. */ | ||||
intr = intr_disable(); | intr = intr_disable(); | ||||
if (pmap == kernel_pmap) | |||||
par = arm64_address_translate_s1e1r(far); | |||||
else | |||||
par = arm64_address_translate_s1e0r(far); | par = arm64_address_translate_s1e0r(far); | ||||
intr_restore(intr); | intr_restore(intr); | ||||
PMAP_UNLOCK(pmap); | PMAP_UNLOCK(pmap); | ||||
/* | /* | ||||
* If the translation was successful the address was invalid | * If the translation was successful, then we can | ||||
* due to a break-before-make sequence. We can unlock and | |||||
* return success to the trap handler. | * return success to the trap handler. | ||||
*/ | */ | ||||
if (PAR_SUCCESS(par)) | if (PAR_SUCCESS(par)) | ||||
rv = KERN_SUCCESS; | rv = KERN_SUCCESS; | ||||
} | |||||
break; | break; | ||||
} | } | ||||
return (rv); | return (rv); | ||||
} | } | ||||
/* | /* | ||||
* Increase the starting virtual address of the given mapping if a | * Increase the starting virtual address of the given mapping if a | ||||
▲ Show 20 Lines • Show All 104 Lines • Show Last 20 Lines |