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 <s...@chromium.org> > --- > > 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 <linux/libfdt.h> > #include <os.h> > #include <asm/io.h> > +#include <asm/setjmp.h> > #include <asm/state.h> > #include <dm/root.h> > > @@ -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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot