From patchwork Sun Sep 27 08:24:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1371972 X-Patchwork-Delegate: uboot@andestech.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=ApH7pv53; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BzdxV5ftJz9sSs for ; Sun, 27 Sep 2020 18:24:53 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 0A0E782377; Sun, 27 Sep 2020 10:24:47 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="ApH7pv53"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 20E318237D; Sun, 27 Sep 2020 10:24:46 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FROM,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id A75B8821ED for ; Sun, 27 Sep 2020 10:24:43 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1601195065; bh=QvLmkAnxdr6CwXI1dOkEGgQgcjKFia4j9Qae/3p2d/8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date; b=ApH7pv53YLiduY+2DYyBGCeIiVj0ad5oOLKUkwPrmNasHOamOiGNFf39w1SIISwwW yleg3XdumYQp7A8H2fwB9UpYF0X7TFSxQzVMccjIfA+CEbuikp4gN2HEtaQi9giRst 5T7VvK4eiCkQKD02YA+1qYnm2BAR0lt1EjX9xR18= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([178.202.41.107]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1M9nxn-1kJRIy1n9h-005n3x; Sun, 27 Sep 2020 10:24:25 +0200 From: Heinrich Schuchardt To: Rick Chen Cc: Simon Glass , Sean Anderson , Bin Meng , u-boot@lists.denx.de, Alexander Graf , Abner Chang , Heinrich Schuchardt Subject: [PATCH v2 1/1] riscv: restore global data pointer in trap handler Date: Sun, 27 Sep 2020 10:24:11 +0200 Message-Id: <20200927082411.30177-1-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 X-Provags-ID: V03:K1:H3q8QhaEaOVOSIZxjlJGQP1vs0prv+lR51QDiiyZyLwqLhzIQWL 1F2MOvpRfmrJ8CbNgj1SUE4l5Lhj0LvqkPVhNXwxRMi9/u68u+cJBE/VJ7TGvwaver8LflZ 7jzAsM8mvxoCwPWG71VedYFC9RXrOccmuSd72enWKYZsn83h1BGeNCfCkZSlGBFEvkzIGY4 KaaoSlV2PEsp2MhODCxTg== X-UI-Out-Filterresults: notjunk:1;V03:K0:mTmQoIl+ev8=:ZGNb1qCfCd+14jt85nMMgV BjocjP2D28v3cel94Mkkaf0nDZKHLdF/8oAMJjKY0YpForNXWkg8SoAITsTOBacKNdcjQ0hJj yFN0LPMF+TZbNEKFbPtJrjoW+dz+9o9X7sB1gfNI5W60xvG6p5aVO4qhiJmFSeI4ypmnRT0Qv +8dsyg2Gn5UO0ValNv6PjStBsNlS3DDKwRsEbkBoeuzWrlh/cufNryXf30TTnJKwluuo1R9K3 pcWG6+1Cdrzd9Z3cvrSnYG413ouuXQ2iG2qQ2OaRwRuUEv7nDeeudYO08kxLcA/zx2ckiJOot f0bhU2Va/bU2z6N4aMg+yUuaqcLaXYjpbl9kL7Iv1ZXfz/OB02KEp5w20XTotc3qK1icTdogA Y1duH3qm+OuonRxRJOpuJgXV3uIqtzJFG85YChPkw9ZMSDTaJE+kD/iSBJDYUdiUOLGwLlKVQ zYamRqQFAPvf8hMH8T0a1Y7ia/mnnyerTwMEDOEoiWV0tNKJC68eeb2YGxQohALt//keJLXzW p1U0b2oUlHCA6R/g446MNO3bcHaan8xeZV3xb6mxYt3hKmsJLZD1JTne/6HO4FUoKzXCdmD1e 7ANvsGEp8jo1DVJ1GtHMuSMyIT8S26Xa1585087l4lq8en5wwdr7fp1DXkJOnjSXLfTh5HqwJ xLGMy51/V03mAwVrP/nAVDlPq1ToXfm3dybVqOdnT+tiEzn+zQ6aIOnyn79tYjIiLZYM0hkXG S1Ky0V8YltoLN7XZYjB+EcQPYMhrDUPV28z8YN8J1uj3xDCtoBHTeD9G/D/NnF1haSjGMAw8K hXvxkcc2yKUbkWGKiuHyWfMqusZWbbVgatBqwNyC8hH/Irz+2mzBuL3WliXplx82p2e0Kiyan dGuF+D1iitzJVRe9ieVvLai3yv9Ry//kEV/zDhoD6Mg40sw6oL8FkgyN+wi6XtFm0E2tL9GXe ZqaEwWjfKmbeR5rXnoErnrFkX4TRb8AYPxxV2PnAk6SwF4TvlyxE1mbSn5P33jHcGGkttr1rt zXwM/ExnyFoJPIDYgUo7lD7YoN0100HafvOMSMhVsuBb+xNL6lmhEqPDUurSvUU2sv2px0Z2A 1j3RmKg1UfhPxIw4UWXTLCcwYzGUtcgR43U4hBN2OJ13snwv7KjBCsgCr4zdqRSMFwS1AcXqc 2pvh4sEsqrEDnwshAXGzwcBx+lURapv5x3irt8Ny6MrQ/KkK4VWTwnvnq2obMvsxD0s0piZaV Ppb2aZjTARxAGZxbONrzvPeg0BEUhVtlhYq8q3g== X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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" X-Virus-Scanned: clamav-milter 0.102.3 at phobos.denx.de X-Virus-Status: Clean The gp register is used to store U-Boot's global data pointer. We should not assume that an UEFI application leaves the gp register unchanged as the UEFI specifications does not define who is the owner of the gp and tp registers. So the following sequence should be followed in the trap handler: * save the caller's gp register * restore the global data pointer * serve interrupts or print crash dump and reset * restore the caller's gp register Cc: Abner Chang Signed-off-by: Heinrich Schuchardt Reviewed-by: Bin Meng Reviewed-by: Rick Chen --- v2: Saving and restoring the caller's x3 is already handled in mtrap.S. efi_loader.h provides an empty fallback efi_restore_gd() function if CONFIG_EFI_LOADER=n. --- arch/riscv/lib/interrupts.c | 3 +++ 1 file changed, 3 insertions(+) -- 2.28.0 diff --git a/arch/riscv/lib/interrupts.c b/arch/riscv/lib/interrupts.c index cd47e64487..8ff40f0f36 100644 --- a/arch/riscv/lib/interrupts.c +++ b/arch/riscv/lib/interrupts.c @@ -111,6 +111,9 @@ ulong handle_trap(ulong cause, ulong epc, ulong tval, struct pt_regs *regs) { ulong is_irq, irq; + /* An UEFI application may have changed gd. Restore U-Boot's gd. */ + efi_restore_gd(); + is_irq = (cause & MCAUSE_INT); irq = (cause & ~MCAUSE_INT);