From patchwork Thu May 19 08:26:01 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alison Wang X-Patchwork-Id: 623898 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 3r9Pt05Dlvz9t3r for ; Thu, 19 May 2016 18:50:48 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=freescale.onmicrosoft.com header.i=@freescale.onmicrosoft.com header.b=rPS4Us20; dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 7671AA752D; Thu, 19 May 2016 10:50:46 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id xvlTgBxHsoFd; Thu, 19 May 2016 10:50:46 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id D1566A74E9; Thu, 19 May 2016 10:50:45 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 259F3A74E9 for ; Thu, 19 May 2016 10:50:41 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 4XcVyXxUu3qS for ; Thu, 19 May 2016 10:50:41 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1bon0116.outbound.protection.outlook.com [157.56.111.116]) by theia.denx.de (Postfix) with ESMTPS id 6EADAA7498 for ; Thu, 19 May 2016 10:50:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freescale.onmicrosoft.com; s=selector1-freescale-com; h=From:To:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=CdUz8k9tUIE08B/pK4ljYrI+QmRqvx8by5EtT66VTso=; b=rPS4Us20FRlVYp9/9S5jHtPG8wGSs2DZMT19/RyvGhhkg/uusRerLWIqeTZcZVL9Dm+J8hsF02ORuV7Qk/rzbdCpbQUynjD5k1/2BWGeSKoA5eLTxnjbtU8pHWtSF/R/p+EdPza0tRQvdLgkhCJO/IEWnqn62FtcJXFEBLNW57E= Received: from BLUPR0301CA0028.namprd03.prod.outlook.com (10.162.113.166) by DM2PR03MB527.namprd03.prod.outlook.com (10.141.87.145) with Microsoft SMTP Server (TLS) id 15.1.497.12; Thu, 19 May 2016 08:36:08 +0000 Received: from BN1BFFO11FD011.protection.gbl (2a01:111:f400:7c10::1:141) by BLUPR0301CA0028.outlook.office365.com (2a01:111:e400:5259::38) with Microsoft SMTP Server (TLS) id 15.1.497.12 via Frontend Transport; Thu, 19 May 2016 08:36:07 +0000 Authentication-Results: spf=neutral (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; nxp.com; dkim=none (message not signed) header.d=none; nxp.com; dmarc=none action=none header.from=freescale.com; Received-SPF: Neutral (protection.outlook.com: 192.88.158.2 is neither permitted nor denied by domain of freescale.com) Received: from az84smr01.freescale.net (192.88.158.2) by BN1BFFO11FD011.mail.protection.outlook.com (10.58.144.74) with Microsoft SMTP Server (TLS) id 15.1.497.8 via Frontend Transport; Thu, 19 May 2016 08:36:07 +0000 Received: from titan.ap.freescale.net ([10.192.208.233]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id u4J8a0xf017744; Thu, 19 May 2016 01:36:04 -0700 From: Alison Wang To: , , , , , Date: Thu, 19 May 2016 16:26:01 +0800 Message-ID: <1463646362-15531-2-git-send-email-b18965@freescale.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1463646362-15531-1-git-send-email-b18965@freescale.com> References: <1463646362-15531-1-git-send-email-b18965@freescale.com> X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:192.88.158.2; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10019020)(979002)(6009001)(2980300002)(199003)(189002)(9170700003)(2906002)(4326007)(586003)(87936001)(8936002)(106466001)(47776003)(189998001)(50466002)(36756003)(575784001)(81166006)(2201001)(92566002)(5003940100001)(5001770100001)(1220700001)(50226002)(105586002)(5008740100001)(19580405001)(50986999)(6806005)(76176999)(104016004)(77096005)(48376002)(19580395003)(2950100001)(229853001)(33646002)(11100500001)(8676002)(7059030)(42262002)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1102; SCL:1; SRVR:DM2PR03MB527; H:az84smr01.freescale.net; FPR:; SPF:Neutral; MLV:ovrnspm; A:1; MX:1; PTR:InfoDomainNonexistent; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD011; 1:DlO7kGovk48KwmdLcmuD1jtho9BLGg1WqG8njSdyQONTtR7JDuNfYfbIJ4UDxA2/GhsYsBBatG0O5GhAeZe/SkDkcZGPYWBntHgj/gJ97kID6sA69YwwQNdIAQyhxe6F9marM13WAqfFekX4dktYHObr804pe+72WMMEimNKQmNbhWc+kne192frUHCfZGrTy0udfq6JyAHB0uVhNm39nXfFrrUn58lPoE/2F2/N10RePE/k1Xx25fZonAVsDBC3fpOV2qV9OAg+CSFU+L7GYFvkJBuCBM4pRAUimkcRRgXyLhrIBm3B0a9SAD4qiSVVlb8QSeBrRwAJ7rsAjVbWVXw72oDeBDLPxdyvyYp4swh+2dlmM3feKEei1mkVwJMhtnQZm6NjGQGiRS/vKxnJaaIde2TJ2r5XDEXXE93oZm9ohnQ2msxgIDh/Z73iUx1i5kfG3PU/p8FWnaAbX3en2g== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 36639078-2af6-447c-0800-08d37fc09fad X-Microsoft-Exchange-Diagnostics: 1; DM2PR03MB527; 2:FP63JgW2OWlBRKWh3eK5OOWPNZZfNDFEdCmmhZbhjNGp4673QmjRWjaYg80ku4vBoM3tvWTWbJ1gqI9dlRinYlK/8I7dGilwkmVH7JVEBzagCTBFIJJkaqQv7rQvPvQ46wpXm8jyG58aFjlg9FTKtp+gPfaR83bVQo8nL7U8REjeXv0kuCqVdfpBasAneTxg; 3:QpTWrEjsnGudR2NKowlE/QnlHlHryD7+N9qAZaEKHq2lYvhHyRF9d/6nh/sWJGfbzMdKSs+EhUt0FGwsM9yvTOuv4AHrfW1EmCyn8kwS3wm2zc70WbPgFe7+6SK9UAI3IwO4dcUFZ4b0g8W6s7k1LBDKvJHzpssKsRSD+Exwq60WM0S4LOjCJf9PpEMVRC7FIVlyeQTLPaT4AAmsNyUpDYDmqho0iuKID6ylkuTbzTU= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM2PR03MB527; X-Microsoft-Exchange-Diagnostics: 1; DM2PR03MB527; 25:/T8EH3ZPzS/l0LW8aOdGkkMrxJQINIMqF4+8JR1TPwUxkIcPInT5steJwl8OhtTPii3A6XOT9qw3Z45sDiHfLfOz92pL5IueT0T6lDBbbgdb3ndvYjyQPvSvagugUCPPVM9zZ1IRN5SKOipl754EPB7MXXJk1+d1cEsbsvAr6IOkEO8AO1BtWhI3KQU3QvyUREmNMQavjW/KFATo2hu3KrAgFybRALaIzudvZffnyd+CPjftHB+FCG0UpEQ+V0Nt8IAGSBAlFBQifOHcywt0SUCVW8Tjij1001H3FG4QCSzHF+fWoK4XiXdG6o6jDlsM1dFBML+WUN3c4EvXVtixJLGSfMy5Jg5dr+QT+bpg4YwqVhvSOg/ZvCbCOLFypP7h+iylyQqNb6BHHySKTjaG7G9m/AloOu9wSP5mTRiC8rBR2Ed4jtmSSI4XAMWZG84MxsAiU0Yp6o1MPKOU0WWASped/AFjrW9yd6dIheXnovZGQ7MXB8Zd96+AaGYQBB7Rhb9rSoqqpV2M1cyBsXRXz9AS1Fwug/Sg1c33HobCpaTOVY3zsziRkjuE05vW0I+ynS7/aO+/L5cAKZZ2lfrTxBzh+BJAOmGpEpG7ggI3jXTny4vTIoAc3V2ulW7AVH35WLTskjA6H3msG96ptKxFfIZXWnkC9p0iTNkRQTdhrxbWSedPPXzGAKuwxHOvScAdoaQhYBNHA7BSNwh/aEaqAt6HdaMjxTb9+RLGtM128luQbrmYfD+RdSlLN1SbPvhCPRzsGAEq2Mf5Hh6j+3o9Fg== X-LD-Processed: 710a03f5-10f6-4d38-9ff4-a80b81da590d,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; DM2PR03MB527; 20:jEhVoLb0QV1cCB8m9qzwADc/p62XfXdMma+ZUgA3HOAmAKTWdp1C1MWHz+HtF8aPCj/nwaEX4XZDGON1XWzBD8MBG9zEjskZbjW4b9aU3P40HrHzElYJtjDiMTI6E4jhgTT37ztqA37E55spJN5vU0T0l8D66YOt+0g1FVG64UkpDrJIlzul/a1gKmySE8fHCb1hX6XNlEBiPDIpucsxPDe9hK+YApTvg3hm8Sfx27lGMurjufrVaCFNumrvpfAp8AUcGAtYirmMGXasEoXmg0rJPf3km4XsmnlVG1rfNvPFd2kViRJ7IZev0mlI0sU2F5HbJQrNvXQ/phcuRnu+D51u3O0zlKQZ0HIPGw/C+pP+hCxIlGeT9YqBCzwYL0e8FA8/gqQzFSG1mdu83kq7BGVyOI2+teayNOkfwR44hZ+e1mbYmgKJwqdJaWhjpzs0pF/LCwrstzaFPbon4EFpE3mKufQbxRDWsuexl92Tt7iv4p7MaV6n2/lOMQ6O7Vfx8y709BTxek/iESHFcJTohUYuoDdrWqhfe1QrAXVuosOcgy+i7+1ifuPhoBU15l/a/sHrlH/miJsD0x98CqLkFSmi+gbsbrlB8gLTezaIiZY= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(13024025)(13023025)(13018025)(13017025)(13015025)(5005006)(8121501046)(10201501046)(3002001)(6055026); SRVR:DM2PR03MB527; BCL:0; PCL:0; RULEID:; SRVR:DM2PR03MB527; X-Microsoft-Exchange-Diagnostics: 1; DM2PR03MB527; 4:F9OoeV+17CGWOrau6Ix9wtdISPYhNc4qJCgQKZ1WetoJCk07GJByaz6T7A6+arYeS3DY3J5hai94aVN9AhxAhnidPsNKQZXV8GPiLz9J7hmLJZr98G+X12+eXnwPgDY1CPBzOiEATL3niQMLogkOcJnn9zRRLJKrqnF0eqwG7I9GyM5NoXD0d6k7Lff3VVSKytt0oSwAnpsLOzPq623bRYlD85nfK5XOuZhO8Y77ClZzaQqnRYoES5+O7EHHrelutPoEpLnHutTCXl7tAgyAHeacW4DJ0xvfjsuTtyzZyVxtUABVX0JOIDdNFlsdsSxRKESDhcC1xxVa+Bg4Cy6CUEMW7c/nTSw4RNv7yiMiZQsbscu39eS8mj84WNeYzWMg6j67GWpVoJeidG8MgEKRmNhhV/py2Ik49va3v8Umqdy1X9s9s4h136V3jsLpw6M/KcPeCYozjtHTFScVNsJgjRbprB9/6NtpePCE6Nmoaqg= X-Forefront-PRVS: 094700CA91 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR03MB527; 23:zMMAmTK47QJKEE7GKNYqZ/KyhmGceYNQQKXNwHKJNE?= =?us-ascii?Q?0MZi+S7x4jUFPJD/nwkDfSvToAURWh/euHxsErvv/2Z897TfpVvbAhnOC2th?= =?us-ascii?Q?vOWj6gxX/CVegTvgxCFFaQ3d1MfotTx7//1SdFoT5zSjN/eu0l5T3lbnkWBh?= =?us-ascii?Q?2ZWzLvA45ZntPAfc0BsFBW/WSgxeJw82B4B8d1j4gEzwkYAY6Pagcm6fE2r7?= =?us-ascii?Q?0mzBNfeT+S6pnhll8sNgaBCSbeQmvlESAnM3d1LDgFyvyJfIDa4VS0TSb7ge?= =?us-ascii?Q?0jrLusf00NV0WsSX85e42mCs481qmV0/klLu2qu09PD3meXYtZ6OvHvkA5/h?= =?us-ascii?Q?QqFooSndi4ee0sxjZjg7TszPZ5NKerIuv+pmqlhV/v1tMyPXBu4f8txP3Iju?= =?us-ascii?Q?nf9PsdIxhn8uJE9CQdtl7ATn5Iv+kxTfKHorp+hRIFOuhsAehCsPzTp7aG0r?= =?us-ascii?Q?o8ljdjAWIJMWDnEIH/ZVbTjmQb7/5pmrfZsg2qxIiiiY7lFiu6YmztLdSSUT?= =?us-ascii?Q?dQ8hH6sKGwDWB68ehf7A/9MBdmAYG/y/BXdMdPBgvLQsoedztj7EwOKQwDKh?= =?us-ascii?Q?LPPYBBDFiVzTE8nFrw5+efs9HqSSWAEKJgdyeiUJwCX19ZP1aSB2aoZZyvtr?= =?us-ascii?Q?d+PSWbAEKCifaYl77sw3em4AcMntQCO9jxrhHQnZyznwuGIBnp/S8ZUCJFs2?= =?us-ascii?Q?sRd8cqutCZQzTlcJCVGjOcdCAochsHlpYD2yIyXKXhgR9G2/qA/b2/zuI+ij?= =?us-ascii?Q?gctovqIQ1NSHCl6QBrmvQ/V9qL00COz+qS3p4DVrYm38i+c3hWXL2nRUatBT?= =?us-ascii?Q?M6HlvcXz65QyoYs5swLoPJ8T344W7NTd1XoDkw2sLDId5Hcw9oGFdVCr+QDM?= =?us-ascii?Q?/SS5GNgYre0Xmc3rX7BheWLe7M97bpHaDbeYnNdf30Z0ajafShNrEVfEw3VO?= =?us-ascii?Q?Zm9lskqjFdAs8en6UiNe4sg+hf6Sv9bZW5EEqtBI0hc1rNqxF3K2Wd8/s7NM?= =?us-ascii?Q?A6UWdXcGFXA2+H5idARcTMzz1Wgn20ExiJT7H8w9pLd3WwrHTpOphGiBfdEk?= =?us-ascii?Q?r8E3vS4dm8+hh2JmNm+CzdBcq0+cVk+wwHT1U0CmB7QBBqbOHvNO6xjlRXmI?= =?us-ascii?Q?jsnHBk3UduCNaLoBNuIynjjVqQk42pSWxoNM6qMsz08TocC/5uEA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR03MB527; 5:tTS9xld9+KptnGdj26/4R+G+IyPlD5e0r1/fbvbGB1DjZegC+m3jc3mmDfUlAqQtRPNqqecDfNM4IGGApp4pQFmdI7wmUCPADdEIrEi5aAg+4Yr8Yq+lbFr+zEfkxzU6AVpPJrrPzg97qRUkaO1Prg==; 24:lw05RCkB77Af09Qy2zm6jfgw8fwddTu6tg5SoNg4jprG3M6sahHJg8se2Xy3yUvWqTbpUhietyFY2aJW8ek472//VRMpY+m0NgKMXYF8l3E=; 7:Mk6MxID7ZS1x3M5DtRhb1ucS2F/+GCew81SO+zbve95yM/ICbiwi9GfxZpjwiRrDczouD2OkAglvvrdlyiBE4tG34gbRGrI39DU3ou9x3kmvPK3RkfqVLvVU92RwA7azeJKMpMm/qw3GDNOQdCmC1c5Ozo3pYcwoavLt+ngksiZ3eDd7MclmgB9sXHLjZTP1 SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 May 2016 08:36:07.6397 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR03MB527 Cc: jason.jin@nxp.com Subject: [U-Boot] [PATCH v2 1/2] armv8: Support loading 32-bit OS in AArch32 execution state X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" To support loading a 32-bit OS, the execution state will change from AArch64 to AArch32 when jumping to kernel. The architecture information will be got through checking FIT image, then U-Boot will load 32-bit OS or 64-bit OS automatically. Signed-off-by: Ebony Zhu Signed-off-by: Alison Wang Signed-off-by: Chenhui Zhao --- Changes in v2: - armv8_switch_to_el2_aarch32() is removed. armv8_switch_to_el2_m is used to switch to AArch64 EL2 or AArch32 Hyp. - armv8_switch_to_el1_aarch32() is removed. armv8_switch_to_el1_m is used to switch to AArch64 EL1 or AArch32 SVC. arch/arm/cpu/armv8/transition.S | 8 ++--- arch/arm/include/asm/macro.h | 80 +++++++++++++++++++++++++++++++++++++---- arch/arm/include/asm/system.h | 25 +++++++++++-- arch/arm/lib/bootm.c | 26 +++++++++++--- common/image-fit.c | 12 ++++++- 5 files changed, 133 insertions(+), 18 deletions(-) diff --git a/arch/arm/cpu/armv8/transition.S b/arch/arm/cpu/armv8/transition.S index 253a39b..9fa3b59 100644 --- a/arch/arm/cpu/armv8/transition.S +++ b/arch/arm/cpu/armv8/transition.S @@ -11,13 +11,13 @@ #include ENTRY(armv8_switch_to_el2) - switch_el x0, 1f, 0f, 0f + switch_el x4, 1f, 0f, 0f 0: ret -1: armv8_switch_to_el2_m x0 +1: armv8_switch_to_el2_m x0, x1, x2, x3, x4, x5, x6 ENDPROC(armv8_switch_to_el2) ENTRY(armv8_switch_to_el1) - switch_el x0, 0f, 1f, 0f + switch_el x4, 0f, 1f, 0f 0: ret -1: armv8_switch_to_el1_m x0, x1 +1: armv8_switch_to_el1_m x0, x1, x2, x3, x4, x5, x6 ENDPROC(armv8_switch_to_el1) diff --git a/arch/arm/include/asm/macro.h b/arch/arm/include/asm/macro.h index 9bb0efa..56d77f6 100644 --- a/arch/arm/include/asm/macro.h +++ b/arch/arm/include/asm/macro.h @@ -8,6 +8,9 @@ #ifndef __ASM_ARM_MACRO_H__ #define __ASM_ARM_MACRO_H__ + +#include + #ifdef __ASSEMBLY__ /* @@ -135,9 +138,20 @@ lr .req x30 #endif .endm -.macro armv8_switch_to_el2_m, xreg1 - /* 64bit EL2 | HCE | SMD | RES1 (Bits[5:4]) | Non-secure EL0/EL1 */ - mov \xreg1, #0x5b1 +.macro armv8_switch_to_el2_m, xreg1, xreg2, xreg3, xreg4, xreg5, xreg6, xreg7 + mov \xreg5, \xreg1 + mov \xreg6, \xreg2 + mov \xreg7, \xreg3 + + /* + * If the next lower exception level is AArch64, 64bit EL2 | HCE | SMD | + * RES1 (Bits[5:4]) | Non-secure EL0/EL1. If the next lower exception + * level is AArch32, 32bit EL2 | HCE | SMD | RES1 (Bits[5:4]) | + * Non-secure EL0/EL1. + */ + mov \xreg1, #0x1b1 + lsl \xreg2, \xreg4, #10 + orr \xreg1, \xreg1, \xreg2 msr scr_el3, \xreg1 msr cptr_el3, xzr /* Disable coprocessor traps to EL3 */ mov \xreg1, #0x33ff @@ -156,18 +170,46 @@ lr .req x30 movk \xreg1, #0x30C5, lsl #16 msr sctlr_el2, \xreg1 - /* Return to the EL2_SP2 mode from EL3 */ mov \xreg1, sp msr sp_el2, \xreg1 /* Migrate SP */ mrs \xreg1, vbar_el3 msr vbar_el2, \xreg1 /* Migrate VBAR */ + + /* Check switch to AArch64 EL2 or AArch32 Hypervisor mode */ + ldr \xreg1, =ES_TO_AARCH64 + cmp \xreg4, \xreg1 + b.eq 1f + b.ne 2f + +1: + /* Return to the EL2_SP2 mode from EL3 */ mov \xreg1, #0x3c9 msr spsr_el3, \xreg1 /* EL2_SP2 | D | A | I | F */ msr elr_el3, lr + + mov \xreg1, \xreg5 + mov \xreg2, \xreg6 + mov \xreg3, \xreg7 + eret + +2: + /* Return to AArch32 Hypervisor mode */ + mov \xreg1, #0x1da + msr spsr_el3, \xreg1 /* Hyp | D | A | I | F */ + msr elr_el3, \xreg5 + + mov \xreg1, #0 + mov \xreg2, \xreg6 + mov \xreg3, \xreg7 eret + .endm -.macro armv8_switch_to_el1_m, xreg1, xreg2 +.macro armv8_switch_to_el1_m, xreg1, xreg2, xreg3, xreg4, xreg5, xreg6, xreg7 + mov \xreg5, \xreg1 + mov \xreg6, \xreg2 + mov \xreg7, \xreg3 + /* Initialize Generic Timers */ mrs \xreg1, cnthctl_el2 orr \xreg1, \xreg1, #0x3 /* Enable EL1 access to timers */ @@ -188,7 +230,7 @@ lr .req x30 msr cpacr_el1, \xreg1 /* Enable FP/SIMD at EL1 */ /* Initialize HCR_EL2 */ - mov \xreg1, #(1 << 31) /* 64bit EL1 */ + lsl \xreg1, \xreg4, #31 orr \xreg1, \xreg1, #(1 << 29) /* Disable HVC */ msr hcr_el2, \xreg1 @@ -203,15 +245,39 @@ lr .req x30 movk \xreg1, #0x30d0, lsl #16 msr sctlr_el1, \xreg1 - /* Return to the EL1_SP1 mode from EL2 */ mov \xreg1, sp msr sp_el1, \xreg1 /* Migrate SP */ mrs \xreg1, vbar_el2 msr vbar_el1, \xreg1 /* Migrate VBAR */ + + /* Check switch to AArch64 EL1 or AArch32 Supervisor mode */ + ldr \xreg1, =ES_TO_AARCH64 + cmp \xreg4, \xreg1 + b.eq 1f + b.ne 2f + +1: + /* Return to the EL1_SP1 mode from EL2 */ mov \xreg1, #0x3c5 msr spsr_el2, \xreg1 /* EL1_SP1 | D | A | I | F */ msr elr_el2, lr + + mov \xreg1, \xreg5 + mov \xreg2, \xreg6 + mov \xreg3, \xreg7 + eret + +2: + /* Return to the Supervisor mode from EL2 */ + mov \xreg1, #0x1d3 + msr spsr_el2, \xreg1 /* Supervisor | D | A | I | F */ + msr elr_el2, \xreg5 + + mov \xreg1, #0 + mov \xreg2, \xreg6 + mov \xreg3, \xreg7 eret + .endm #if defined(CONFIG_GICV3) diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 9ae890a..fcfe3ae 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h @@ -17,6 +17,9 @@ #define CR_WXN (1 << 19) /* Write Permision Imply XN */ #define CR_EE (1 << 25) /* Exception (Big) Endian */ +#define ES_TO_AARCH64 1 +#define ES_TO_AARCH32 0 + #ifndef __ASSEMBLY__ u64 get_page_table_size(void); @@ -100,8 +103,26 @@ void __asm_invalidate_icache_all(void); int __asm_flush_l3_cache(void); void __asm_switch_ttbr(u64 new_ttbr); -void armv8_switch_to_el2(void); -void armv8_switch_to_el1(void); +/* + * Switch from EL3 to EL2 for ARMv8 + * + * @entry_point: kernel entry point + * @mach_nr: machine nr + * @fdt_addr: fdt address + * @es_flag: execution state flag, ES_TO_AARCH64 or ES_TO_AARCH32 + */ +void armv8_switch_to_el2(u64 entry_point, u64 mach_nr, u64 fdt_addr, + u64 es_flag); +/* + * Switch from EL2 to EL1 for ARMv8 + * + * @entry_point: kernel entry point + * @mach_nr: machine nr + * @fdt_addr: fdt address + * @es_flag: execution state flag, ES_TO_AARCH64 or ES_TO_AARCH32 + */ +void armv8_switch_to_el1(u64 entry_point, u64 mach_nr, u64 fdt_addr, + u64 es_flag); void gic_init(void); void gic_send_sgi(unsigned long sgino); void wait_for_wakeup(void); diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c index 0838d89..f6f685a 100644 --- a/arch/arm/lib/bootm.c +++ b/arch/arm/lib/bootm.c @@ -193,9 +193,9 @@ static void do_nonsec_virt_switch(void) { smp_kick_all_cpus(); dcache_disable(); /* flush cache before swtiching to EL2 */ - armv8_switch_to_el2(); + armv8_switch_to_el2(0, 0, 0, ES_TO_AARCH64); #ifdef CONFIG_ARMV8_SWITCH_TO_EL1 - armv8_switch_to_el1(); + armv8_switch_to_el1(0, 0, 0, ES_TO_AARCH64); #endif } #endif @@ -286,8 +286,26 @@ static void boot_jump_linux(bootm_headers_t *images, int flag) announce_and_cleanup(fake); if (!fake) { - do_nonsec_virt_switch(); - kernel_entry(images->ft_addr, NULL, NULL, NULL); + if ((IH_ARCH_DEFAULT == IH_ARCH_ARM64) && + (images->os.arch == IH_ARCH_ARM)) { + smp_kick_all_cpus(); + dcache_disable(); +#ifdef CONFIG_ARMV8_SWITCH_TO_EL1 + armv8_switch_to_el2(0, 0, 0, ES_TO_AARCH64); + armv8_switch_to_el1((u64)images->ep, + (u64)gd->bd->bi_arch_number, + (u64)images->ft_addr, + ES_TO_AARCH32); +#else + armv8_switch_to_el2((u64)images->ep, + (u64)gd->bd->bi_arch_number, + (u64)images->ft_addr, + ES_TO_AARCH32); +#endif + } else { + do_nonsec_virt_switch(); + kernel_entry(images->ft_addr, NULL, NULL, NULL); + } } #else unsigned long machid = gd->bd->bi_arch_number; diff --git a/common/image-fit.c b/common/image-fit.c index 25f8a11..2986469 100644 --- a/common/image-fit.c +++ b/common/image-fit.c @@ -1163,7 +1163,8 @@ int fit_image_check_arch(const void *fit, int noffset, uint8_t arch) if (fit_image_get_arch(fit, noffset, &image_arch)) return 0; return (arch == image_arch) || - (arch == IH_ARCH_I386 && image_arch == IH_ARCH_X86_64); + (arch == IH_ARCH_I386 && image_arch == IH_ARCH_X86_64) || + (arch == IH_ARCH_ARM64 && image_arch == IH_ARCH_ARM); } /** @@ -1586,6 +1587,9 @@ int fit_image_load(bootm_headers_t *images, ulong addr, int type_ok, os_ok; ulong load, data, len; uint8_t os; +#ifndef USE_HOSTCC + uint8_t os_arch; +#endif const char *prop_name; int ret; @@ -1669,6 +1673,12 @@ int fit_image_load(bootm_headers_t *images, ulong addr, return -ENOEXEC; } #endif + +#ifndef USE_HOSTCC + fit_image_get_arch(fit, noffset, &os_arch); + images->os.arch = os_arch; +#endif + if (image_type == IH_TYPE_FLATDT && !fit_image_check_comp(fit, noffset, IH_COMP_NONE)) { puts("FDT image is compressed");