From patchwork Thu Apr 20 15:12:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 97827 Delivered-To: patch@linaro.org Received: by 10.140.109.52 with SMTP id k49csp846193qgf; Thu, 20 Apr 2017 08:14:41 -0700 (PDT) X-Received: by 10.157.36.4 with SMTP id p4mr4891545ota.267.1492701281450; Thu, 20 Apr 2017 08:14:41 -0700 (PDT) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id y11si3467486otd.309.2017.04.20.08.14.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Apr 2017 08:14:41 -0700 (PDT) Received-SPF: neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) smtp.mailfrom=xen-devel-bounces@lists.xen.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d1DlE-00053x-3U; Thu, 20 Apr 2017 15:12:44 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d1DlD-00053H-30 for xen-devel@lists.xen.org; Thu, 20 Apr 2017 15:12:43 +0000 Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id 6B/55-01870-AEFC8F85; Thu, 20 Apr 2017 15:12:42 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrELMWRWlGSWpSXmKPExsVysyfVTffl+R8 RBp/nqlss+biYxYHR4+ju30wBjFGsmXlJ+RUJrBknvn1gKfjmWnFrdh9zA+NEqy5GLg4hgc2M Eu/fzmKCcE4zSsy4u5i1i5GTg01AU+LO509MILaIgLTEtc+XGUFsZgEHiTcf77GA2MICIRI3G 2aA1bAIqEpsvviTGcTmFbCU2DZhHliNhIC8xK62i2AzOQWsJHruQMwUAqrpm7aZaQIj9wJGhl WM6sWpRWWpRboWeklFmekZJbmJmTm6hgbGermpxcWJ6ak5iUnFesn5uZsYgf5lAIIdjBfanQ8 xSnIwKYnyqs39ESHEl5SfUpmRWJwRX1Sak1p8iFGGg0NJgvfFOaCcYFFqempFWmYOMNBg0hIc PEoivKdB0rzFBYm5xZnpEKlTjLoc7zb/fs8kxJKXn5cqJc77BKRIAKQoozQPbgQs6C8xykoJ8 zICHSXEU5BalJtZgir/ilGcg1FJmFcKGENCPJl5JXCbXgEdwQR0xFk/sCNKEhFSUg2Mx8Pqck 7Z1fZyptdU//fu952d8fbumca3sZzbpTfyzHqd8TKrxvMxb/Sy+TlTBVuXX1I3P9x7THflizu fV29Zz9SjZXj9E//vawvXv/xTarG678K5HXfcRfL5axvOiPlE1M0KfHJfVnuV3MdZJ7bKyM/Y Vf201E9BX6dnj9mZU5EBNY2Bn7WvKrEUZyQaajEXFScCAH+9IaB1AgAA X-Env-Sender: julien.grall@arm.com X-Msg-Ref: server-5.tower-31.messagelabs.com!1492701160!93368592!1 X-Originating-IP: [217.140.101.70] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.4.12; banners=-,-,- X-VirusChecked: Checked Received: (qmail 15566 invoked from network); 20 Apr 2017 15:12:41 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-5.tower-31.messagelabs.com with SMTP; 20 Apr 2017 15:12:41 -0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A8B1415A2; Thu, 20 Apr 2017 08:12:40 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.206.53]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 15B0A3F4FF; Thu, 20 Apr 2017 08:12:39 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xen.org Date: Thu, 20 Apr 2017 16:12:28 +0100 Message-Id: <20170420151228.19158-6-julien.grall@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170420151228.19158-1-julien.grall@arm.com> References: <20170420151228.19158-1-julien.grall@arm.com> Cc: Julien Grall , sstabellini@kernel.org Subject: [Xen-devel] [PATCH v2 for-4.9 5/5] xen/arm: Properly map the FDT in the boot page table X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" Currently, Xen is assuming the FDT will always fit in a 2MB section. Recently, I noticed an early crash on Xen when using GRUB with the following call trace: (XEN) Hypervisor Trap. HSR=0x96000006 EC=0x25 IL=1 Syndrome=0x6 (XEN) CPU0: Unexpected Trap: Hypervisor (XEN) ----[ Xen-4.9-unstable arm64 debug=y Not tainted ]---- (XEN) CPU: 0 (XEN) PC: 0000000000264140 strlen+0x10/0x84 (XEN) LR: 00000000002401c0 (XEN) SP: 00000000002cfc20 (XEN) CPSR: 400003c9 MODE:64-bit EL2h (Hypervisor, handler) (XEN) X0: 0000000000801230 X1: 0000000000801230 X2: 0000000000005230 (XEN) X3: 0000000000000030 X4: 0000000000000030 X5: 0000000000000038 (XEN) X6: 0000000000000034 X7: 0000000000000000 X8: 7f7f7f7f7f7f7f7f (XEN) X9: 64622c6479687222 X10: 7f7f7f7f7f7f7f7f X11: 0101010101010101 (XEN) X12: 0000000000000030 X13: ffffff00ff000000 X14: 0800000003000000 (XEN) X15: ffffffffffffffff X16: 00000000fefff610 X17: 00000000000000f0 (XEN) X18: 0000000000000004 X19: 0000000000000008 X20: 00000000007fc040 (XEN) X21: 00000000007fc000 X22: 000000000000000e X23: 0000000000000000 (XEN) X24: 00000000002a9f58 X25: 0000000000801230 X26: 00000000002a9f68 (XEN) X27: 00000000002a9f58 X28: 0000000000298910 FP: 00000000002cfc20 (XEN) (XEN) VTCR_EL2: 80010c40 (XEN) VTTBR_EL2: 0000082800203000 (XEN) (XEN) SCTLR_EL2: 30c5183d (XEN) HCR_EL2: 000000000038663f (XEN) TTBR0_EL2: 00000000f4912000 (XEN) (XEN) ESR_EL2: 96000006 (XEN) HPFAR_EL2: 00000000e8071000 (XEN) FAR_EL2: 0000000000801230 (XEN) (XEN) Xen stack trace from sp=00000000002cfc20: (XEN) 00000000002cfc70 0000000000240254 00000000002a9f58 00000000007fc000 (XEN) 0000000000000000 0000000000000000 0000000000000000 00000000007fc03c (XEN) 00000000002cfd78 0000000000000000 00000000002cfca0 00000000002986fc (XEN) 0000000000000000 00000000007fc000 0000000000000000 0000000000000000 (XEN) 00000000002cfcc0 0000000000298f1c 0000000000000000 00000000007fc000 (XEN) 00000000002cfdc0 000000000029904c 00000000f47fc000 00000000f4604000 (XEN) 00000000f47fc000 00000000007fc000 0000000000400000 0000000000000100 (XEN) 00000000f4604000 0000000000000001 0000000000000001 8000000000000002 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 00000000002cfdc0 0000000000299038 (XEN) 00000000f47fc000 00000000f4604000 00000000f47fc000 0000000000000000 (XEN) 00000000002cfe20 000000000029c420 00000000002d8000 00000000f4604000 (XEN) 00000000f47fc000 0000000000000000 0000000000400000 0000000000000100 (XEN) 00000000f4604000 0000000000000001 00000000f47fc000 000000000029c404 (XEN) 00000000fefff510 0000000000200624 00000000f4804000 00000000f4604000 (XEN) 00000000f47fc000 0000000000000000 0000000000400000 0000000000000100 (XEN) 0000000000000001 0000000000000001 0000000000000001 8000000000000002 (XEN) 00000000f47fc000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) 0000000000000000 0000000000000000 0000000000000000 0000000000000000 (XEN) Xen call trace: (XEN) [<0000000000264140>] strlen+0x10/0x84 (PC) (XEN) [<00000000002401c0>] fdt_get_property_namelen+0x9c/0xf0 (LR) (XEN) [<0000000000240254>] fdt_get_property+0x40/0x50 (XEN) [<00000000002986fc>] bootfdt.c#device_tree_get_u32+0x18/0x5c (XEN) [<0000000000298f1c>] device_tree_for_each_node+0x84/0x144 (XEN) [<000000000029904c>] boot_fdt_info+0x70/0x23c (XEN) [<000000000029c420>] start_xen+0x9c/0xd30 (XEN) [<0000000000200624>] arm64/head.o#paging+0x84/0xbc (XEN) (XEN) (XEN) **************************************** (XEN) Panic on CPU 0: (XEN) CPU0: Unexpected Trap: Hypervisor (XEN) (XEN) **************************************** Indeed, the booting documentation for AArch32 and AArch64 only requires the FDT to be placed on a 8-byte boundary. This means the Device-Tree can cross a 2MB boundary. Given that Xen limits the size of the FDT to 2MB, it will always fit in a 4MB slot. So extend the fixmap slot for FDT from 2MB to 4MB. The second 2MB superpage will only be mapped if the FDT is cross the 2MB boundary. Signed-off-by: Julien Grall --- Changes in v2: - Remove correctly the second early mapings --- xen/arch/arm/mm.c | 17 +++++++++++++++-- xen/include/asm-arm/config.h | 14 +++++++------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index f598396994..48f74f6e65 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -478,6 +478,7 @@ void * __init early_fdt_map(paddr_t fdt_paddr) paddr_t base_paddr = fdt_paddr & SECOND_MASK; paddr_t offset; void *fdt_virt; + uint32_t size; /* * Check whether the physical FDT address is set and meets the minimum @@ -502,9 +503,17 @@ void * __init early_fdt_map(paddr_t fdt_paddr) if ( fdt_magic(fdt_virt) != FDT_MAGIC ) return NULL; - if ( fdt_totalsize(fdt_virt) > MAX_FDT_SIZE ) + size = fdt_totalsize(fdt_virt); + if ( size > MAX_FDT_SIZE ) return NULL; + if ( (offset + size) > SZ_2M ) + { + create_mappings(boot_second, BOOT_FDT_VIRT_START + SZ_2M, + paddr_to_pfn(base_paddr + SZ_2M), + SZ_2M >> PAGE_SHIFT, SZ_2M); + } + return fdt_virt; } @@ -512,7 +521,9 @@ void __init remove_early_mappings(void) { lpae_t pte = {0}; write_pte(xen_second + second_table_offset(BOOT_FDT_VIRT_START), pte); - flush_xen_data_tlb_range_va(BOOT_FDT_VIRT_START, SECOND_SIZE); + write_pte(xen_second + second_table_offset(BOOT_FDT_VIRT_START + SZ_2M), + pte); + flush_xen_data_tlb_range_va(BOOT_FDT_VIRT_START, BOOT_FDT_SLOT_SIZE); } extern void relocate_xen(uint64_t ttbr, void *src, void *dst, size_t len); @@ -571,6 +582,8 @@ void __init setup_pagetables(unsigned long boot_phys_offset, paddr_t xen_paddr) /* ... DTB */ pte = boot_second[second_table_offset(BOOT_FDT_VIRT_START)]; xen_second[second_table_offset(BOOT_FDT_VIRT_START)] = pte; + pte = boot_second[second_table_offset(BOOT_FDT_VIRT_START + SZ_2M)]; + xen_second[second_table_offset(BOOT_FDT_VIRT_START + SZ_2M)] = pte; /* ... Boot Misc area for xen relocation */ dest_va = BOOT_RELOC_VIRT_START; diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h index 9c14a385e7..5b6f3c985d 100644 --- a/xen/include/asm-arm/config.h +++ b/xen/include/asm-arm/config.h @@ -77,12 +77,12 @@ * 0 - 2M Unmapped * 2M - 4M Xen text, data, bss * 4M - 6M Fixmap: special-purpose 4K mapping slots - * 6M - 8M Early boot mapping of FDT - * 8M - 10M Early relocation address (used when relocating Xen) + * 6M - 10M Early boot mapping of FDT + * 10M - 12M Early relocation address (used when relocating Xen) * and later for livepatch vmap (if compiled in) * * ARM32 layout: - * 0 - 10M + * 0 - 12M * * 32M - 128M Frametable: 24 bytes per page for 16GB of RAM * 256M - 1G VMAP: ioremap and early_ioremap use this virtual address @@ -93,7 +93,7 @@ * * ARM64 layout: * 0x0000000000000000 - 0x0000007fffffffff (512GB, L0 slot [0]) - * 0 - 10M + * 0 - 12M * * 1G - 2G VMAP: ioremap and early_ioremap * @@ -113,12 +113,12 @@ #define FIXMAP_ADDR(n) (_AT(vaddr_t,0x00400000) + (n) * PAGE_SIZE) #define BOOT_FDT_VIRT_START _AT(vaddr_t,0x00600000) -#define BOOT_FDT_SLOT_SIZE MB(2) +#define BOOT_FDT_SLOT_SIZE MB(4) #define BOOT_FDT_VIRT_END (BOOT_FDT_VIRT_START + BOOT_FDT_SLOT_SIZE) -#define BOOT_RELOC_VIRT_START _AT(vaddr_t,0x00800000) +#define BOOT_RELOC_VIRT_START _AT(vaddr_t,0x00a00000) #ifdef CONFIG_LIVEPATCH -#define LIVEPATCH_VMAP_START _AT(vaddr_t,0x00800000) +#define LIVEPATCH_VMAP_START _AT(vaddr_t,0x00a00000) #define LIVEPATCH_VMAP_END (LIVEPATCH_VMAP_START + MB(2)) #endif