|
@@ -507,13 +507,22 @@ static inline int pte_file(pte_t pte)
|
|
*/
|
|
*/
|
|
static inline void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte)
|
|
static inline void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte)
|
|
{
|
|
{
|
|
|
|
+ struct mm_struct *mm;
|
|
unsigned long ampr;
|
|
unsigned long ampr;
|
|
- pgd_t *pge = pgd_offset(current->mm, address);
|
|
|
|
- pud_t *pue = pud_offset(pge, address);
|
|
|
|
- pmd_t *pme = pmd_offset(pue, address);
|
|
|
|
|
|
|
|
- ampr = pme->ste[0] & 0xffffff00;
|
|
|
|
- ampr |= xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C | xAMPRx_V;
|
|
|
|
|
|
+ mm = current->mm;
|
|
|
|
+ if (mm) {
|
|
|
|
+ pgd_t *pge = pgd_offset(mm, address);
|
|
|
|
+ pud_t *pue = pud_offset(pge, address);
|
|
|
|
+ pmd_t *pme = pmd_offset(pue, address);
|
|
|
|
+
|
|
|
|
+ ampr = pme->ste[0] & 0xffffff00;
|
|
|
|
+ ampr |= xAMPRx_L | xAMPRx_SS_16Kb | xAMPRx_S | xAMPRx_C |
|
|
|
|
+ xAMPRx_V;
|
|
|
|
+ } else {
|
|
|
|
+ address = ULONG_MAX;
|
|
|
|
+ ampr = 0;
|
|
|
|
+ }
|
|
|
|
|
|
asm volatile("movgs %0,scr0\n"
|
|
asm volatile("movgs %0,scr0\n"
|
|
"movgs %0,scr1\n"
|
|
"movgs %0,scr1\n"
|