All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] arm64: mm: phys_mem_access_prot() reports non-kernel memory as device memory
@ 2016-09-05  8:43 James Morse
  2016-09-05  8:43 ` [PATCH] arm64: Drop generic xlate_dev_mem_{k,}ptr() James Morse
  2016-09-05 10:35 ` [PATCH] arm64: mm: phys_mem_access_prot() reports non-kernel memory as device memory Will Deacon
  0 siblings, 2 replies; 10+ messages in thread
From: James Morse @ 2016-09-05  8:43 UTC (permalink / raw)
  To: linux-arm-kernel

Running 'acpidump' on an arm64 system causes the program to SIGSEGV, and
yield the following trace:
[   71.623572] acpidump[2159]: unhandled alignment fault (11) at 0xffff8a4a909c, esr 0x92000021
[   71.632030] pgd = ffff8003ecf7d000
[   71.635420] [ffff8a4a909c] *pgd=00000083ec370003, *pud=00000083e7225003, *pmd=00000083ec3f1003, *pte=01600083ff1c3fc3
[   71.646042]
[   71.647524] CPU: 0 PID: 2159 Comm: acpidump Tainted: G        W I     4.8.0-rc4 #5081
[   71.655352] Hardware name: AMD Overdrive/Supercharger/Default string, BIOS ROD1002C 04/08/2016
[   71.663957] task: ffff8003eac41900 task.stack: ffff8003e7210000
[   71.669871] PC is at 0xffff8a3c77d4
[   71.673353] LR is at 0x404934
[   71.676314] pc : [<0000ffff8a3c77d4>] lr : [<0000000000404934>] pstate: 00000000
[   71.683702] sp : 0000ffffd0e39af0

Acpidump digs through /sys/ to find the physical address of the ACPI tables,
then reads them from /dev/mem. The code that provides /dev/mem uses
phys_mem_access_prot() to determine the protection type it should use.

Arm64's phys_mem_access_prot() reports any memory region that isn't part
of the linear map as device memory. This breaks Acpidump as the acpi tables
are neither device memory nor part of the linear map.

Change this check to use memblock_is_memory() instead. On an EFI system
any region the efi memory map described as any of WB/WC/WT appears in
memblock.memory. On a non-EFI system, setup_machine_fdt() will cause
memory nodes in the DT to be added to memblock.memory.

/dev/mem is the only user of phys_mem_access_prot()

Reported-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: James Morse <james.morse@arm.com>
---
Stable?
Acpi was introduced for v4.1 but hidden behind 'expert'.
'expert' was removed for v4.7.

 arch/arm64/mm/mmu.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index 4989948d1feb..96a2f327fd2c 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -63,7 +63,7 @@ static pud_t bm_pud[PTRS_PER_PUD] __page_aligned_bss __maybe_unused;
 pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
 			      unsigned long size, pgprot_t vma_prot)
 {
-	if (!pfn_valid(pfn))
+	if (!memblock_is_memory(pfn << PAGE_SHIFT))
 		return pgprot_noncached(vma_prot);
 	else if (file->f_flags & O_SYNC)
 		return pgprot_writecombine(vma_prot);
-- 
2.8.0.rc3

^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2016-09-05 14:52 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-05  8:43 [PATCH] arm64: mm: phys_mem_access_prot() reports non-kernel memory as device memory James Morse
2016-09-05  8:43 ` [PATCH] arm64: Drop generic xlate_dev_mem_{k,}ptr() James Morse
2016-09-05 10:35 ` [PATCH] arm64: mm: phys_mem_access_prot() reports non-kernel memory as device memory Will Deacon
2016-09-05 13:03   ` James Morse
2016-09-05 13:10     ` Ard Biesheuvel
2016-09-05 13:24       ` Will Deacon
2016-09-05 13:41         ` Ard Biesheuvel
2016-09-05 14:36           ` Leif Lindholm
2016-09-05 14:42           ` Will Deacon
2016-09-05 14:52             ` Ard Biesheuvel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.