From patchwork Fri Jul 18 16:12:56 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Campbell X-Patchwork-Id: 33880 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ie0-f198.google.com (mail-ie0-f198.google.com [209.85.223.198]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 9EA9E20CA0 for ; Fri, 18 Jul 2014 16:15:13 +0000 (UTC) Received: by mail-ie0-f198.google.com with SMTP id rl12sf34929248iec.1 for ; Fri, 18 Jul 2014 09:15:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:in-reply-to :references:mime-version:cc:subject:precedence:list-id :list-unsubscribe:list-post:list-help:list-subscribe:sender :errors-to:x-original-sender:x-original-authentication-results :mailing-list:list-archive:content-type:content-transfer-encoding; bh=SxXIjX86PzGSOwvDxuVN6G4VIhhNV6jXfa6qr0XhVFg=; b=LZ05FaKZBIHZomXvwqFDVfNl8LyiDBtHXjdK9mippkxBIS8fAwErPL6ytQd61yQ0Ir fOA+vKKDhquGBe4hmCi1W3Rf0Fr7VGTDaWKP2rlx7jQ4H1QjWM7H7eExr8ZfqbjvtGp8 QdulYlGPgR8g32TWqKs9p7/IDQheKoIUsn7JpF4uP691JGmBjKmBOdLkAqZ1e25z3/kZ zVyalFKqISzOmVZGDnRECvbMRgbpP69LtdhtS8Gj0/F2ZXGBB27mksKWPDK4YodtIlVo 6/12YBTuD2TeM58z+8OtO3Iw8wDVLAJt7VjukpPMttqNGMk9hHF6kalaDPulpuWAuKqZ WExA== X-Gm-Message-State: ALoCoQmF6Wwb2ouvvTloInd/90K5g3V1qQYYDlPMYeZo/HE4travUYa7D1wB9Nh7DDAWnVZRRbQF X-Received: by 10.50.117.10 with SMTP id ka10mr2439483igb.1.1405700113117; Fri, 18 Jul 2014 09:15:13 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.50.239.162 with SMTP id vt2ls398561igc.19.gmail; Fri, 18 Jul 2014 09:15:12 -0700 (PDT) X-Received: by 10.66.102.73 with SMTP id fm9mr6613653pab.72.1405700112856; Fri, 18 Jul 2014 09:15:12 -0700 (PDT) Received: from mail-vc0-f181.google.com (mail-vc0-f181.google.com [209.85.220.181]) by mx.google.com with ESMTPS id cj9si6248243veb.86.2014.07.18.09.15.09 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 18 Jul 2014 09:15:09 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.181 as permitted sender) client-ip=209.85.220.181; Received: by mail-vc0-f181.google.com with SMTP id lf12so7532308vcb.26 for ; Fri, 18 Jul 2014 09:15:09 -0700 (PDT) X-Received: by 10.52.248.146 with SMTP id ym18mr6330509vdc.8.1405700109028; Fri, 18 Jul 2014 09:15:09 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.37.5 with SMTP id tc5csp24005vcb; Fri, 18 Jul 2014 09:15:08 -0700 (PDT) X-Received: by 10.194.200.229 with SMTP id jv5mr8350473wjc.90.1405700107745; Fri, 18 Jul 2014 09:15:07 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id do8si4702194wib.62.2014.07.18.09.15.07 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 18 Jul 2014 09:15:07 -0700 (PDT) Received-SPF: none (google.com: xen-devel-bounces@lists.xen.org does not designate permitted sender hosts) client-ip=50.57.142.19; Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1X8AmQ-00065h-30; Fri, 18 Jul 2014 16:13:06 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1X8AmO-00065B-MK for xen-devel@lists.xen.org; Fri, 18 Jul 2014 16:13:04 +0000 Received: from [193.109.254.147:5912] by server-5.bemta-14.messagelabs.com id 3C/B3-28255-09749C35; Fri, 18 Jul 2014 16:13:04 +0000 X-Env-Sender: Ian.Campbell@citrix.com X-Msg-Ref: server-10.tower-27.messagelabs.com!1405699981!18238168!1 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n X-StarScan-Received: X-StarScan-Version: 6.11.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 18704 invoked from network); 18 Jul 2014 16:13:03 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP; 18 Jul 2014 16:13:03 -0000 X-IronPort-AV: E=Sophos;i="5.01,686,1400025600"; d="scan'208";a="154145233" Received: from accessns.citrite.net (HELO FTLPEX01CL01.citrite.net) ([10.9.154.239]) by FTLPIPO02.CITRIX.COM with ESMTP; 18 Jul 2014 16:13:02 +0000 Received: from ukmail1.uk.xensource.com (10.80.16.128) by smtprelay.citrix.com (10.13.107.78) with Microsoft SMTP Server id 14.3.181.6; Fri, 18 Jul 2014 12:13:00 -0400 Received: from drall.uk.xensource.com ([10.80.16.71]) by ukmail1.uk.xensource.com with smtp (Exim 4.69) (envelope-from ) id 1X8AmJ-0004Uz-HA; Fri, 18 Jul 2014 17:13:00 +0100 Received: by drall.uk.xensource.com (sSMTP sendmail emulation); Fri, 18 Jul 2014 17:12:59 +0100 From: Ian Campbell To: Date: Fri, 18 Jul 2014 17:12:56 +0100 Message-ID: <1405699976-9260-4-git-send-email-ian.campbell@citrix.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1405699976-9260-1-git-send-email-ian.campbell@citrix.com> References: <1405699899.6419.7.camel@kazak.uk.xensource.com> <1405699976-9260-1-git-send-email-ian.campbell@citrix.com> MIME-Version: 1.0 X-DLP: MIA2 Cc: julien.grall@linaro.org, tim@xen.org, Ian Campbell , stefano.stabellini@eu.citrix.com Subject: [Xen-devel] [PATCH v2 4/4] xen: arm: avoid unnecessary additional mappings in boot page tables. X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Post: , List-Help: , List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: ian.campbell@citrix.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.181 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Archive: If the identity map is created at one level then avoid creating entries further down the boot page tables, since these will be aliases at strange virtual address. For example consider an arm32 system (for simplicity) with Xen loaded at address 0x40402000. As a virtual address this corresponds to walking offsets 1, 2 and 2 at the first, second and third levels respectively. When creating the identity map we will therefore create a 1GB super mapping at 0x40000000 for the identity map, which is the one we want to use. However when considering the second level we will see the offset 2 and create a 2MB mapping in slot 2 of boot_second. Since boot_second is mapped in slot 0 of boot_first this corresponds to an unwanted mapping from virtual address 0x00400000 to physical address 0x40400000. We still do not handle the case where the load address is within the 2MB range starting just after XEN_VIRT_START. This is not a regression but this patch tries to provide a more useful diagnostic message. We do handle loading at exactly XEN_VIRT_START. Signed-off-by: Ian Campbell Acked-by: Julien Grall --- v2: Expanded on commit message. Handle/accept being loaded at exactly 2M --- xen/arch/arm/arm32/head.S | 20 +++++++++++++++++--- xen/arch/arm/arm64/head.S | 19 ++++++++++++++++--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S index 0a76c2e..caf7934 100644 --- a/xen/arch/arm/arm32/head.S +++ b/xen/arch/arm/arm32/head.S @@ -45,7 +45,7 @@ * r3 - * r4 - * r5 - - * r6 - + * r6 - identity map in place * r7 - CPUID * r8 - DTB address (boot CPU only) * r9 - paddr(start) @@ -250,6 +250,14 @@ cpu_init_done: * mapping. So each CPU must rebuild the page tables here with * the 1:1 in place. */ + /* If Xen is loaded at exactly XEN_VIRT_START then we don't + * need an additional 1:1 mapping, the virtual mapping will + * suffice. + */ + cmp r9, #XEN_VIRT_START + moveq r6, #1 /* r6 := identity map now in place */ + movne r6, #0 /* r6 := identity map not yet in place */ + /* Write Xen's PT's paddr into the HTTBR */ ldr r4, =boot_pgtable add r4, r4, r10 /* r4 := paddr (boot_pagetable) */ @@ -275,6 +283,7 @@ cpu_init_done: orr r2, r2, #PT_LOWER(MEM) lsl r1, r1, #3 /* r1 := Slot offset */ strd r2, r3, [r4, r1] /* Mapping of paddr(start) */ + mov r6, #1 /* r6 := identity map now in place */ 1: /* Setup boot_second: */ ldr r4, =boot_second @@ -290,6 +299,8 @@ cpu_init_done: strd r2, r3, [r4, #8] /* Map it in slot 1 */ /* ... map of paddr(start) in boot_second */ + cmp r6, #1 /* r6 is set if already created */ + beq 1f lsr r2, r9, #SECOND_SHIFT /* Offset of base paddr in boot_second */ mov r3, #0x0ff /* r2 := LPAE entries mask */ orr r3, r3, #0x100 @@ -303,6 +314,7 @@ cpu_init_done: mov r3, #0x0 lsl r1, r1, #3 /* r1 := Slot offset */ strd r2, r3, [r4, r1] /* Mapping of paddr(start) */ + mov r6, #1 /* r6 := identity map now in place */ /* Setup boot_third: */ 1: ldr r4, =boot_third @@ -327,8 +339,10 @@ cpu_init_done: /* boot pagetable setup complete */ - b 1f - + cmp r6, #1 /* Did we manage to create an identity mapping ? */ + beq 1f + PRINT("Unable to build boot page tables - Failed to identity map Xen.\r\n") + b fail virtphys_clash: /* Identity map clashes with boot_third, which we cannot handle yet */ PRINT("Unable to build boot page tables - virt and phys addresses clash.\r\n") diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S index 6ba9d94..f28b74a 100644 --- a/xen/arch/arm/arm64/head.S +++ b/xen/arch/arm/arm64/head.S @@ -62,7 +62,7 @@ * x22 - is_secondary_cpu * x23 - UART address * x24 - cpuid - * x25 - + * x25 - identity map in place * x26 - * x27 - * x28 - @@ -253,6 +253,13 @@ skip_bss: * mapping. So each CPU must rebuild the page tables here with * the 1:1 in place. */ + /* If Xen is loaded at exactly XEN_VIRT_START then we don't + * need an additional 1:1 mapping, the virtual mapping will + * suffice. + */ + cmp x19, #XEN_VIRT_START + cset x25, eq /* x25 := identity map in place, or not */ + /* Write Xen's PT's paddr into TTBR0_EL2 */ ldr x4, =boot_pgtable add x4, x4, x20 /* x4 := paddr (boot_pagetable) */ @@ -293,6 +300,7 @@ skip_bss: and x1, x1, #0x1ff /* x1 := Slot offset */ lsl x1, x1, #3 str x2, [x4, x1] /* Mapping of paddr(start) */ + mov x25, #1 /* x25 := identity map now in place */ 1: /* Setup boot_first: */ ldr x4, =boot_first /* Next level into boot_first */ @@ -306,6 +314,7 @@ skip_bss: str x2, [x4, #0] /* Map it in slot 0 */ /* ... map of paddr(start) in boot_first */ + cbnz x25, 1f /* x25 is set if already created */ lsr x2, x19, #FIRST_SHIFT /* x2 := Offset of base paddr in boot_first */ and x1, x2, #0x1ff /* x1 := Slot to use */ cbz x1, 1f /* It's in slot 0, map in boot_second */ @@ -315,6 +324,7 @@ skip_bss: orr x2, x2, x3 lsl x1, x1, #3 /* x1 := Slot offset */ str x2, [x4, x1] /* Create mapping of paddr(start)*/ + mov x25, #1 /* x25 := identity map now in place */ 1: /* Setup boot_second: */ ldr x4, =boot_second /* Next level into boot_second */ @@ -328,6 +338,7 @@ skip_bss: str x2, [x4, #8] /* Map it in slot 1 */ /* ... map of paddr(start) in boot_second */ + cbnz x25, 1f /* x25 is set if already created */ lsr x2, x19, #SECOND_SHIFT /* x2 := Offset of base paddr in boot_second */ and x1, x2, 0x1ff /* x1 := Slot to use */ cmp x1, #1 @@ -338,6 +349,7 @@ skip_bss: orr x2, x2, x3 lsl x1, x1, #3 /* x1 := Slot offset */ str x2, [x4, x1] /* Create mapping of paddr(start)*/ + mov x25, #1 /* x25 := identity map now in place */ 1: /* Setup boot_third: */ ldr x4, =boot_third @@ -361,8 +373,9 @@ skip_bss: /* boot pagetable setup complete */ - b 1f - + cbnz x25, 1f /* Did we manage to create an identity mapping ? */ + PRINT("Unable to build boot page tables - Failed to identity map Xen.\r\n") + b fail virtphys_clash: /* Identity map clashes with boot_third, which we cannot handle yet */ PRINT("Unable to build boot page tables - virt and phys addresses clash.\r\n")