From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexander Graf Date: Fri, 15 Jun 2018 14:01:03 +0200 Subject: [U-Boot] [PATCH v4 05/16] sandbox: Add a setjmp() implementation In-Reply-To: <20180516154233.21457-6-sjg@chromium.org> References: <20180516154233.21457-1-sjg@chromium.org> <20180516154233.21457-6-sjg@chromium.org> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 16.05.18 17:42, Simon Glass wrote: > Add an implementation of setjmp() and longjmp() which rely on the > underlying host C library. Since we cannot know how large the jump buffer > needs to be, pick something that should be suitable and check it at > runtime. At present we need access to the underlying struct as well. > > Signed-off-by: Simon Glass > --- > > Changes in v4: > - Fix up the sizeof() operations on jmp_buf > - Update SPDX tags > > Changes in v3: None > Changes in v2: None > > arch/sandbox/cpu/cpu.c | 13 +++++++++++++ > arch/sandbox/cpu/os.c | 23 +++++++++++++++++++++++ > arch/sandbox/include/asm/setjmp.h | 30 ++++++++++++++++++++++++++++++ > include/os.h | 21 +++++++++++++++++++++ > 4 files changed, 87 insertions(+) > create mode 100644 arch/sandbox/include/asm/setjmp.h > > diff --git a/arch/sandbox/cpu/cpu.c b/arch/sandbox/cpu/cpu.c > index d4ad020012e..cde0b055a67 100644 > --- a/arch/sandbox/cpu/cpu.c > +++ b/arch/sandbox/cpu/cpu.c > @@ -9,6 +9,7 @@ > #include > #include > #include > +#include > #include > #include > > @@ -164,3 +165,15 @@ ulong timer_get_boot_us(void) > > return (count - base_count) / 1000; > } > + > +int setjmp(jmp_buf jmp) > +{ > + return os_setjmp((ulong *)jmp, sizeof(*jmp)); So, this doesn't work. Function returns increase the stack pointer which means after setjmp() you are not allowed to return until the longjmp occured. The documentation is quite clear about this: DESCRIPTION setjmp() and longjmp(3) are useful for dealing with errors and interrupts encountered in a low-level subroutine of a program. setjmp() saves the stack context/environment in env for later use by longjmp(3). The stack context will be invalidated if the function which called setjmp() returns. So we need to find a way to call setjmp() directly from the code point where we want to call it, rather than jump through helper functions, as these break its functionality. Also, os_longjmp() is broken. It calls longjmp() which however is not the system longjmp, but the U-Boot internal one that again calls os_longjmp. My quick fix was to make it call _longjmp() instead - that at least makes that part work. Alex