From patchwork Fri Jun 22 12:44:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Graf X-Patchwork-Id: 139615 Delivered-To: patch@linaro.org Received: by 2002:a2e:970d:0:0:0:0:0 with SMTP id r13-v6csp833041lji; Fri, 22 Jun 2018 05:48:13 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJSmgAbea5M1ipKDRVoF68cxtoyMLIe4we/jLbFnjKUckNSFX5EsoDmChUG12OV1IWZ7EKE X-Received: by 2002:a50:dac9:: with SMTP id s9-v6mr1706742edj.241.1529671693333; Fri, 22 Jun 2018 05:48:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529671693; cv=none; d=google.com; s=arc-20160816; b=wS0N3elnYl0g6HAGk6xm0XpDPgg3fADDOKmg2hidv17XnGX1F8xWdHNzUYZBuPv37q Lg0qXmWihZovUZbgscrR8rQVdAYiIuAIpAGaaVXomPNgMXEC+kRHEhNcQvx9XYELmt67 J2RWO95h8pXrYbmC2d2N+ezc8QDWsYXJuRhjPckFjIIhjhwYU/XYapbuJLj52DdzM0Pv QAObuKFuvA0qTYvEaLL7ZkNMHSpXU9/CBM1Enreb0sks3aY45Fl1zqly8qzApCFckBRX Y5v2xPkdQJtznw3zxeBbz9MgaEVlwj5Qna/VPbGFssym81X0CcVK/DK8Yf5DTSxIVgId fKgQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:cc:references:in-reply-to:message-id :date:to:from:arc-authentication-results; bh=WZ8HzTa6kASv5WX3oY8Zycp+1E+QnitDzSSQWNJm6tc=; b=qYKSkIdhz+Job0PcjtPr3aDDccWmuNOXll2OwZUu9VM0brDPLCRWq5GkbK5ggZgGkf sHnrDArPJZYTSiRe8e/qazKjyKhdttb7xCqOmBNJYEIikmeA9AMNRqfK9pLcEWpy01Wn 6gbptIeEoHOjot8bG5rnA3aJq3bdSfdxQvO1fOpWHttjA/q0U/s7kq4PXRhuJTKFuWb7 vpwQa+iclNzoH/c6tsVkN2J2PCfEXOqjb2gByrvofLEEANyEN6IcN+lnI7598BH7dpho FYq2L1C/21/2bDm/nvK3Q18bbyyF6SnrwhGvElZiGfZ4oW9tHihMHf5EpWIPWcAAXtJY TTgQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de Return-Path: Received: from lists.denx.de (dione.denx.de. [81.169.180.215]) by mx.google.com with ESMTP id m3-v6si827780eda.90.2018.06.22.05.48.13; Fri, 22 Jun 2018 05:48:13 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) client-ip=81.169.180.215; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of u-boot-bounces@lists.denx.de designates 81.169.180.215 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de Received: by lists.denx.de (Postfix, from userid 105) id F1B27C21F6E; Fri, 22 Jun 2018 12:45:56 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 45EABC21FB0; Fri, 22 Jun 2018 12:44:26 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 5C3CCC21C57; Fri, 22 Jun 2018 12:44:21 +0000 (UTC) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by lists.denx.de (Postfix) with ESMTPS id AE25FC21E3A for ; Fri, 22 Jun 2018 12:44:20 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext-too.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id E05C6AE9A; Fri, 22 Jun 2018 12:44:19 +0000 (UTC) From: Alexander Graf To: u-boot@lists.denx.de Date: Fri, 22 Jun 2018 14:44:12 +0200 Message-Id: <20180622124418.52892-5-agraf@suse.de> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20180622124418.52892-1-agraf@suse.de> References: <20180622124418.52892-1-agraf@suse.de> Cc: Heinrich Schuchardt , Andy Shevchenko Subject: [U-Boot] [PATCH v5 04/10] sandbox: Fix setjmp/longjmp X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" In sandbox, longjmp returns to itself in an endless loop because os_longjmp() calls into longjmp() which is provided by U-Boot which again calls os_longjmp(). Setjmp on the other hand must not return because otherwise the return freees up stack elements that we need during longjmp(). The only straight forward fix that doesn't involve nasty hacks I could find is to directly link against the system setjmp/longjmp implementations. That means we just provide the compiler with hints that the symbol will be available and actually fill them out with versions from libc. This approach should be reasonably platform agnostic Signed-off-by: Alexander Graf Reviewed-by: Simon Glass --- v4 -> v5: - Use system setjmp/longjmp directly from target code --- arch/sandbox/cpu/cpu.c | 12 ------------ arch/sandbox/cpu/os.c | 22 ---------------------- arch/sandbox/include/asm/setjmp.h | 5 +++++ include/os.h | 21 --------------------- 4 files changed, 5 insertions(+), 55 deletions(-) diff --git a/arch/sandbox/cpu/cpu.c b/arch/sandbox/cpu/cpu.c index cde0b055a6..e7d3c272a4 100644 --- a/arch/sandbox/cpu/cpu.c +++ b/arch/sandbox/cpu/cpu.c @@ -165,15 +165,3 @@ ulong timer_get_boot_us(void) return (count - base_count) / 1000; } - -int setjmp(jmp_buf jmp) -{ - return os_setjmp((ulong *)jmp, sizeof(*jmp)); -} - -void longjmp(jmp_buf jmp, int ret) -{ - os_longjmp((ulong *)jmp, ret); - while (1) - ; -} diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c index 5839932b00..fc2f9dbc7a 100644 --- a/arch/sandbox/cpu/os.c +++ b/arch/sandbox/cpu/os.c @@ -629,25 +629,3 @@ void os_localtime(struct rtc_time *rt) rt->tm_yday = tm->tm_yday; rt->tm_isdst = tm->tm_isdst; } - -int os_setjmp(ulong *jmp, int size) -{ - jmp_buf dummy; - - /* - * We cannot rely on the struct name that jmp_buf uses, so use a - * local variable here - */ - if (size < sizeof(dummy)) { - printf("setjmp: jmpbuf is too small (%d bytes, need %d)\n", - size, sizeof(jmp_buf)); - return -ENOSPC; - } - - return setjmp((struct __jmp_buf_tag *)jmp); -} - -void os_longjmp(ulong *jmp, int ret) -{ - longjmp((struct __jmp_buf_tag *)jmp, ret); -} diff --git a/arch/sandbox/include/asm/setjmp.h b/arch/sandbox/include/asm/setjmp.h index 1fe37c91cc..001c7ea322 100644 --- a/arch/sandbox/include/asm/setjmp.h +++ b/arch/sandbox/include/asm/setjmp.h @@ -24,6 +24,11 @@ struct jmp_buf_data { typedef struct jmp_buf_data jmp_buf[1]; +/* + * We have to directly link with the system versions of + * setjmp/longjmp, because setjmp must not return as otherwise + * the stack may become invalid. + */ int setjmp(jmp_buf jmp); __noreturn void longjmp(jmp_buf jmp, int ret); diff --git a/include/os.h b/include/os.h index c8e0f52d30..64e89a06c9 100644 --- a/include/os.h +++ b/include/os.h @@ -330,25 +330,4 @@ int os_spl_to_uboot(const char *fname); */ void os_localtime(struct rtc_time *rt); -/** - * os_setjmp() - Call setjmp() - * - * Call the host system's setjmp() function. - * - * @jmp: Buffer to store current execution state - * @size: Size of buffer - * @return normal setjmp() value if OK, -ENOSPC if @size is too small - */ -int os_setjmp(ulong *jmp, int size); - -/** - * os_longjmp() - Call longjmp() - * - * Call the host system's longjmp() function. - * - * @jmp: Buffer where previous execution state was stored - * @ret: Value to pass to longjmp() - */ -void os_longjmp(ulong *jmp, int ret); - #endif