From patchwork Sat Sep 26 06:51:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1371706 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=HZqDWATi; 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 4Byzx943hxz9sSJ for ; Sat, 26 Sep 2020 16:52:19 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 3D23482359; Sat, 26 Sep 2020 08:52:10 +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="HZqDWATi"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 804988240C; Sat, 26 Sep 2020 08:52:08 +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.17.20]) (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 E4C6482358 for ; Sat, 26 Sep 2020 08:52:05 +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=1601103110; bh=U/kIeoDbuCrjhUmx+7eJ/Qwacye+sqIeebyMDks3dMA=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date; b=HZqDWATijc6NLKEjjrl7W1bcS+ZsHAzt25+72dZXAPvfC5tzM9znvq2UaAYRE9fBs IgEzA3Tf288azsFOKAYn2CCzoeiR8gQ6YGzwY9AUg28veal67l1Jsi/h63ERm1HKXZ qS8SgCe2inRX+DUpZ+4Z89nA9BxQHz5WH7Kp4qbw= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([178.202.41.107]) by mail.gmx.com (mrgmx104 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MK3Rm-1k0YOm1iJC-00LV9i; Sat, 26 Sep 2020 08:51:50 +0200 From: Heinrich Schuchardt To: Rick Chen Cc: Simon Glass , Sean Anderson , Bin Meng , u-boot@lists.denx.de, Alexander Graf , Heinrich Schuchardt , Abner Chang Subject: [PATCH 1/1] riscv: restore global data pointer in trap handler Date: Sat, 26 Sep 2020 08:51:39 +0200 Message-Id: <20200926065139.25331-1-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 X-Provags-ID: V03:K1:mOqtXW+et/JgifFs/wcn+e5isTiwBCyNYBjGBkMKk+LXEivagCV lIn7XTPYOUbtHzHxJkpQyjqT4o2uqS2dwAQnPNDDr6jcPMRVpRMV8u+T2X8JWI5SBYWhiuW Mo+HqeVM8RnhrWJUhsuJ5S+/4o0Y0N0+LibaqiW5IlT/+sp97mm+i2Pt2/KHUVR2Ox4zWQx qhd/5GBsX3CK7IyPiiXHA== X-UI-Out-Filterresults: notjunk:1;V03:K0:CJxDlkmLsrA=:tctV1qyREPlH79bOEnEDqS RdnoQvmFjAhRmyAfCMtAEQm/XyVZ6uWh1+NGZvBIXxk6GT+Ew9kaE+Dnj9pedkzMwmPQjB7z6 CzOyJvU3zZYV0TPbU3B0oIrvmPF7qgVj/rploPo3pXTQH6Fu74P1QutNOJtkbDE2DRED5gqFW YxU0wFnHMCPMS5xmaGFk1zW1hZHggcfOYKWJY/qdoOeEKTHTzCNY5YUXtH2gaEa4Ub4k0Lfws QUwpzF/pWHD8IGttwZrG2DQSQprdHVgFnLWY16JUCz3nN/aGTm1AXGrzzPEI75/WWhZzDmVZo ZocIgWnL5wG+LxuQ/WhE9wFa5clMx0hPnC12UiMVxXxPAGOQLk5Gm5TGLeVxqXrb0hKvpnk0R MrnRFx8Uu8Uc9XY930xb/ccLDadCgEIJ3ujMmo2U1AdHDokf622dkT1Am+NkGjZDk3J5lYpBX 1NTd/Vp2Gdi16GVXiQqZykGSjgAI+HQ8SRRpH+tpTE6zUujxrkcvh1JJ7L/V2XGkOlIKl0/+Q oUxAxo+RWgbAWV8NnaPgF4uz6N6/fioypIP/uMcpfrNTRr4ysjuc/WA3JjDuoGJunl7loAdrH MWEMP/b0dFtVeggiSQLNlSVffk2Pn5OjO8kqrVW2Hvh0WLpnAikx02aK5RBxOk9kMixrtrk1A NMnNPHE2Uz6wCT28C1/bSFQEHH2/P/hFSa4zcIN7FwDtOWRLx+K9kb51xWBrpVnFM2d/k5gre JyCKvM54PS8+ZI9UH9kTmVavhcrU6YObiK3B38YGxSEMPUY6LYpTHiAskP+eVTGbLMnaxEQyK pIwrX6VdB7Qp3Jkvr9rWc1IgLDd7C9AiVE9hRRWPPnHcKV88EFVVprFNEI8QbNTVaRxRtNsfa HPlUsbwxa3QSenTVH85w1flTGBHnxQ6U2abImUNJBUA4VXLP6Pwf1epDsA4jhXZseWIGtDf7G CcmYBLYnW/HMLIZ/23xaf62E7MVpsB/tmjb/tq8BjdoPtEJ1o1c8M2AFmhZ2Zj1wkQFPcenAx erna6QYQe9Xe44uR76U3X8MeUdnC0Q0RXehVPQw3ZxRzdCAIVUr7lcKPxPElkSSL96E06gUg5 lYfL2UX2QS7TaMT2UiWKJ38jJtE7uqF0HuI+Kh/rso5f8iNSMrfn6B7PYzgjr5tifK5rcE3n5 BOIsOqEp5Y+l7gYCDmiujzPtA2Y+YTfM499oQfj9l6A28Y8JdYiEN+am05LK3VVBwYVRa9Vcf sGpQAFUb+2ctr+iW13D5ydAjoqGdjKsCoY/9fNA== 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 --- arch/riscv/lib/interrupts.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) -- 2.28.0 diff --git a/arch/riscv/lib/interrupts.c b/arch/riscv/lib/interrupts.c index cd47e64487..11505c8655 100644 --- a/arch/riscv/lib/interrupts.c +++ b/arch/riscv/lib/interrupts.c @@ -110,6 +110,16 @@ int disable_interrupts(void) ulong handle_trap(ulong cause, ulong epc, ulong tval, struct pt_regs *regs) { ulong is_irq, irq; + volatile gd_t *caller_gd; + + /* + * An UEFI application may have changed gd. + * Save the caller's gd. Restore U-Boot's gd. + */ + if (CONFIG_IS_ENABLED(EFI_LOADER)) { + caller_gd = gd; + efi_restore_gd(); + } is_irq = (cause & MCAUSE_INT); irq = (cause & ~MCAUSE_INT); @@ -132,6 +142,9 @@ ulong handle_trap(ulong cause, ulong epc, ulong tval, struct pt_regs *regs) _exit_trap(cause, epc, tval, regs); } + if (CONFIG_IS_ENABLED(EFI_LOADER)) + set_gd(caller_gd); + return epc; }