Instead of having a single complicate test, let's first have a simple test than the existing two tests to make debugging easier. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- test/self/setjmp.c | 75 +++++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 21 deletions(-) diff --git a/test/self/setjmp.c b/test/self/setjmp.c index 1cbb44bdf941..deac584d736d 100644 --- a/test/self/setjmp.c +++ b/test/self/setjmp.c @@ -14,6 +14,29 @@ BSELFTEST_GLOBALS(); +static jmp_buf jbuf; + +static void test_setjmp_simple(void) +{ + total_tests++; + + pr_debug("%s: saving jmp_buf\n", __func__); + + switch (setjmp(jbuf)) { + case 0: + break; + case 42: + pr_debug("%s: returned from longjmp\n", __func__); + return; + default: + printf("%s: unexpected value from setjmp\n", __func__); + failed_tests++; + } + + pr_debug("%s: attempting longjmp\n", __func__); + longjmp(jbuf, 42); +} + static __noreturn void raise_longjmp(jmp_buf jbuf, int i, int n) { while (i < n) @@ -22,28 +45,8 @@ static __noreturn void raise_longjmp(jmp_buf jbuf, int i, int n) longjmp(jbuf, n); } -static jmp_buf jbuf; - -static void __noreturn initjmp_entry(void) +static void test_setjmp_loop(void) { - volatile u32 arr[256]; - int i; - - for (i = 0; i < ARRAY_SIZE(arr); i++) - writel(i, &arr[i]); - - /* ensure arr[] is allocated on stack */ - OPTIMIZER_HIDE_VAR(i); - if (i == 0) - initjmp_entry(); - - longjmp(jbuf, 0x1337); -} - -static void test_setjmp(void) -{ - void *stack; - jmp_buf ijbuf; volatile int i; int ret; @@ -71,6 +74,29 @@ static void test_setjmp(void) failed_tests++; } +} + +static void __noreturn initjmp_entry(void) +{ + volatile u32 arr[256]; + int i; + + for (i = 0; i < ARRAY_SIZE(arr); i++) + writel(i, &arr[i]); + + /* ensure arr[] is allocated on stack */ + OPTIMIZER_HIDE_VAR(i); + if (i == 0) + initjmp_entry(); + + longjmp(jbuf, 0x1337); +} + +static void test_initjmp(void) +{ + void *stack; + jmp_buf ijbuf; + stack = memalign(16, CONFIG_STACK_SIZE); if (WARN_ON(!stack)) { skipped_tests++; @@ -95,4 +121,11 @@ static void test_setjmp(void) free(stack); } + +static void test_setjmp(void) +{ + test_setjmp_simple(); + test_setjmp_loop(); + test_initjmp(); +} bselftest(core, test_setjmp); -- 2.39.5