diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2019-10-23 12:02:47 +0200 | 
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2019-10-23 12:10:05 +0200 | 
| commit | 2e79e22e092acd55da0b2db066e4826d7d152c41 (patch) | |
| tree | e7ec9782c0b7831c511af711424126a2b9a4eb07 /arch/arm64/mm/fault.c | |
| parent | f1b4a9217efd61d0b84c6dc404596c8519ff6f59 (diff) | |
| parent | 7d194c2100ad2a6dded545887d02754948ca5241 (diff) | |
Merge v5.4-rc4 into drm-next
Thierry needs fd70c7755bf0 ("drm/bridge: tc358767: fix max_tu_symbol
value") to be able to merge his dp_link patch series.
Some adjacent changes conflicts, plus some clashes in i915 due to
cherry-picking and git trying to be helpful and leaving both versions
in.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'arch/arm64/mm/fault.c')
| -rw-r--r-- | arch/arm64/mm/fault.c | 19 | 
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 115d7a0e4b08..9fc6db0bcbad 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -113,6 +113,15 @@ static inline bool is_ttbr1_addr(unsigned long addr)  	return arch_kasan_reset_tag(addr) >= PAGE_OFFSET;  } +static inline unsigned long mm_to_pgd_phys(struct mm_struct *mm) +{ +	/* Either init_pg_dir or swapper_pg_dir */ +	if (mm == &init_mm) +		return __pa_symbol(mm->pgd); + +	return (unsigned long)virt_to_phys(mm->pgd); +} +  /*   * Dump out the page tables associated with 'addr' in the currently active mm.   */ @@ -141,7 +150,7 @@ static void show_pte(unsigned long addr)  	pr_alert("%s pgtable: %luk pages, %llu-bit VAs, pgdp=%016lx\n",  		 mm == &init_mm ? "swapper" : "user", PAGE_SIZE / SZ_1K, -		 vabits_actual, (unsigned long)virt_to_phys(mm->pgd)); +		 vabits_actual, mm_to_pgd_phys(mm));  	pgdp = pgd_offset(mm, addr);  	pgd = READ_ONCE(*pgdp);  	pr_alert("[%016lx] pgd=%016llx", addr, pgd_val(pgd)); @@ -259,14 +268,18 @@ static bool __kprobes is_spurious_el1_translation_fault(unsigned long addr,  	par = read_sysreg(par_el1);  	local_irq_restore(flags); +	/* +	 * If we now have a valid translation, treat the translation fault as +	 * spurious. +	 */  	if (!(par & SYS_PAR_EL1_F)) -		return false; +		return true;  	/*  	 * If we got a different type of fault from the AT instruction,  	 * treat the translation fault as spurious.  	 */ -	dfsc = FIELD_PREP(SYS_PAR_EL1_FST, par); +	dfsc = FIELD_GET(SYS_PAR_EL1_FST, par);  	return (dfsc & ESR_ELx_FSC_TYPE) != ESR_ELx_FSC_FAULT;  }  | 
