瀏覽代碼

arm64: vdso: avoid virt_to_page() translations on kernel symbols

The translation performed by virt_to_page() is only valid for linear
addresses, and kernel symbols are no longer in the linear mapping.
So perform the __pa() translation explicitly, which does the right
thing in either case, and only then translate to a struct page offset.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Ard Biesheuvel 9 年之前
父節點
當前提交
97bbb54e4f
共有 1 個文件被更改,包括 2 次插入2 次删除
  1. 2 2
      arch/arm64/kernel/vdso.c

+ 2 - 2
arch/arm64/kernel/vdso.c

@@ -131,11 +131,11 @@ static int __init vdso_init(void)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	/* Grab the vDSO data page. */
 	/* Grab the vDSO data page. */
-	vdso_pagelist[0] = virt_to_page(vdso_data);
+	vdso_pagelist[0] = pfn_to_page(PHYS_PFN(__pa(vdso_data)));
 
 
 	/* Grab the vDSO code pages. */
 	/* Grab the vDSO code pages. */
 	for (i = 0; i < vdso_pages; i++)
 	for (i = 0; i < vdso_pages; i++)
-		vdso_pagelist[i + 1] = virt_to_page(&vdso_start + i * PAGE_SIZE);
+		vdso_pagelist[i + 1] = pfn_to_page(PHYS_PFN(__pa(&vdso_start)) + i);
 
 
 	/* Populate the special mapping structures */
 	/* Populate the special mapping structures */
 	vdso_spec[0] = (struct vm_special_mapping) {
 	vdso_spec[0] = (struct vm_special_mapping) {